mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 07:02:24 -06:00 
			
		
		
		
	
		
			
	
	
		
			135 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright 2024 gRPC authors.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Licensed under the Apache License, Version 2.0 (the "License");
							 | 
						||
| 
								 | 
							
								 * you may not use this file except in compliance with the License.
							 | 
						||
| 
								 | 
							
								 * You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *     http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Unless required by applicable law or agreed to in writing, software
							 | 
						||
| 
								 | 
							
								 * distributed under the License is distributed on an "AS IS" BASIS,
							 | 
						||
| 
								 | 
							
								 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
							 | 
						||
| 
								 | 
							
								 * See the License for the specific language governing permissions and
							 | 
						||
| 
								 | 
							
								 * limitations under the License.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package balancer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"google.golang.org/grpc/connectivity"
							 | 
						||
| 
								 | 
							
									"google.golang.org/grpc/internal"
							 | 
						||
| 
								 | 
							
									"google.golang.org/grpc/resolver"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A SubConn represents a single connection to a gRPC backend service.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// All SubConns start in IDLE, and will not try to connect. To trigger a
							 | 
						||
| 
								 | 
							
								// connection attempt, Balancers must call Connect.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// If the connection attempt fails, the SubConn will transition to
							 | 
						||
| 
								 | 
							
								// TRANSIENT_FAILURE for a backoff period, and then return to IDLE.  If the
							 | 
						||
| 
								 | 
							
								// connection attempt succeeds, it will transition to READY.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// If a READY SubConn becomes disconnected, the SubConn will transition to IDLE.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// If a connection re-enters IDLE, Balancers must call Connect again to trigger
							 | 
						||
| 
								 | 
							
								// a new connection attempt.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Each SubConn contains a list of addresses.  gRPC will try to connect to the
							 | 
						||
| 
								 | 
							
								// addresses in sequence, and stop trying the remainder once the first
							 | 
						||
| 
								 | 
							
								// connection is successful.  However, this behavior is deprecated.  SubConns
							 | 
						||
| 
								 | 
							
								// should only use a single address.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// NOTICE: This interface is intended to be implemented by gRPC, or intercepted
							 | 
						||
| 
								 | 
							
								// by custom load balancing poilices.  Users should not need their own complete
							 | 
						||
| 
								 | 
							
								// implementation of this interface -- they should always delegate to a SubConn
							 | 
						||
| 
								 | 
							
								// returned by ClientConn.NewSubConn() by embedding it in their implementations.
							 | 
						||
| 
								 | 
							
								// An embedded SubConn must never be nil, or runtime panics will occur.
							 | 
						||
