google.golang.org/grpc@v1.72.2/balancer/subconn.go (about) 1 /* 2 * 3 * Copyright 2024 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package balancer 20 21 import ( 22 "google.golang.org/grpc/connectivity" 23 "google.golang.org/grpc/internal" 24 "google.golang.org/grpc/resolver" 25 ) 26 27 // A SubConn represents a single connection to a gRPC backend service. 28 // 29 // All SubConns start in IDLE, and will not try to connect. To trigger a 30 // connection attempt, Balancers must call Connect. 31 // 32 // If the connection attempt fails, the SubConn will transition to 33 // TRANSIENT_FAILURE for a backoff period, and then return to IDLE. If the 34 // connection attempt succeeds, it will transition to READY. 35 // 36 // If a READY SubConn becomes disconnected, the SubConn will transition to IDLE. 37 // 38 // If a connection re-enters IDLE, Balancers must call Connect again to trigger 39 // a new connection attempt. 40 // 41 // Each SubConn contains a list of addresses. gRPC will try to connect to the 42 // addresses in sequence, and stop trying the remainder once the first 43 // connection is successful. However, this behavior is deprecated. SubConns 44 // should only use a single address. 45 // 46 // NOTICE: This interface is intended to be implemented by gRPC, or intercepted 47 // by custom load balancing polices. Users should not need their own complete 48 // implementation of this interface -- they should always delegate to a SubConn 49 // returned by ClientConn.NewSubConn() by embedding it in their implementations. 50 // An embedded SubConn must never be nil, or runtime panics will occur. 51 type SubConn interface { 52 // UpdateAddresses updates the addresses used in this SubConn. 53 // gRPC checks if currently-connected address is still in the new list. 54 // If it's in the list, the connection will be kept. 55 // If it's not in the list, the connection will gracefully close, and 56 // a new connection will be created. 57 // 58 // This will trigger a state transition for the SubConn. 59 // 60 // Deprecated: this method will be removed. Create new SubConns for new 61 // addresses instead. 62 UpdateAddresses([]resolver.Address) 63 // Connect starts the connecting for this SubConn. 64 Connect() 65 // GetOrBuildProducer returns a reference to the existing Producer for this 66 // ProducerBuilder in this SubConn, or, if one does not currently exist, 67 // creates a new one and returns it. Returns a close function which may be 68 // called when the Producer is no longer needed. Otherwise the producer 69 // will automatically be closed upon connection loss or subchannel close. 70 // Should only be called on a SubConn in state Ready. Otherwise the 71 // producer will be unable to create streams. 72 GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) 73 // Shutdown shuts down the SubConn gracefully. Any started RPCs will be 74 // allowed to complete. No future calls should be made on the SubConn. 75 // One final state update will be delivered to the StateListener (or 76 // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to 77 // indicate the shutdown operation. This may be delivered before 78 // in-progress RPCs are complete and the actual connection is closed. 79 Shutdown() 80 // RegisterHealthListener registers a health listener that receives health 81 // updates for a Ready SubConn. Only one health listener can be registered 82 // at a time. A health listener should be registered each time the SubConn's 83 // connectivity state changes to READY. Registering a health listener when 84 // the connectivity state is not READY may result in undefined behaviour. 85 // This method must not be called synchronously while handling an update 86 // from a previously registered health listener. 87 RegisterHealthListener(func(SubConnState)) 88 // EnforceSubConnEmbedding is included to force implementers to embed 89 // another implementation of this interface, allowing gRPC to add methods 90 // without breaking users. 91 internal.EnforceSubConnEmbedding 92 } 93 94 // A ProducerBuilder is a simple constructor for a Producer. It is used by the 95 // SubConn to create producers when needed. 96 type ProducerBuilder interface { 97 // Build creates a Producer. The first parameter is always a 98 // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the 99 // associated SubConn), but is declared as `any` to avoid a dependency 100 // cycle. Build also returns a close function that will be called when all 101 // references to the Producer have been given up for a SubConn, or when a 102 // connectivity state change occurs on the SubConn. The close function 103 // should always block until all asynchronous cleanup work is completed. 104 Build(grpcClientConnInterface any) (p Producer, close func()) 105 } 106 107 // SubConnState describes the state of a SubConn. 108 type SubConnState struct { 109 // ConnectivityState is the connectivity state of the SubConn. 110 ConnectivityState connectivity.State 111 // ConnectionError is set if the ConnectivityState is TransientFailure, 112 // describing the reason the SubConn failed. Otherwise, it is nil. 113 ConnectionError error 114 // connectedAddr contains the connected address when ConnectivityState is 115 // Ready. Otherwise, it is indeterminate. 116 connectedAddress resolver.Address 117 } 118 119 // connectedAddress returns the connected address for a SubConnState. The 120 // address is only valid if the state is READY. 121 func connectedAddress(scs SubConnState) resolver.Address { 122 return scs.connectedAddress 123 } 124 125 // setConnectedAddress sets the connected address for a SubConnState. 126 func setConnectedAddress(scs *SubConnState, addr resolver.Address) { 127 scs.connectedAddress = addr 128 } 129 130 // A Producer is a type shared among potentially many consumers. It is 131 // associated with a SubConn, and an implementation will typically contain 132 // other methods to provide additional functionality, e.g. configuration or 133 // subscription registration. 134 type Producer any