/// <inheritdoc />
        private static async Task <SpannerClient> CreateClientAsync(SpannerClientCreationOptions channelOptions)
        {
            var credentials = await channelOptions.GetCredentialsAsync().ConfigureAwait(false);

            var channel = new Channel(channelOptions.Endpoint.Host, channelOptions.Endpoint.Port, credentials);

            var apiConfig = new ApiConfig
            {
                ChannelPool = new ChannelPoolConfig
                {
                    MaxSize = (uint)channelOptions.MaximumGrpcChannels,
                    MaxConcurrentStreamsLowWatermark = channelOptions.MaximumConcurrentStreamsLowWatermark
                },
                Method = { s_methodConfigs }
            };

            var grpcOptions = new List <ChannelOption>
            {
                // Keep the channel alive for streaming requests.
                new ChannelOption("grpc.keepalive_time_ms", 60_000),
                new ChannelOption(GcpCallInvoker.ApiConfigChannelArg, apiConfig.ToString())
            };

            var endpoint    = channelOptions.Endpoint;
            var callInvoker = new GcpCallInvoker(endpoint.Host, endpoint.Port, credentials, grpcOptions);

            // We don't need to modify the default timeouts themselves, because we always go through a PooledSession call that accepts
            // a per-call timeout.
            var settings = new SpannerSettings {
                AllowImmediateTimeouts = channelOptions.AllowImmediateTimeouts
            };

            return(SpannerClient.Create(callInvoker, settings));
        }
    }
Esempio n. 2
0
        /// <inheritdoc />
        private static async Task <SpannerClient> CreateClientAsync(SpannerClientCreationOptions channelOptions, SpannerSettings spannerSettings, Logger logger)
        {
            var credentials = await channelOptions.GetCredentialsAsync().ConfigureAwait(false);

            var apiConfig = new ApiConfig
            {
                ChannelPool = new ChannelPoolConfig
                {
                    MaxSize = (uint)channelOptions.MaximumGrpcChannels,
                    MaxConcurrentStreamsLowWatermark = channelOptions.MaximumConcurrentStreamsLowWatermark
                },
                Method = { s_methodConfigs }
            };

            var grpcOptions = new List <ChannelOption>
            {
                // Keep the channel alive for streaming requests.
                new ChannelOption("grpc.keepalive_time_ms", 60_000),
                new ChannelOption(GcpCallInvoker.ApiConfigChannelArg, apiConfig.ToString())
            };

            var endpoint    = channelOptions.Endpoint;
            var callInvoker = new GcpCallInvoker(channelOptions.Endpoint, credentials, grpcOptions);

            return(new SpannerClientBuilder
            {
                CallInvoker = callInvoker,
                Settings = spannerSettings
            }.Build());
        }
    }
Esempio n. 3
0
 internal SessionPool.DatabaseStatistics GetDatabaseStatistics(SpannerClientCreationOptions options, DatabaseName databaseName)
 {
     GaxPreconditions.CheckNotNull(options, nameof(options));
     GaxPreconditions.CheckNotNull(databaseName, nameof(databaseName));
     _targetedPools.TryGetValue(options, out var targetedPool);
     return(targetedPool?.SessionPoolOrNull?.GetStatisticsSnapshot(databaseName));
 }
        internal Task <SessionPool> AcquireSessionPoolAsync(SpannerClientCreationOptions options)
        {
            GaxPreconditions.CheckNotNull(options, nameof(options));
            var targetedPool = _targetedPools.GetOrAdd(options, key => new TargetedPool(this, key));

            targetedPool.IncrementConnectionCount();
            return(targetedPool.SessionPoolTask);
        }
            internal TargetedPool(SessionPoolManager parent, SpannerClientCreationOptions channelOptions)
            {
                _diagnosticName = channelOptions.ToString();
                SessionPoolTask = CreateSessionPoolAsync();

                async Task <SessionPool> CreateSessionPoolAsync()
                {
                    var client = await parent._clientFactory.Invoke(channelOptions).ConfigureAwait(false);

                    var pool = new SessionPool(client, parent.SessionPoolOptions, parent._logger);

                    parent._poolReverseLookup.TryAdd(pool, this);
                    return(pool);
                }
            }