Skip to content

Commit d78343f

Browse files
committed
Handle runtime keyspace setup failures as failed futures
1 parent 3f8ffaa commit d78343f

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

driver-core/src/main/java/com/datastax/driver/core/Connection.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,8 @@ ListenableFuture<Connection> setKeyspaceAsync(final String keyspace) {
913913
return ksFuture;
914914
} catch (RuntimeException e) {
915915
targetKeyspace.compareAndSet(attempt, defaultKeyspaceAttempt);
916-
throw e;
916+
ksFuture.setException(e);
917+
return ksFuture;
917918
}
918919
Futures.addCallback(
919920
future,

driver-core/src/test/java/com/datastax/driver/core/HostConnectionPoolTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,41 @@ public void should_restore_pool_accounting_when_keyspace_setup_fails_on_borrow()
462462
}
463463
}
464464

465+
/**
466+
* Ensures that an unexpected synchronous failure while starting keyspace setup is reported
467+
* through the borrow future and does not leak pool accounting.
468+
*
469+
* @test_category connection:connection_pool
470+
*/
471+
@Test(groups = "short")
472+
public void should_restore_pool_accounting_when_keyspace_setup_throws_on_borrow()
473+
throws Exception {
474+
Cluster cluster = createClusterBuilder().build();
475+
try {
476+
HostConnectionPool pool = createPool(cluster, 1, 1);
477+
Connection connection = spy(pool.connections[0].get(0));
478+
pool.connections[0].set(0, connection);
479+
480+
pool.manager.poolsState.setKeyspace("newkeyspace");
481+
RuntimeException failure = new RuntimeException("Unexpected keyspace setup failure");
482+
doThrow(failure).when(connection).write(any(Message.Request.class));
483+
484+
MockRequest request = MockRequest.send(pool);
485+
486+
try {
487+
Uninterruptibles.getUninterruptibly(request.connectionFuture, 5, TimeUnit.SECONDS);
488+
fail("Should have failed to borrow connection");
489+
} catch (ExecutionException e) {
490+
assertThat(e.getCause()).isSameAs(failure);
491+
}
492+
verify(connection).write(any(Message.Request.class));
493+
assertThat(connection.inFlight.get()).isEqualTo(0);
494+
assertThat(pool.totalInFlight.get()).isEqualTo(0);
495+
} finally {
496+
cluster.close();
497+
}
498+
}
499+
465500
/**
466501
* Ensures that a synchronous write failure while setting the keyspace is reported through the
467502
* returned future and does not leave the failed keyspace attempt in-flight.

0 commit comments

Comments
 (0)