From fef812b2c8708389e13d053be0c9becc0401adcf Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 6 Nov 2019 14:28:44 -0800 Subject: [PATCH] Handle 'too_many_pings' error from server --- packages/grpc-js/src/subchannel.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 4edce3c1..3598a9b9 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -71,6 +71,8 @@ function uniformRandom(min: number, max: number) { return Math.random() * (max - min) + min; } +const tooManyPingsData: Buffer = Buffer.from('too_many_pings', 'ascii'); + export class Subchannel { /** * The subchannel's current connectivity state. Invariant: `session` === `null` @@ -275,8 +277,14 @@ export class Subchannel { ); } }); - session.once('goaway', () => { + session.once('goaway', (errorCode: number, lastStreamID: number, opaqueData: Buffer) => { if (this.session === session) { + /* See the last paragraph of + * https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md#basic-keepalive */ + if (errorCode === http2.constants.NGHTTP2_ENHANCE_YOUR_CALM && opaqueData.equals(tooManyPingsData)) { + logging.log(LogVerbosity.ERROR, `Connection to ${this.channelTarget} rejected by server because of excess pings`); + this.keepaliveTimeMs *= 2; + } this.transitionToState( [ConnectivityState.CONNECTING, ConnectivityState.READY], ConnectivityState.IDLE