Source File
grpclb_picker.go
Belonging Package
google.golang.org/grpc/balancer/grpclb
package grpclb
import (
lbpb
)
numCallsDropped map[string]int64
}
func () *rpcStats {
return &rpcStats{
numCallsDropped: make(map[string]int64),
}
}
func ( *lbpb.ClientStats) bool {
return len(.CallsFinishedWithDrop) == 0 &&
.NumCallsStarted == 0 &&
.NumCallsFinished == 0 &&
.NumCallsFinishedWithClientFailedToSend == 0 &&
.NumCallsFinishedKnownReceived == 0
}
func ( *rpcStats) () *lbpb.ClientStats {
:= &lbpb.ClientStats{
NumCallsStarted: atomic.SwapInt64(&.numCallsStarted, 0),
NumCallsFinished: atomic.SwapInt64(&.numCallsFinished, 0),
NumCallsFinishedWithClientFailedToSend: atomic.SwapInt64(&.numCallsFinishedWithClientFailedToSend, 0),
NumCallsFinishedKnownReceived: atomic.SwapInt64(&.numCallsFinishedKnownReceived, 0),
}
.mu.Lock()
:= .numCallsDropped
.numCallsDropped = make(map[string]int64)
.mu.Unlock()
for , := range {
.CallsFinishedWithDrop = append(.CallsFinishedWithDrop, &lbpb.ClientStatsPerToken{
LoadBalanceToken: ,
NumCalls: ,
})
}
return
}
func ( *rpcStats) ( string) {
atomic.AddInt64(&.numCallsStarted, 1)
.mu.Lock()
.numCallsDropped[]++
.mu.Unlock()
atomic.AddInt64(&.numCallsFinished, 1)
}
func ( *rpcStats) () {
atomic.AddInt64(&.numCallsStarted, 1)
atomic.AddInt64(&.numCallsFinishedWithClientFailedToSend, 1)
atomic.AddInt64(&.numCallsFinished, 1)
}
func ( *rpcStats) () {
atomic.AddInt64(&.numCallsStarted, 1)
atomic.AddInt64(&.numCallsFinishedKnownReceived, 1)
atomic.AddInt64(&.numCallsFinished, 1)
}
type rrPicker struct {
mu sync.Mutex
subConns []balancer.SubConn // The subConns that were READY when taking the snapshot.
subConnsNext int
}
func ( []balancer.SubConn) *rrPicker {
return &rrPicker{
subConns: ,
subConnsNext: grpcrand.Intn(len()),
}
}
func ( *rrPicker) (balancer.PickInfo) (balancer.PickResult, error) {
.mu.Lock()
defer .mu.Unlock()
:= .subConns[.subConnsNext]
.subConnsNext = (.subConnsNext + 1) % len(.subConns)
return balancer.PickResult{SubConn: }, nil
}
type lbPicker struct {
mu sync.Mutex
serverList []*lbpb.Server
serverListNext int
subConns []balancer.SubConn // The subConns that were READY when taking the snapshot.
subConnsNext int
stats *rpcStats
}
func ( []*lbpb.Server, []balancer.SubConn, *rpcStats) *lbPicker {
return &lbPicker{
serverList: ,
subConns: ,
subConnsNext: grpcrand.Intn(len()),
stats: ,
}
}
func ( *lbPicker) (balancer.PickInfo) (balancer.PickResult, error) {
.mu.Lock()
defer .mu.Unlock()
:= .serverList[.serverListNext]
.serverListNext = (.serverListNext + 1) % len(.serverList)
if .Drop {
.stats.drop(.LoadBalanceToken)
return balancer.PickResult{}, status.Errorf(codes.Unavailable, "request dropped by grpclb")
}
if len(.subConns) <= 0 {
return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
}
:= .subConns[.subConnsNext]
.subConnsNext = (.subConnsNext + 1) % len(.subConns)
:= func( balancer.DoneInfo) {
if !.BytesSent {
.stats.failedToSend()
} else if .BytesReceived {
.stats.knownReceived()
}
}
return balancer.PickResult{SubConn: , Done: }, nil
}
func ( *lbPicker) ( []balancer.SubConn) {
.mu.Lock()
defer .mu.Unlock()
.subConns =
.subConnsNext = .subConnsNext % len()
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |