diff --git a/core/src/test/java/io/questdb/client/test/cutlass/qwp/client/sf/cursor/SenderErrorDispatcherTest.java b/core/src/test/java/io/questdb/client/test/cutlass/qwp/client/sf/cursor/SenderErrorDispatcherTest.java index 957e36d4..f8d45c8e 100644 --- a/core/src/test/java/io/questdb/client/test/cutlass/qwp/client/sf/cursor/SenderErrorDispatcherTest.java +++ b/core/src/test/java/io/questdb/client/test/cutlass/qwp/client/sf/cursor/SenderErrorDispatcherTest.java @@ -101,11 +101,13 @@ public void testFullInboxDropsOldestAndCounts() throws Exception { // Spec sf-client.md section 14.6: on overflow, drop the OLDEST entry // and admit the new one. The latest entry is always the most // informative, so the FIFO head loses, not the new arrival. + CountDownLatch handlerEntered = new CountDownLatch(1); CountDownLatch unblock = new CountDownLatch(1); List received = new ArrayList<>(); Object lock = new Object(); CountDownLatch allDelivered = new CountDownLatch(5); try (SenderErrorDispatcher d = new SenderErrorDispatcher(err -> { + handlerEntered.countDown(); try { unblock.await(); } catch (InterruptedException ignored) { @@ -116,13 +118,12 @@ public void testFullInboxDropsOldestAndCounts() throws Exception { } allDelivered.countDown(); }, /*capacity=*/ 4)) { - // First offer starts the dispatcher and lands in the handler - // immediately (and blocks there). Now we can fill the bounded - // inbox to capacity, then overflow. + // First offer starts the dispatcher. Wait until it lands in the + // handler and blocks there before filling the bounded inbox and + // overflowing it. Assert.assertTrue(d.offer(buildError(0))); - // Give the dispatcher a moment to take the head into the - // handler so subsequent offers don't get an extra slot. - TimeUnit.MILLISECONDS.sleep(50); + Assert.assertTrue("first error should reach handler within 5s", + handlerEntered.await(5, TimeUnit.SECONDS)); for (int i = 1; i <= 4; i++) { Assert.assertTrue("inbox should accept offer " + i, d.offer(buildError(i)));