Skip to content
Browse files
fix: do not keep references to invalidated clients (#1093)
SpannerImpl would keep a reference to all database clients that had been
created and then invalidated because the database was deleted or did not
exists in the first place. If the getDatabaseClient(String) method would
be called multiple times for the same invalid database, the memory usage
of the application would continue to increase.

Fixes #1089
  • Loading branch information
olavloite committed Apr 25, 2021
1 parent 7792c90 commit b4595a6b52417c716f8e70563bb5a7ef05067707
Showing with 3 additions and 8 deletions.
  1. +3 −8 google-cloud-spanner/src/main/java/com/google/cloud/spanner/
@@ -92,9 +92,6 @@ private static String nextDatabaseClientId(DatabaseId databaseId) {

private final CloseableExecutorProvider asyncExecutorProvider;

private final List<DatabaseClientImpl> invalidatedDbClients = new ArrayList<>();

private final Map<DatabaseId, SessionClient> sessionClients = new HashMap<>();

@@ -204,9 +201,8 @@ public DatabaseClient getDatabaseClient(DatabaseId db) {
String clientId = null;
if (dbClients.containsKey(db) && !dbClients.get(db).pool.isValid()) {
// Move the invalidated client to a separate list, so we can close it together with the
// other database clients when the Spanner instance is closed.
// Close the invalidated client and remove it.
dbClients.get(db).closeAsync(new ClosedException());
clientId = dbClients.get(db).clientId;
@@ -253,8 +249,7 @@ void close(long timeout, TimeUnit unit) {
closedException = new ClosedException();
closureFutures = new ArrayList<>();
for (DatabaseClientImpl dbClient : invalidatedDbClients) {
for (DatabaseClientImpl dbClient : dbClients.values()) {

0 comments on commit b4595a6

Please sign in to comment.