diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java index 617d489fb95..f5dc49cc03e 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java @@ -267,11 +267,17 @@ private void invalidationTestInner( session.execute("ALTER TYPE test_type_2 add i blob"); // wait for latches and fail if they don't reach zero before timeout - assertThat( - Uninterruptibles.awaitUninterruptibly( - preparedStmtCacheRemoveLatch, 10, TimeUnit.SECONDS)) - .withFailMessage("preparedStmtCacheRemoveLatch did not trigger before timeout") - .isTrue(); + if (!Uninterruptibles.awaitUninterruptibly( + preparedStmtCacheRemoveLatch, 10, TimeUnit.SECONDS)) { + // On rare occasions cache does not trigger removal shortly after alter. + forceCacheCleanUp((DefaultDriverContext) session.getContext()); + assertThat( + Uninterruptibles.awaitUninterruptibly( + preparedStmtCacheRemoveLatch, 10, TimeUnit.SECONDS)) + .withFailMessage("preparedStmtCacheRemoveLatch did not trigger before timeout") + .isTrue(); + } + assertThat(Uninterruptibles.awaitUninterruptibly(typeChangeEventLatch, 10, TimeUnit.SECONDS)) .withFailMessage("typeChangeEventLatch did not trigger before timeout") .isTrue(); @@ -426,4 +432,18 @@ private static long getPreparedCacheSize(CqlSession session) { "Could not access metric " + DefaultSessionMetric.CQL_PREPARED_CACHE_SIZE.getPath())); } + + private void forceCacheCleanUp(DefaultDriverContext context) { + context + .getRequestProcessorRegistry() + .getProcessors() + .forEach( + requestProcessor -> { + if (requestProcessor instanceof CqlPrepareAsyncProcessor) { + ((CqlPrepareAsyncProcessor) requestProcessor).getCache().cleanUp(); + } else if (requestProcessor instanceof CqlPrepareSyncProcessor) { + ((CqlPrepareSyncProcessor) requestProcessor).getCache().cleanUp(); + } + }); + } }