// initBalancer takes hosts from cfg.ChainedServers and it uses them to create a // balancer. func (client *Client) initBalancer(cfg *ClientConfig) (*balancer.Balancer, error) { if len(cfg.ChainedServers) == 0 { return nil, fmt.Errorf("No chained servers configured, not initializing balancer") } // The dialers slice must be large enough to handle all chained // servers. dialers := make([]*balancer.Dialer, 0, len(cfg.ChainedServers)) // Add chained (CONNECT proxy) servers. log.Debugf("Adding %d chained servers", len(cfg.ChainedServers)) for _, s := range cfg.ChainedServers { dialer, err := s.Dialer(cfg.DeviceID) if err == nil { dialers = append(dialers, dialer) } else { log.Errorf("Unable to configure chained server. Received error: %v", err) } } bal := balancer.New(dialers...) var oldBal *balancer.Balancer var ok bool ob, ok := client.bal.Get(0 * time.Millisecond) if ok { oldBal = ob.(*balancer.Balancer) } log.Trace("Publishing balancer") client.bal.Set(bal) if oldBal != nil { // Close old balancer on a goroutine to avoid blocking here go func() { oldBal.Close() log.Debug("Closed old balancer") }() } return bal, nil }