| 
								 | 
							
								type SubConn interface {
							 | 
						||
| 
								 | 
							
									// UpdateAddresses updates the addresses used in this SubConn.
							 | 
						||
| 
								 | 
							
									// gRPC checks if currently-connected address is still in the new list.
							 | 
						||
| 
								 | 
							
									// If it's in the list, the connection will be kept.
							 | 
						||
| 
								 | 
							
									// If it's not in the list, the connection will gracefully close, and
							 | 
						||
| 
								 | 
							
									// a new connection will be created.
							 | 
						||
| 
								 | 
							
									//
							 | 
						||
| 
								 | 
							
									// This will trigger a state transition for the SubConn.
							 | 
						||
| 
								 | 
							
									//
							 | 
						||
| 
								 | 
							
									// Deprecated: this method will be removed.  Create new SubConns for new
							 | 
						||
| 
								 | 
							
									// addresses instead.
							 | 
						||
| 
								 | 
							
									UpdateAddresses([]resolver.Address)
							 | 
						||
| 
								 | 
							
									// Connect starts the connecting for this SubConn.
							 | 
						||
| 
								 | 
							
									Connect()
							 | 
						||
| 
								 | 
							
									// GetOrBuildProducer returns a reference to the existing Producer for this
							 | 
						||
| 
								 | 
							
									// ProducerBuilder in this SubConn, or, if one does not currently exist,
							 | 
						||
| 
								 | 
							
									// creates a new one and returns it.  Returns a close function which may be
							 | 
						||
| 
								 | 
							
									// called when the Producer is no longer needed.  Otherwise the producer
							 | 
						||
| 
								 | 
							
									// will automatically be closed upon connection loss or subchannel close.
							 | 
						||
| 
								 | 
							
									// Should only be called on a SubConn in state Ready.  Otherwise the
							 | 
						||
| 
								 | 
							
									// producer will be unable to create streams.
							 | 
						||
| 
								 | 
							
									GetOrBuildProducer(ProducerBuilder) (p Producer, close func())
							 | 
						||
| 
								 | 
							
									// Shutdown shuts down the SubConn gracefully.  Any started RPCs will be
							 | 
						||
| 
								 | 
							
									// allowed to complete.  No future calls should be made on the SubConn.
							 | 
						||
| 
								 | 
							
									// One final state update will be delivered to the StateListener (or
							 | 
						||
| 
								 | 
							
									// UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to
							 | 
						||
| 
								 | 
							
									// indicate the shutdown operation.  This may be delivered before
							 | 
						||
| 
								 | 
							
									// in-progress RPCs are complete and the actual connection is closed.
							 | 
						||
| 
								 | 
							
									Shutdown()
							 | 
						||
| 
								 | 
							
									// RegisterHealthListener registers a health listener that receives health
							 | 
						||
| 
								 | 
							
									// updates for a Ready SubConn. Only one health listener can be registered
							 | 
						||
| 
								 | 
							
									// at a time. A health listener should be registered each time the SubConn's
							 | 
						||
| 
								 | 
							
									// connectivity state changes to READY. Registering a health listener when
							 | 
						||
| 
								 | 
							
									// the connectivity state is not READY may result in undefined behaviour.
							 | 
						||
| 
								 | 
							
									// This method must not be called synchronously while handling an update
							 | 
						||
| 
								 | 
							
									// from a previously registered health listener.
							 | 
						||
| 
								 | 
							
									RegisterHealthListener(func(SubConnState))
							 | 
						||
| 
								 | 
							
									// EnforceSubConnEmbedding is included to force implementers to embed
							 | 
						||
| 
								 | 
							
									// another implementation of this interface, allowing gRPC to add methods
							 | 
						||
| 
								 | 
							
									// without breaking users.
							 | 
						||
| 
								 | 
							
									internal.EnforceSubConnEmbedding
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A ProducerBuilder is a simple constructor for a Producer.  It is used by the
							 | 
						||
| 
								 | 
							
								// SubConn to create producers when needed.
							 | 
						||
| 
								 | 
							
								type ProducerBuilder interface {
							 | 
						||
| 
								 | 
							
									// Build creates a Producer.  The first parameter is always a
							 | 
						||
| 
								 | 
							
									// grpc.ClientConnInterface (a type to allow creating RPCs/streams on the
							 | 
						||
| 
								 | 
							
									// associated SubConn), but is declared as `any` to avoid a dependency
							 | 
						||
| 
								 | 
							
									// cycle.  Build also returns a close function that will be called when all
							 | 
						||
| 
								 | 
							
									// references to the Producer have been given up for a SubConn, or when a
							 | 
						||
| 
								 | 
							
									// connectivity state change occurs on the SubConn.  The close function
							 | 
						||
| 
								 | 
							
									// should always block until all asynchronous cleanup work is completed.
							 | 
						||
| 
								 | 
							
									Build(grpcClientConnInterface any) (p Producer, close func())
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// SubConnState describes the state of a SubConn.
							 | 
						||
| 
								 | 
							
								type SubConnState struct {
							 | 
						||
| 
								 | 
							
									// ConnectivityState is the connectivity state of the SubConn.
							 | 
						||
| 
								 | 
							
									ConnectivityState connectivity.State
							 | 
						||
| 
								 | 
							
									// ConnectionError is set if the ConnectivityState is TransientFailure,
							 | 
						||
| 
								 | 
							
									// describing the reason the SubConn failed.  Otherwise, it is nil.
							 | 
						||
| 
								 | 
							
									ConnectionError error
							 | 
						||
| 
								 | 
							
									// connectedAddr contains the connected address when ConnectivityState is
							 | 
						||
| 
								 | 
							
									// Ready. Otherwise, it is indeterminate.
							 | 
						||
| 
								 | 
							
									connectedAddress resolver.Address
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// connectedAddress returns the connected address for a SubConnState. The
							 | 
						||
| 
								 | 
							
								// address is only valid if the state is READY.
							 | 
						||
| 
								 | 
							
								func connectedAddress(scs SubConnState) resolver.Address {
							 | 
						||
| 
								 | 
							
									return scs.connectedAddress
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// setConnectedAddress sets the connected address for a SubConnState.
							 | 
						||
| 
								 | 
							
								func setConnectedAddress(scs *SubConnState, addr resolver.Address) {
							 | 
						||
| 
								 | 
							
									scs.connectedAddress = addr
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A Producer is a type shared among potentially many consumers.  It is
							 | 
						||
| 
								 | 
							
								// associated with a SubConn, and an implementation will typically contain
							 | 
						||
| 
								 | 
							
								// other methods to provide additional functionality, e.g. configuration or
							 | 
						||
| 
								 | 
							
								// subscription registration.
							 | 
						||
| 
								 | 
							
								type Producer any
							 |