Browse code

Merge pull request #5707 from vieux/fix_event_removal

fix event removal

Michael Crosby authored on 2014/05/13 10:59:42
Showing 1 changed files
... ...
@@ -198,6 +198,15 @@ func (srv *Server) ContainerKill(job *engine.Job) engine.Status {
198 198
 	return engine.StatusOK
199 199
 }
200 200
 
201
+func (srv *Server) EvictListener(from string) {
202
+	srv.Lock()
203
+	if old, ok := srv.listeners[from]; ok {
204
+		delete(srv.listeners, from)
205
+		close(old)
206
+	}
207
+	srv.Unlock()
208
+}
209
+
201 210
 func (srv *Server) Events(job *engine.Job) engine.Status {
202 211
 	if len(job.Args) != 1 {
203 212
 		return job.Errorf("Usage: %s FROM", job.Name)
... ...
@@ -215,15 +224,7 @@ func (srv *Server) Events(job *engine.Job) engine.Status {
215 215
 			return fmt.Errorf("JSON error")
216 216
 		}
217 217
 		_, err = job.Stdout.Write(b)
218
-		if err != nil {
219
-			// On error, evict the listener
220
-			utils.Errorf("%s", err)
221
-			srv.Lock()
222
-			delete(srv.listeners, from)
223
-			srv.Unlock()
224
-			return err
225
-		}
226
-		return nil
218
+		return err
227 219
 	}
228 220
 
229 221
 	listener := make(chan utils.JSONMessage)
... ...
@@ -244,8 +245,9 @@ func (srv *Server) Events(job *engine.Job) engine.Status {
244 244
 					continue
245 245
 				}
246 246
 				if err != nil {
247
-					job.Error(err)
248
-					return engine.StatusErr
247
+					// On error, evict the listener
248
+					srv.EvictListener(from)
249
+					return job.Error(err)
249 250
 				}
250 251
 			}
251 252
 		}
... ...
@@ -263,6 +265,8 @@ func (srv *Server) Events(job *engine.Job) engine.Status {
263 263
 				continue
264 264
 			}
265 265
 			if err != nil {
266
+				// On error, evict the listener
267
+				srv.EvictListener(from)
266 268
 				return job.Error(err)
267 269
 			}
268 270
 		case <-timeout.C: