func (s *scheduler) startRemote(cancel <-chan struct{}, remote, local client.Connection) <-chan interface{} { var ( shutdown = make(chan interface{}) done = make(chan interface{}) ) // wait to receieve a cancel channel or a done channel and shutdown go func() { defer close(shutdown) select { case <-cancel: case <-done: } }() // start the listeners and wait for shutdown or for something to break go func() { defer close(done) glog.Infof("Remote connection established; synchronizing") zzk.Start(shutdown, remote, nil, s.getPoolSynchronizer(), s.getEndpointSynchronizer(local)) glog.Warningf("Running in disconnected mode") }() // indicate when the listeners a finished return done }
// 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") } } }