public async Task ShutdownPoolAsync() { var client = new SessionTestingSpannerClient(); var options = new SessionPoolOptions { IdleSessionRefreshDelay = TimeSpan.FromMinutes(30), PoolEvictionDelay = TimeSpan.FromMinutes(30), MaintenanceLoopDelay = TimeSpan.FromMinutes(1), MinimumPooledSessions = 10, MaximumConcurrentSessionCreates = 20, WriteSessionsFraction = 0 }; var sessionPool = new SessionPool(client, options); var acquisitionTask = sessionPool.AcquireSessionAsync(s_sampleDatabaseName, new TransactionOptions(), default); // After a minute, we should have a session. Release it immediately for simplicity. await client.Scheduler.RunAsync(TimeSpan.FromMinutes(1)); var session = await acquisitionTask; session.ReleaseToPool(false); // Shut the pool down, and wait a minute. (It won't take that long, as nothing's pending.) var shutdownTask = sessionPool.ShutdownPoolAsync(s_sampleDatabaseName, default); await client.Scheduler.RunAsync(TimeSpan.FromMinutes(1)); // Now the shutdown task should have completed, and the stats will know that it's shut down. await shutdownTask; var stats = sessionPool.GetStatisticsSnapshot(s_sampleDatabaseName); Assert.True(stats.Shutdown); // We can't get sessions any more for this database await Assert.ThrowsAsync <InvalidOperationException>(() => sessionPool.AcquireSessionAsync(s_sampleDatabaseName, new TransactionOptions(), default)); // But we can for a different database. (It shuts down a single database pool, not the whole session pool.) var acquisitionTask2 = sessionPool.AcquireSessionAsync(s_sampleDatabaseName2, new TransactionOptions(), default); await client.Scheduler.RunAsync(TimeSpan.FromMinutes(1)); await acquisitionTask2; }