From 772caa6e6fcd20030404923d0bba443ea0b0fe03 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Fri, 17 Jul 2026 05:41:39 +0000
Subject: [PATCH] [#744] Fix flaky ChangelogBackendTestCase: keep generated CSN batches monotonic (#745)

---
 opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

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 d909e5b..e7be2ac 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 @@
   private final List<LDAPReplicationDomain> domains = new ArrayList<>();
   private final Map<ReplicaId, ReplicationBroker> 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 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 @@
       // 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;
   }
 

--
Gitblit v1.10.0