mirror of https://github.com/grpc/grpc-go.git
add comments
This commit is contained in:
parent
f93b6bbfb5
commit
32eec1acef
23
balancer.go
23
balancer.go
|
@ -7,8 +7,9 @@ import (
|
||||||
"google.golang.org/grpc/transport"
|
"google.golang.org/grpc/transport"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Address represents a server the client connects to.
|
||||||
type Address struct {
|
type Address struct {
|
||||||
// Addr is the peer address on which a connection will be established.
|
// Addr is the server address on which a connection will be established.
|
||||||
Addr string
|
Addr string
|
||||||
// Metadata is the information associated with Addr, which may be used
|
// Metadata is the information associated with Addr, which may be used
|
||||||
// to make load balancing decision. This is from the metadata attached
|
// to make load balancing decision. This is from the metadata attached
|
||||||
|
@ -32,18 +33,20 @@ type Balancer interface {
|
||||||
Close() error
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RoundRobin returns a Balancer that selects addresses round-robin.
|
||||||
func RoundRobin() Balancer {
|
func RoundRobin() Balancer {
|
||||||
return &roundRobin{}
|
return &roundRobin{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type roundRobin struct {
|
type roundRobin struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
addrs []Address
|
addrs []Address
|
||||||
next int
|
next int // index of the next address to return for Get()
|
||||||
waitCh chan struct{}
|
waitCh chan struct{}
|
||||||
pending int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Up appends addr to the end of rr.addrs and sends notification if there
|
||||||
|
// are pending Get() calls.
|
||||||
func (rr *roundRobin) Up(addr Address) func(error) {
|
func (rr *roundRobin) Up(addr Address) func(error) {
|
||||||
rr.mu.Lock()
|
rr.mu.Lock()
|
||||||
defer rr.mu.Unlock()
|
defer rr.mu.Unlock()
|
||||||
|
@ -64,6 +67,7 @@ func (rr *roundRobin) Up(addr Address) func(error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// down removes addr from rr.addrs and moves the remaining addrs forward.
|
||||||
func (rr *roundRobin) down(addr Address, err error) {
|
func (rr *roundRobin) down(addr Address, err error) {
|
||||||
rr.mu.Lock()
|
rr.mu.Lock()
|
||||||
defer rr.mu.Unlock()
|
defer rr.mu.Unlock()
|
||||||
|
@ -76,6 +80,7 @@ func (rr *roundRobin) down(addr Address, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get returns the next addr in the rotation. It blocks if there is no address available.
|
||||||
func (rr *roundRobin) Get(ctx context.Context) (addr Address, put func(), err error) {
|
func (rr *roundRobin) Get(ctx context.Context) (addr Address, put func(), err error) {
|
||||||
var ch chan struct{}
|
var ch chan struct{}
|
||||||
rr.mu.Lock()
|
rr.mu.Lock()
|
||||||
|
@ -85,13 +90,13 @@ func (rr *roundRobin) Get(ctx context.Context) (addr Address, put func(), err er
|
||||||
if len(rr.addrs) > 0 {
|
if len(rr.addrs) > 0 {
|
||||||
addr = rr.addrs[rr.next]
|
addr = rr.addrs[rr.next]
|
||||||
rr.next++
|
rr.next++
|
||||||
rr.pending++
|
|
||||||
rr.mu.Unlock()
|
rr.mu.Unlock()
|
||||||
put = func() {
|
put = func() {
|
||||||
rr.put(ctx, addr)
|
rr.put(ctx, addr)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// There is no address available. Wait on rr.waitCh.
|
||||||
if rr.waitCh == nil {
|
if rr.waitCh == nil {
|
||||||
ch = make(chan struct{})
|
ch = make(chan struct{})
|
||||||
rr.waitCh = ch
|
rr.waitCh = ch
|
||||||
|
@ -116,7 +121,6 @@ func (rr *roundRobin) Get(ctx context.Context) (addr Address, put func(), err er
|
||||||
}
|
}
|
||||||
addr = rr.addrs[rr.next]
|
addr = rr.addrs[rr.next]
|
||||||
rr.next++
|
rr.next++
|
||||||
rr.pending++
|
|
||||||
rr.mu.Unlock()
|
rr.mu.Unlock()
|
||||||
put = func() {
|
put = func() {
|
||||||
rr.put(ctx, addr)
|
rr.put(ctx, addr)
|
||||||
|
@ -127,9 +131,6 @@ func (rr *roundRobin) Get(ctx context.Context) (addr Address, put func(), err er
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *roundRobin) put(ctx context.Context, addr Address) {
|
func (rr *roundRobin) put(ctx context.Context, addr Address) {
|
||||||
rr.mu.Lock()
|
|
||||||
defer rr.mu.Unlock()
|
|
||||||
rr.pending--
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rr *roundRobin) Close() error {
|
func (rr *roundRobin) Close() error {
|
||||||
|
|
|
@ -618,7 +618,7 @@ func (ac *addrConn) resetTransport(closeTransport bool) error {
|
||||||
closeTransport = false
|
closeTransport = false
|
||||||
select {
|
select {
|
||||||
case <-time.After(sleepTime):
|
case <-time.After(sleepTime):
|
||||||
case <-cc.shutdownChan:
|
case <-ac.shutdownChan:
|
||||||
}
|
}
|
||||||
retries++
|
retries++
|
||||||
grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %q", err, ac.addr)
|
grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %q", err, ac.addr)
|
||||||
|
|
Loading…
Reference in New Issue