Beispiel #1
0
func (c *Client) AddServer(name string, conn coconet.Conn) {
	//c.Servers[name] = conn
	go func(conn coconet.Conn) {
		maxwait := 1 * 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()
				if sign.DEBUG {
					log.Println("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 {
					if sign.DEBUG {
						log.Errorln("EOF DETECTED: sending EOF to all pending TimeStamps")
					}
					c.Mux.Lock()
					for _, ch := range c.doneChan {
						if sign.DEBUG {
							log.Println("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)
}