Merge pull request #2784 from murgatroid99/grpc-js_pick_first_reconnection_fix

grpc-js: Fix pick_first reconnecting without active calls
This commit is contained in:
Michael Lumish 2024-07-10 10:49:06 -07:00 committed by GitHub
commit f8338c55c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 7 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@grpc/grpc-js", "name": "@grpc/grpc-js",
"version": "1.10.10", "version": "1.10.11",
"description": "gRPC Library for Node - pure JS implementation", "description": "gRPC Library for Node - pure JS implementation",
"homepage": "https://grpc.io/", "homepage": "https://grpc.io/",
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", "repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js",

View File

@ -32,7 +32,7 @@ import {
PickResultType, PickResultType,
UnavailablePicker, UnavailablePicker,
} from './picker'; } from './picker';
import { Endpoint, SubchannelAddress } from './subchannel-address'; import { Endpoint, SubchannelAddress, subchannelAddressToString } from './subchannel-address';
import * as logging from './logging'; import * as logging from './logging';
import { LogVerbosity } from './constants'; import { LogVerbosity } from './constants';
import { import {
@ -348,7 +348,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
if (newState !== ConnectivityState.READY) { if (newState !== ConnectivityState.READY) {
this.removeCurrentPick(); this.removeCurrentPick();
this.calculateAndReportNewState(); this.calculateAndReportNewState();
this.requestReresolution();
} }
return; return;
} }
@ -483,6 +482,15 @@ export class PickFirstLoadBalancer implements LoadBalancer {
subchannel: this.channelControlHelper.createSubchannel(address, {}), subchannel: this.channelControlHelper.createSubchannel(address, {}),
hasReportedTransientFailure: false, hasReportedTransientFailure: false,
})); }));
trace('connectToAddressList([' + addressList.map(address => subchannelAddressToString(address)) + '])');
for (const { subchannel } of newChildrenList) {
if (subchannel.getConnectivityState() === ConnectivityState.READY) {
this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef());
subchannel.addConnectivityStateListener(this.subchannelStateListener);
this.pickSubchannel(subchannel);
return;
}
}
/* Ref each subchannel before resetting the list, to ensure that /* Ref each subchannel before resetting the list, to ensure that
* subchannels shared between the list don't drop to 0 refs during the * subchannels shared between the list don't drop to 0 refs during the
* transition. */ * transition. */
@ -494,10 +502,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
this.children = newChildrenList; this.children = newChildrenList;
for (const { subchannel } of this.children) { for (const { subchannel } of this.children) {
subchannel.addConnectivityStateListener(this.subchannelStateListener); subchannel.addConnectivityStateListener(this.subchannelStateListener);
if (subchannel.getConnectivityState() === ConnectivityState.READY) {
this.pickSubchannel(subchannel);
return;
}
} }
for (const child of this.children) { for (const child of this.children) {
if ( if (
@ -527,6 +531,7 @@ export class PickFirstLoadBalancer implements LoadBalancer {
const rawAddressList = ([] as SubchannelAddress[]).concat( const rawAddressList = ([] as SubchannelAddress[]).concat(
...endpointList.map(endpoint => endpoint.addresses) ...endpointList.map(endpoint => endpoint.addresses)
); );
trace('updateAddressList([' + rawAddressList.map(address => subchannelAddressToString(address)) + '])');
if (rawAddressList.length === 0) { if (rawAddressList.length === 0) {
throw new Error('No addresses in endpoint list passed to pick_first'); throw new Error('No addresses in endpoint list passed to pick_first');
} }