// monitor checks for changes in a path-based connection func (zconn *zconn) monitor(path string) { var ( connC chan<- client.Connection conn client.Connection err error ) defer func() { if conn != nil { conn.Close() } }() for { // wait for someone to request a connection, or shutdown select { case connC = <-zconn.connC: case <-zconn.shutdownC: return } retry: // create a connection if it doesn't exist or ping the existing connection if conn == nil { conn, err = zconn.client.GetCustomConnection(path) if err != nil { glog.Warningf("Could not obtain a connection to %s: %s", path, err) } } else if _, err := conn.Children("/"); err == client.ErrConnectionClosed { glog.Warningf("Could not ping connection to %s: %s", path, err) conn = nil } // send the connection back if conn != nil { connC <- conn continue } // if conn is nil, try to create a new connection select { case <-time.After(time.Second): glog.Infof("Refreshing connection to zookeeper") goto retry case <-zconn.shutdownC: return } } }