From 157882da451b8be623cc50a139c75b4031c9dab4 Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Mon, 27 Sep 2021 15:45:22 -0700 Subject: [PATCH 1/2] grpc-js-xds: A few fixes for xDS tests --- packages/grpc-js-xds/scripts/xds.sh | 2 +- packages/grpc-js-xds/src/xds-bootstrap.ts | 2 +- packages/grpc-js-xds/src/xds-client.ts | 13 +++++++++++-- packages/grpc-js/src/server.ts | 2 ++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/grpc-js-xds/scripts/xds.sh b/packages/grpc-js-xds/scripts/xds.sh index 131cbd55..a06cde84 100755 --- a/packages/grpc-js-xds/scripts/xds.sh +++ b/packages/grpc-js-xds/scripts/xds.sh @@ -59,7 +59,7 @@ GRPC_NODE_TRACE=xds_client,xds_resolver,cds_balancer,eds_balancer,priority,weigh --gcp_suffix=$(date '+%s') \ --verbose \ ${XDS_V3_OPT-} \ - --client_cmd="$(which node) grpc-node/packages/grpc-js-xds/build/interop/xds-interop-client \ + --client_cmd="$(which node) --enable-source-maps grpc-node/packages/grpc-js-xds/build/interop/xds-interop-client \ --server=xds:///{server_uri} \ --stats_port={stats_port} \ --qps={qps} \ diff --git a/packages/grpc-js-xds/src/xds-bootstrap.ts b/packages/grpc-js-xds/src/xds-bootstrap.ts index 64a7bcb9..876b6d95 100644 --- a/packages/grpc-js-xds/src/xds-bootstrap.ts +++ b/packages/grpc-js-xds/src/xds-bootstrap.ts @@ -109,7 +109,7 @@ function validateXdsServerConfig(obj: any): XdsServerConfig { return { serverUri: obj.server_uri, channelCreds: obj.channel_creds.map(validateChannelCredsConfig), - serverFeatures: obj.server_features + serverFeatures: obj.server_features ?? [] }; } diff --git a/packages/grpc-js-xds/src/xds-client.ts b/packages/grpc-js-xds/src/xds-client.ts index 41bc2714..cfb8b66a 100644 --- a/packages/grpc-js-xds/src/xds-client.ts +++ b/packages/grpc-js-xds/src/xds-client.ts @@ -341,6 +341,16 @@ export class XdsClient { return; } trace('Loaded bootstrap info: ' + JSON.stringify(bootstrapInfo, undefined, 2)); + if (bootstrapInfo.xdsServers.length < 1) { + trace('Failed to initialize xDS Client. No servers provided in bootstrap info.'); + // Bubble this error up to any listeners + this.reportStreamError({ + code: status.INTERNAL, + details: 'Failed to initialize xDS Client. No servers provided in bootstrap info.', + metadata: new Metadata(), + }); + return; + } if (bootstrapInfo.xdsServers[0].serverFeatures.indexOf('xds_v3') >= 0) { this.apiVersion = XdsApiVersion.V3; } else { @@ -425,8 +435,7 @@ export class XdsClient { {channelOverride: channel} ); this.maybeStartLrsStream(); - }, - (error) => { + }).catch((error) => { trace('Failed to initialize xDS Client. ' + error.message); // Bubble this error up to any listeners this.reportStreamError({ diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index 42b79a3c..ed4b397d 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -309,6 +309,7 @@ export class Server { const http2Server = setupServer(); return new Promise((resolve, reject) => { function onError(err: Error): void { + trace('Failed to bind ' + subchannelAddressToString(address) + ' with error ' + err.message); resolve(err); } @@ -356,6 +357,7 @@ export class Server { const http2Server = setupServer(); return new Promise((resolve, reject) => { function onError(err: Error): void { + trace('Failed to bind ' + subchannelAddressToString(address) + ' with error ' + err.message); resolve(bindWildcardPort(addressList.slice(1))); } From 1eea4b75bd8744757ac70ab87cae360733fe7f95 Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Tue, 28 Sep 2021 13:14:14 -0700 Subject: [PATCH 2/2] In server.bindAsync, call callback in process.nextTick --- packages/grpc-js/src/server.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index ed4b397d..87788158 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -268,6 +268,10 @@ export class Server { }; } + const deferredCallback = (error: Error | null, port: number) => { + process.nextTick(() => callback(error, port)); + } + const setupServer = (): http2.Http2Server | http2.Http2SecureServer => { let http2Server: http2.Http2Server | http2.Http2SecureServer; if (creds._isSecure()) { @@ -386,7 +390,7 @@ export class Server { // We only want one resolution result. Discard all future results resolverListener.onSuccessfulResolution = () => {}; if (addressList.length === 0) { - callback(new Error(`No addresses resolved for port ${port}`), 0); + deferredCallback(new Error(`No addresses resolved for port ${port}`), 0); return; } let bindResultPromise: Promise; @@ -409,7 +413,7 @@ export class Server { if (bindResult.count === 0) { const errorString = `No address added out of total ${addressList.length} resolved`; logging.log(LogVerbosity.ERROR, errorString); - callback(new Error(errorString), 0); + deferredCallback(new Error(errorString), 0); } else { if (bindResult.count < addressList.length) { logging.log( @@ -417,18 +421,18 @@ export class Server { `WARNING Only ${bindResult.count} addresses added out of total ${addressList.length} resolved` ); } - callback(null, bindResult.port); + deferredCallback(null, bindResult.port); } }, (error) => { const errorString = `No address added out of total ${addressList.length} resolved`; logging.log(LogVerbosity.ERROR, errorString); - callback(new Error(errorString), 0); + deferredCallback(new Error(errorString), 0); } ); }, onError: (error) => { - callback(new Error(error.details), 0); + deferredCallback(new Error(error.details), 0); }, };