Siyao Meng created HDDS-16170:
---------------------------------

             Summary: Intermittent failure in 
TestSnapshotDiffManager#testLoadJobsOnStartUp (DONE vs IN_PROGRESS)
                 Key: HDDS-16170
                 URL: https://issues.apache.org/jira/browse/HDDS-16170
             Project: Apache Ozone
          Issue Type: Sub-task
          Components: Snapshot, test
            Reporter: Siyao Meng
            Assignee: Siyao Meng


{code}
[ERROR] Tests run: 60, Failures: 1, Errors: 0, Skipped: 0 <<< FAILURE! -- in 
org.apache.hadoop.ozone.om.snapshot.TestSnapshotDiffManager
org.apache.hadoop.ozone.om.snapshot.TestSnapshotDiffManager.testLoadJobsOnStartUp
 -- Time elapsed: 0.080 s <<< FAILURE!
org.opentest4j.AssertionFailedError: expected: <DONE> but was: <IN_PROGRESS>
        at 
org.apache.hadoop.ozone.om.snapshot.TestSnapshotDiffManager.testLoadJobsOnStartUp(TestSnapshotDiffManager.java:1150)
{code}

h3. Root cause

The test submits diff jobs, then stubs {{generateSnapshotDiffReport}} with a 
{{doAnswer}} that writes {{DONE}} to the DB inside the answer body, calls 
{{loadJobsOnStartUp()}}, and waits with {{attempt(() -> verify(spy, 
atLeast(1)).generateSnapshotDiffReport(...))}} before reading the job back from 
the DB and asserting {{DONE}}.

Mockito records an invocation before it runs the stubbed answer. So 
{{verify(spy, atLeast(1))}} can pass as soon as the worker thread enters 
{{generateSnapshotDiffReport}}, while the answer is still executing and has not 
yet persisted {{DONE}}. The main thread then reads the job and observes the 
original {{IN_PROGRESS}}, so {{assertEquals(DONE, ...)}} fails intermittently.

This is a recurrence of the symptom HDDS-9434 tried to address: that fix only 
replaced the fixed sleep with a wait on {{verify(...)}}, which still does not 
wait for the answer's DB write to complete.

h3. Fix

Wait on the actual observable end state the test asserts: poll 
{{getSnapshotDiffJobFromDb(...).getStatus()}} until it is {{DONE}} instead of 
waiting on the Mockito invocation. This is deterministic by construction, since 
the read that the assertion depends on is exactly what is waited on.

- https://github.com/apache/ozone/actions/runs/31673201699/job/94364422373




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to