From 08e9db900a9bf0688b6c430de5abe57c715494ee Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 16 Mar 2016 09:23:32 +0000 Subject: [PATCH] Retry docker event subscription --- common/docker/client.go | 42 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/common/docker/client.go b/common/docker/client.go index dabf3aec..8dcec712 100644 --- a/common/docker/client.go +++ b/common/docker/client.go @@ -4,12 +4,18 @@ import ( "errors" "fmt" "strings" + "time" docker "github.com/fsouza/go-dockerclient" . "github.com/weaveworks/weave/common" ) +const ( + InitialInterval = 1 * time.Second + MaxInterval = 60 * time.Second +) + // An observer for container events type ContainerObserver interface { ContainerStarted(ident string) @@ -72,21 +78,29 @@ func (c *Client) Info() string { // AddObserver adds an observer for docker events func (c *Client) AddObserver(ob ContainerObserver) error { - events := make(chan *docker.APIEvents) - if err := c.AddEventListener(events); err != nil { - Log.Errorf("[docker] Unable to add listener to Docker API: %s", err) - return err - } - go func() { - for event := range events { - switch event.Status { - case "start": - id := event.ID - ob.ContainerStarted(id) - case "die": - id := event.ID - ob.ContainerDied(id) + retryInterval := InitialInterval + for { + events := make(chan *docker.APIEvents) + if err := c.AddEventListener(events); err != nil { + Log.Errorf("[docker] Unable to add listener to Docker API: %s - retrying in %ds", err, retryInterval/time.Second) + } else { + for event := range events { + switch event.Status { + case "start": + id := event.ID + ob.ContainerStarted(id) + case "die": + id := event.ID + ob.ContainerDied(id) + } + } + Log.Errorf("[docker] Event listener channel closed - retrying subscription in %ds", retryInterval/time.Second) + } + time.Sleep(retryInterval) + retryInterval = retryInterval * 3 / 2 + if retryInterval > MaxInterval { + retryInterval = MaxInterval } } }()