package balancergroup

import "google.golang.org/grpc/xds/internal/balancer/balancergroup"

Package balancergroup implements a utility struct to bind multiple balancers into one balancer.

Index

Variables

var DefaultSubBalancerCloseTimeout = 15 * time.Minute

DefaultSubBalancerCloseTimeout is defined as a variable instead of const for testing.

TODO: make it a parameter for New().

Types

type BalancerGroup

type BalancerGroup struct {
	// contains filtered or unexported fields
}

BalancerGroup takes a list of balancers, and make them into one balancer.

Note that this struct doesn't implement balancer.Balancer, because it's not intended to be used directly as a balancer. It's expected to be used as a sub-balancer manager by a high level balancer.

Updates from ClientConn are forwarded to sub-balancers

Actions from sub-balances are forwarded to parent ClientConn

Sub-balancers are only built when the balancer group is started. If the balancer group is closed, the sub-balancers are also closed. And it's guaranteed that no updates will be sent to parent ClientConn from a closed balancer group.

func New

New creates a new BalancerGroup. Note that the BalancerGroup needs to be started to work.

TODO(easwars): Pass an options struct instead of N args.

func (*BalancerGroup) Add

func (bg *BalancerGroup) Add(id string, builder balancer.Builder)

Add adds a balancer built by builder to the group, with given id.

func (*BalancerGroup) Close

func (bg *BalancerGroup) Close()

Close closes the balancer. It stops sub-balancers, and removes the subconns. The BalancerGroup can be restarted later.

func (*BalancerGroup) ExitIdle

func (bg *BalancerGroup) ExitIdle()

ExitIdle should be invoked when the parent LB policy's ExitIdle is invoked. It will trigger this on all sub-balancers, or reconnect their subconns if not supported.

func (*BalancerGroup) Remove

func (bg *BalancerGroup) Remove(id string)

Remove removes the balancer with id from the group.

But doesn't close the balancer. The balancer is kept in a cache, and will be closed after timeout. Cleanup work (closing sub-balancer and removing subconns) will be done after timeout.

func (*BalancerGroup) ResolverError

func (bg *BalancerGroup) ResolverError(err error)

ResolverError forwards resolver errors to all sub-balancers.

func (*BalancerGroup) Start

func (bg *BalancerGroup) Start()

Start starts the balancer group, including building all the sub-balancers, and send the existing addresses to them.

A BalancerGroup can be closed and started later. When a BalancerGroup is closed, it can still receive address updates, which will be applied when restarted.

func (*BalancerGroup) UpdateClientConnState

func (bg *BalancerGroup) UpdateClientConnState(id string, s balancer.ClientConnState) error

UpdateClientConnState handles ClientState (including balancer config and addresses) from resolver. It finds the balancer and forwards the update.

func (*BalancerGroup) UpdateSubConnState

func (bg *BalancerGroup) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState)

UpdateSubConnState handles the state for the subconn. It finds the corresponding balancer and forwards the update.

type BalancerStateAggregator

type BalancerStateAggregator interface {
	// UpdateState updates the state of the id.
	//
	// It's up to the implementation whether this will trigger an update to the
	// parent ClientConn.
	UpdateState(id string, state balancer.State)
}

BalancerStateAggregator aggregates sub-picker and connectivity states into a state.

It takes care of merging sub-picker into one picker. The picking config is passed directly from the the parent to the aggregator implementation (instead via balancer group).

Source Files

balancergroup.go balancerstateaggregator.go

Version
v1.41.1
Published
Dec 1, 2021
Platform
linux/amd64
Imports
10 packages
Last checked
9 minutes ago

Tools for package owners.