From fccad2cc93ba5cbadc4f0355b878856631e52fc4 Mon Sep 17 00:00:00 2001 From: datadog-bits <263423550+datadog-bits@users.noreply.github.com> Date: Fri, 30 Oct 2026 10:05:34 +0000 Subject: [PATCH] Fix flaky WAF handle reload race test waitsForContextCreationBeforeClosingTheHandle sampled the update thread's state twice: once in the wait loop and again in the assertion. A parked StampedLock writer can briefly leave WAITING between samples (for example on a spurious wakeup, before it re-parks), so the second check could fail even though the loop had already seen the thread blocked in initOrUpdateWafHandle. Assert the value the loop observed. Co-Authored-By: Claude Opus 5.5 (1M context) Co-authored-by: cgcote <5115638+cgcote@users.noreply.github.com> --- .../datadog/appsec/ddwaf/WAFModuleHandleReloadRaceTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleHandleReloadRaceTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleHandleReloadRaceTest.java index c3c6f6bf2fc..8917c82dd90 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleHandleReloadRaceTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleHandleReloadRaceTest.java @@ -175,13 +175,15 @@ void waitsForContextCreationBeforeClosingTheHandle() throws Exception { assertTrue(creating.await(10, TimeUnit.SECONDS)); updateThread.start(); long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(10); + // keep the observed state: a parked thread can transiently leave WAITING, so don't resample + boolean blocked = false; while (!update.isDone() - && !blockedInHandleReplacement(updateThread) + && !(blocked = blockedInHandleReplacement(updateThread)) && System.nanoTime() < deadline) { Thread.yield(); } assertFalse(update.isDone(), "reload must wait for context creation"); - assertTrue(blockedInHandleReplacement(updateThread)); + assertTrue(blocked, "reload must be parked in initOrUpdateWafHandle"); assertTrue(initialHandle.isOnline(), "handle must remain online during context creation"); } finally { finishCreation.countDown();