Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support adding/removing clients from LBClient #1243

Merged
merged 8 commits into from Apr 1, 2022
37 changes: 37 additions & 0 deletions lbclient.go
Expand Up @@ -50,6 +50,7 @@ type LBClient struct {
cs []*lbClient

once sync.Once
mu sync.RWMutex
}

// DefaultLBClientTimeout is the default request timeout used by LBClient
Expand Down Expand Up @@ -80,6 +81,8 @@ func (cc *LBClient) Do(req *Request, resp *Response) error {
}

func (cc *LBClient) init() {
cc.mu.Lock()
treethought marked this conversation as resolved.
Show resolved Hide resolved
defer cc.mu.Unlock()
if len(cc.Clients) == 0 {
panic("BUG: LBClient.Clients cannot be empty")
}
Expand All @@ -91,9 +94,42 @@ func (cc *LBClient) init() {
}
}

// AddClient adds a new client to the balanced clients
// returns the new total number of clients
func (cc *LBClient) AddClient(c BalancingClient) int {
cc.mu.Lock()
cc.cs = append(cc.cs, &lbClient{
c: c,
healthCheck: cc.HealthCheck,
})
cc.mu.Unlock()
return len(cc.cs)
}

// RemoveClients removes clients using the provided callback
// if rc returns true, the passed client will be removed
// returns the new total number of clients
func (cc *LBClient) RemoveClients(rc func(BalancingClient) bool) int {
cc.mu.Lock()
n := 0
for _, cs := range cc.cs {
if rc(cs.c) {
cs = nil
continue
}
cc.cs[n] = cs
n++
}
treethought marked this conversation as resolved.
Show resolved Hide resolved
cc.cs = cc.cs[:n]

cc.mu.Unlock()
return len(cc.cs)
}

func (cc *LBClient) get() *lbClient {
cc.once.Do(cc.init)

cc.mu.RLock()
cs := cc.cs

minC := cs[0]
Expand All @@ -108,6 +144,7 @@ func (cc *LBClient) get() *lbClient {
minT = t
}
}
cc.mu.RUnlock()
return minC
}

Expand Down