func (c *Client) handleServer(s coconet.Conn) error { for { tsm := &conode.TimeStampMessage{} err := s.GetData(tsm) if err != nil { if err == coconet.ErrNotEstablished { continue } dbg.Lvl3("error getting from connection:", err) return err } c.handleResponse(tsm) } }
func (c *Client) AddServer(name string, conn coconet.Conn) { //c.Servers[name] = conn go func(conn coconet.Conn) { maxwait := 30 * time.Second curWait := 100 * time.Millisecond for { err := conn.Connect() if err != nil { time.Sleep(curWait) curWait = curWait * 2 if curWait > maxwait { curWait = maxwait } continue } else { c.Mux.Lock() c.Servers[name] = conn c.Mux.Unlock() dbg.Lvl3("Success: connected to server:", conn) err := c.handleServer(conn) // if a server encounters any terminating error // terminate all pending client transactions and kill the client if err != nil { dbg.Lvl3("EOF detected: sending EOF to all pending TimeStamps") c.Mux.Lock() for _, ch := range c.doneChan { dbg.Lvl3("Sending to Receiving Channel") ch <- io.EOF } c.Error = io.EOF c.Mux.Unlock() return } else { // try reconnecting if it didn't close the channel continue } } } }(conn) }