diff --git a/package.json b/package.json index 2abfa69df..e222d24cb 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "events-intercept": "^2.0.0", "extend": "^3.0.1", "google-auth-library": "^2.0.0", - "google-gax": "^0.22.0", + "google-gax": "^0.22.1", + "grpc-gcp": "^0.1.0", "is": "^3.2.1", "lodash.merge": "^4.6.1", "lodash.snakecase": "^4.1.1", diff --git a/src/v1/spanner_client.js b/src/v1/spanner_client.js index e1dce389e..a4feaab17 100644 --- a/src/v1/spanner_client.js +++ b/src/v1/spanner_client.js @@ -21,6 +21,10 @@ const path = require('path'); const VERSION = require('../../../package.json').version; +const grpcGcp = require('grpc-gcp'); +const fs = require('fs'); +const GRPC_CONFIG_FILE = __dirname + '/spanner_grpc_config.json'; + /** * Cloud Spanner API * @@ -144,6 +148,15 @@ class SpannerClient { // merely providing the destination and request information. this._innerApiCalls = {}; + const apiConfig = grpcGcp.createGcpApiConfig( + JSON.parse(fs.readFileSync(GRPC_CONFIG_FILE)) + ); + + opts['grpc_gcp.channelFactoryOverride'] = grpcGcp.gcpChannelFactoryOverride; + opts['grpc_gcp.callInvocationTransformer'] = + grpcGcp.gcpCallInvocationTransformer; + opts['grpc_gcp.gcpApiConfig'] = apiConfig; + // Put together the "service stub" for // google.spanner.v1.Spanner. const spannerStub = gaxGrpc.createStub( diff --git a/src/v1/spanner_grpc_config.json b/src/v1/spanner_grpc_config.json new file mode 100644 index 000000000..04f31a245 --- /dev/null +++ b/src/v1/spanner_grpc_config.json @@ -0,0 +1,92 @@ +{ + "channelPool": { + "maxSize": 10, + "maxConcurrentStreamsLowWatermark": 100 + }, + "method": [ + { + "name": [ "/google.spanner.v1.Spanner/CreateSession" ], + "affinity": { + "command": "BIND", + "affinityKey": "name" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/GetSession" ], + "affinity": { + "command": "BOUND", + "affinityKey": "name" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/DeleteSession" ], + "affinity": { + "command": "UNBIND", + "affinityKey": "name" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/ExecuteSql" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/ExecuteStreamingSql" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/Read" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/StreamingRead" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/BeginTransaction" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/Commit" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/Rollback" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/PartitionQuery" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + }, + { + "name": [ "/google.spanner.v1.Spanner/PartitionRead" ], + "affinity": { + "command": "BOUND", + "affinityKey": "session" + } + } + ] +}