| ... | ... |
@@ -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: |