From 18869dcb08f34c853f797e83ae09b7ad89126cd4 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 21 Feb 2020 16:39:10 -0800 Subject: [PATCH] Clone metadata going into the metadata filter stack --- packages/grpc-js/package.json | 2 +- packages/grpc-js/src/channel.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/grpc-js/package.json b/packages/grpc-js/package.json index d56999bc..52667831 100644 --- a/packages/grpc-js/package.json +++ b/packages/grpc-js/package.json @@ -1,6 +1,6 @@ { "name": "@grpc/grpc-js", - "version": "0.6.17", + "version": "0.6.18", "description": "gRPC Library for Node - pure JS implementation", "homepage": "https://grpc.io/", "repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index e1db479c..8420b909 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -250,8 +250,11 @@ export class ChannelImplementation implements Channel { this.pickQueue.push({ callStream, callMetadata }); break; } + /* We need to clone the callMetadata here because the transparent + * retry code in the promise resolution handler use the same + * callMetadata object, so it needs to stay unmodified */ callStream.filterStack - .sendMetadata(Promise.resolve(callMetadata)) + .sendMetadata(Promise.resolve(callMetadata.clone())) .then( finalMetadata => { const subchannelState: ConnectivityState = pickResult.subchannel!.getConnectivityState(); @@ -280,6 +283,8 @@ export class ChannelImplementation implements Channel { 'channel', 'Failed to start call on picked subchannel ' + pickResult.subchannel!.getAddress() + + ' with error ' + + (error as Error).message + '. Retrying pick' ); this.tryPick(callStream, callMetadata);