From d1cf26f1d932790cf19c12be70b9fcddf6c1400b Mon Sep 17 00:00:00 2001 From: Valera V Harseko Date: Thu, 16 Jul 2026 21:02:13 +0300 Subject: [PATCH] [#744] Fix flaky ChangelogBackendTestCase: keep generated CSN batches monotonic generateCSNs() built CSNs from TimeThread.getTime(), which only refreshes every 200 ms, restarting seqnum at 1 on every call. Two batches generated within one tick produced identical CSNs, so the changelog silently filtered the second batch out ("would break ordering") and lastchangenumber never advanced, failing searchInChangeNumberModeOnOneSuffixMultipleTimes. Start each batch after the previous one, mirroring the monotonicity guarantee of the production CSNGenerator. --- .../opends/server/backends/ChangelogBackendTestCase.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java index d909e5b03c..e7be2acf81 100644 --- a/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java +++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java @@ -145,6 +145,9 @@ public class ChangelogBackendTestCase extends ReplicationTestCase private final List domains = new ArrayList<>(); private final Map brokers = new HashMap<>(); + /** Time of the last CSN built by {@link #generateCSNs(int, ReplicaId)}, to keep batches monotonic. */ + private long lastGeneratedCsnTime; + @BeforeClass @Override public void setUp() throws Exception @@ -1252,7 +1255,10 @@ private static LDIFWriter getLDIFWriter() throws Exception private CSN[] generateCSNs(int numberOfCsns, ReplicaId replicaId) { - long startTime = TimeThread.getTime(); + // TimeThread only refreshes its cached time every 200 ms, so two batches generated within one + // tick would collide and be filtered out by the changelog as breaking the key ordering. + // Start after the previous batch to keep CSNs monotonically increasing, like CSNGenerator does. + long startTime = Math.max(TimeThread.getTime(), lastGeneratedCsnTime + 1); CSN[] csns = new CSN[numberOfCsns]; for (int i = 0; i < numberOfCsns; i++) @@ -1260,6 +1266,7 @@ private CSN[] generateCSNs(int numberOfCsns, ReplicaId replicaId) // seqNum must be greater than 0, so start at 1 csns[i] = new CSN(startTime + i, i + 1, replicaId.getServerId()); } + lastGeneratedCsnTime = csns[numberOfCsns - 1].getTime(); return csns; }