From 1be46e7e5860760fadbd83ed59f1dfc73b01cffa Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 29 Jan 2016 07:54:33 -0800 Subject: [PATCH] retry monitor events on EOF Signed-off-by: Victor Vieux --- cluster/engine.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/cluster/engine.go b/cluster/engine.go index c9275c9674..5ec081781b 100644 --- a/cluster/engine.go +++ b/cluster/engine.go @@ -153,6 +153,23 @@ func (e *Engine) Connect(config *tls.Config) error { return e.ConnectWithClient(c) } +// StartMonitorEvents monitors events from the engine +func (e *Engine) StartMonitorEvents() { + log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Debug("Start monitoring events") + ec := make(chan error) + e.client.StartMonitorEvents(e.handler, ec) + + go func() { + if err := <-ec; err != nil && err.Error() != "EOF" { + log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Errorf("Error monitoring events: %s", err) + } else if err != nil { + log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Debug("EOF monitoring events, restarting") + e.StartMonitorEvents() + } + close(ec) + }() +} + // ConnectWithClient is exported func (e *Engine) ConnectWithClient(client dockerclient.Client) error { e.client = client @@ -162,8 +179,7 @@ func (e *Engine) ConnectWithClient(client dockerclient.Client) error { return err } - // Start monitoring events from the engine. - e.client.StartMonitorEvents(e.handler, nil) + e.StartMonitorEvents() // Force a state update before returning. if err := e.RefreshContainers(true); err != nil { @@ -607,7 +623,7 @@ func (e *Engine) refreshLoop() { continue } e.client.StopAllMonitorEvents() - e.client.StartMonitorEvents(e.handler, nil) + e.StartMonitorEvents() } err = e.RefreshContainers(false)