From 3712225f957fe413feef724f4ea1fd2ab74f2dfb Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 9 May 2014 18:48:55 +0000 Subject: [PATCH] fix event removal Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) Upstream-commit: 670564d07096c190011bf7adf74afe4d61ef9720 Component: engine --- components/engine/server/server.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/components/engine/server/server.go b/components/engine/server/server.go index 30e5ef1f6f..3c3b0b4c42 100644 --- a/components/engine/server/server.go +++ b/components/engine/server/server.go @@ -195,6 +195,15 @@ func (srv *Server) ContainerKill(job *engine.Job) engine.Status { return engine.StatusOK } +func (srv *Server) EvictListener(from string) { + srv.Lock() + if old, ok := srv.listeners[from]; ok { + delete(srv.listeners, from) + close(old) + } + srv.Unlock() +} + func (srv *Server) Events(job *engine.Job) engine.Status { if len(job.Args) != 1 { return job.Errorf("Usage: %s FROM", job.Name) @@ -212,15 +221,7 @@ func (srv *Server) Events(job *engine.Job) engine.Status { return fmt.Errorf("JSON error") } _, err = job.Stdout.Write(b) - if err != nil { - // On error, evict the listener - utils.Errorf("%s", err) - srv.Lock() - delete(srv.listeners, from) - srv.Unlock() - return err - } - return nil + return err } listener := make(chan utils.JSONMessage) @@ -241,8 +242,9 @@ func (srv *Server) Events(job *engine.Job) engine.Status { continue } if err != nil { - job.Error(err) - return engine.StatusErr + // On error, evict the listener + srv.EvictListener(from) + return job.Error(err) } } } @@ -260,6 +262,8 @@ func (srv *Server) Events(job *engine.Job) engine.Status { continue } if err != nil { + // On error, evict the listener + srv.EvictListener(from) return job.Error(err) } case <-timeout.C: