From 7ff774b4e7643a46b60fb93f915a5aec51cf6903 Mon Sep 17 00:00:00 2001 From: ZhouyihaiDing Date: Fri, 29 Jun 2018 12:01:52 -0700 Subject: [PATCH 1/3] Enable gRPC GCP library for channel management --- Spanner/src/Connection/Grpc.php | 21 +++++++++++++++++++++ Spanner/src/spanner.grpc.config | 30 ++++++++++++++++++++++++++++++ composer.json | 3 ++- 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 Spanner/src/spanner.grpc.config diff --git a/Spanner/src/Connection/Grpc.php b/Spanner/src/Connection/Grpc.php index 71ac2babee3..a39f74bee30 100644 --- a/Spanner/src/Connection/Grpc.php +++ b/Spanner/src/Connection/Grpc.php @@ -46,6 +46,8 @@ use Google\Protobuf\ListValue; use Google\Protobuf\Struct; use Google\Protobuf\Value; +use Grpc\Gcp\ApiConfig; +use Grpc\Gcp\Config; use Grpc\UnaryCall; /** @@ -120,6 +122,16 @@ class Grpc implements ConnectionInterface */ private $longRunningGrpcClients; + private function enableConnectionManagement($conf_path) + { + // TODO(ddyihai): move this function to GrpcTrait, if we are going + // to enable the grpc-gcp library for other apis. + $conf = new ApiConfig(); + $conf->mergeFromJsonString($string = file_get_contents($conf_path)); + $config = new Config($conf); + return $config; + } + /** * @param array $config [optional] */ @@ -152,6 +164,15 @@ public function __construct(array $config = []) ? $config['authHttpHandler'] : null ); + + if (isset($config['enableGcpOptimizer'])) { + $api = 'spanner'; + $conf_path = __DIR__. "/../$api.grpc.config"; + $grpc_gcp_config = $this->enableConnectionManagement($conf_path); + $grpcConfig['grpc_call_invoker'] = $grpc_gcp_config->callInvoker(); + unset($config['enableGcpOptimizer']); + } + $this->spannerClient = isset($config['gapicSpannerClient']) ? $config['gapicSpannerClient'] : new SpannerClient($grpcConfig); diff --git a/Spanner/src/spanner.grpc.config b/Spanner/src/spanner.grpc.config new file mode 100644 index 00000000000..e419aef276f --- /dev/null +++ b/Spanner/src/spanner.grpc.config @@ -0,0 +1,30 @@ +{ + "channelPool":{"maxSize":10,"maxConcurrentStreamsLowWatermark":1}, + "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"}} + ] +} + diff --git a/composer.json b/composer.json index bbefeb67f87..dedc5351275 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,8 @@ "monolog/monolog": "~1", "psr/http-message": "1.0.*", "ramsey/uuid": "~3", - "google/gax": "^0.36" + "google/gax": "^0.36", + "google/grpc-gcp": "^v0.1.0" }, "require-dev": { "phpunit/phpunit": "^4.8|^5.0", From 543c5c7992dd4fae31959a431af6b6548c8f922a Mon Sep 17 00:00:00 2001 From: ZhouyihaiDing Date: Tue, 7 Aug 2018 20:23:42 -0700 Subject: [PATCH 2/3] remove flag which can be set by the user; Use env instead --- Spanner/src/Connection/Grpc.php | 23 +++++++++++-------- .../{ => V1/resources}/spanner.grpc.config | 0 composer.json | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) rename Spanner/src/{ => V1/resources}/spanner.grpc.config (100%) diff --git a/Spanner/src/Connection/Grpc.php b/Spanner/src/Connection/Grpc.php index a39f74bee30..12a948b95bd 100644 --- a/Spanner/src/Connection/Grpc.php +++ b/Spanner/src/Connection/Grpc.php @@ -122,13 +122,13 @@ class Grpc implements ConnectionInterface */ private $longRunningGrpcClients; - private function enableConnectionManagement($conf_path) + private function enableConnectionManagement($hostName, $confPath) { // TODO(ddyihai): move this function to GrpcTrait, if we are going // to enable the grpc-gcp library for other apis. $conf = new ApiConfig(); - $conf->mergeFromJsonString($string = file_get_contents($conf_path)); - $config = new Config($conf); + $conf->mergeFromJsonString(file_get_contents($confPath)); + $config = new Config($hostName, $conf); return $config; } @@ -137,6 +137,10 @@ private function enableConnectionManagement($conf_path) */ public function __construct(array $config = []) { + if (getenv("ENABLE_GCP_OPTIMIZER") === false) { + // Enable the GCP optimizer by default. + putenv('ENABLE_GCP_OPTIMIZER=TRUE'); + } $this->serializer = new Serializer([ 'commit_timestamp' => function ($v) { return $this->formatTimestampFromApi($v); @@ -165,12 +169,13 @@ public function __construct(array $config = []) : null ); - if (isset($config['enableGcpOptimizer'])) { - $api = 'spanner'; - $conf_path = __DIR__. "/../$api.grpc.config"; - $grpc_gcp_config = $this->enableConnectionManagement($conf_path); - $grpcConfig['grpc_call_invoker'] = $grpc_gcp_config->callInvoker(); - unset($config['enableGcpOptimizer']); + if (getenv('ENABLE_GCP_OPTIMIZER') == 'TRUE') { + if (extension_loaded('sysvshm')) { + $api = 'spanner'; + $confPath = __DIR__. "/../V1/resources/$api.grpc.config"; + $grpcGcpConfig = $this->enableConnectionManagement('spanner.googleapis.com', $confPath); + $grpcConfig['grpc_call_invoker'] = $grpcGcpConfig->callInvoker(); + } } $this->spannerClient = isset($config['gapicSpannerClient']) diff --git a/Spanner/src/spanner.grpc.config b/Spanner/src/V1/resources/spanner.grpc.config similarity index 100% rename from Spanner/src/spanner.grpc.config rename to Spanner/src/V1/resources/spanner.grpc.config diff --git a/composer.json b/composer.json index dedc5351275..461271dd158 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "psr/http-message": "1.0.*", "ramsey/uuid": "~3", "google/gax": "^0.36", - "google/grpc-gcp": "^v0.1.0" + "google/grpc-gcp": "v0.1.0" }, "require-dev": { "phpunit/phpunit": "^4.8|^5.0", From f8416c5f4e9dc26dabbacd94d306bacbbd10b608 Mon Sep 17 00:00:00 2001 From: ZhouyihaiDing Date: Tue, 14 Aug 2018 13:15:53 -0700 Subject: [PATCH 3/3] update the stub option --- Spanner/src/Connection/Grpc.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Spanner/src/Connection/Grpc.php b/Spanner/src/Connection/Grpc.php index 12a948b95bd..d58d15d3826 100644 --- a/Spanner/src/Connection/Grpc.php +++ b/Spanner/src/Connection/Grpc.php @@ -174,7 +174,11 @@ public function __construct(array $config = []) $api = 'spanner'; $confPath = __DIR__. "/../V1/resources/$api.grpc.config"; $grpcGcpConfig = $this->enableConnectionManagement('spanner.googleapis.com', $confPath); - $grpcConfig['grpc_call_invoker'] = $grpcGcpConfig->callInvoker(); + $grpcConfig['transportConfig']['grpc'] = [ + 'stubOpts' => [ + 'grpc_call_invoker' => $grpcGcpConfig->callInvoker() + ] + ]; } }