/// <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)); } }
/// <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()); } }
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); } }