func (s *scheduler) remoteSync(shutdown <-chan interface{}, local client.Connection) { for { select { case remote := <-zzk.Connect("/", zzk.GetRemoteConnection): if remote != nil { s.monitorRemote(shutdown, remote, local) } case <-shutdown: return } select { case <-shutdown: return default: // probably lost connection to the remote; try again } } }
// main loop of the HostAgent func (a *HostAgent) Start(shutdown <-chan interface{}) { glog.Info("Starting HostAgent") var wg sync.WaitGroup defer func() { glog.Info("Waiting for agent routines...") wg.Wait() glog.Info("Agent routines ended") }() wg.Add(1) go func() { glog.Info("reapOldContainersLoop starting") a.reapOldContainersLoop(time.Minute, shutdown) glog.Info("reapOldContainersLoop Done") wg.Done() }() // Increase the number of maximal tracked connections for iptables maxConnections := "655360" if cnxns := strings.TrimSpace(os.Getenv("SERVICED_IPTABLES_MAX_CONNECTIONS")); cnxns != "" { maxConnections = cnxns } glog.Infof("Set sysctl maximum tracked connections for iptables to %s", maxConnections) utils.SetSysctl("net.netfilter.nf_conntrack_max", maxConnections) // Clean up any extant iptables chain, just in case a.servicedChain.Remove() // Add our chain for assigned IP rules if err := a.servicedChain.Inject(); err != nil { glog.Errorf("Error creating SERVICED iptables chain (%v)", err) } // Clean up when we're done defer a.servicedChain.Remove() for { // handle shutdown if we are waiting for a zk connection var conn coordclient.Connection select { case conn = <-zzk.Connect(zzk.GeneratePoolPath(a.poolID), zzk.GetLocalConnection): case <-shutdown: return } if conn == nil { continue } glog.Info("Got a connected client") // watch virtual IP zookeeper nodes virtualIPListener := virtualips.NewVirtualIPListener(a, a.hostID) // watch docker action nodes actionListener := zkdocker.NewActionListener(a, a.hostID) // watch the host state nodes // this blocks until // 1) has a connection // 2) its node is registered // 3) receieves signal to shutdown or breaks hsListener := zkservice.NewHostStateListener(a, a.hostID) glog.Infof("Host Agent successfully started") zzk.Start(shutdown, conn, hsListener, virtualIPListener, actionListener) select { case <-shutdown: glog.Infof("Host Agent shutting down") return default: glog.Infof("Host Agent restarting") } } }