@@ -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