| package daemon |
| |
| import ( |
| "time" |
| |
| log "github.com/Sirupsen/logrus" |
| "github.com/docker/docker/pkg/discovery" |
| |
| // Register the libkv backends for discovery. |
| _ "github.com/docker/docker/pkg/discovery/kv" |
| ) |
| |
| const ( |
| // defaultDiscoveryHeartbeat is the default value for discovery heartbeat interval. |
| defaultDiscoveryHeartbeat = 20 * time.Second |
| |
| // defaultDiscoveryTTL is the default TTL interface for discovery. |
| defaultDiscoveryTTL = 60 * time.Second |
| ) |
| |
| // initDiscovery initialized the nodes discovery subsystem by connecting to the specified backend |
| // and start a registration loop to advertise the current node under the specified address. |
| func initDiscovery(backend, address string, clusterOpts map[string]string) (discovery.Backend, error) { |
| var ( |
| discoveryBackend discovery.Backend |
| err error |
| ) |
| if discoveryBackend, err = discovery.New(backend, defaultDiscoveryHeartbeat, defaultDiscoveryTTL, clusterOpts); err != nil { |
| return nil, err |
| } |
| |
| // We call Register() on the discovery backend in a loop for the whole lifetime of the daemon, |
| // but we never actually Watch() for nodes appearing and disappearing for the moment. |
| go registrationLoop(discoveryBackend, address) |
| return discoveryBackend, nil |
| } |
| |
| // registrationLoop registers the current node against the discovery backend using the specified |
| // address. The function never returns, as registration against the backend comes with a TTL and |
| // requires regular heartbeats. |
| func registrationLoop(discoveryBackend discovery.Backend, address string) { |
| for { |
| if err := discoveryBackend.Register(address); err != nil { |
| log.Errorf("Registering as %q in discovery failed: %v", address, err) |
| } |
| time.Sleep(defaultDiscoveryHeartbeat) |
| } |
| } |