From 7606bd26f14a4b9755577bc7dad8ea57c36e7ba1 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Tue, 22 Sep 2026 09:33:34 +0000
Subject: [PATCH] [#1029] Send a directory server only the updates it gives send-window credit for (#1034)

---
 opendj-server-legacy/src/test/java/org/opends/server/replication/ReplicationTestCase.java |   37 +++++++++++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/ReplicationTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/ReplicationTestCase.java
index e7f50a7..0d6efcb 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/ReplicationTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/ReplicationTestCase.java
@@ -29,6 +29,7 @@
 import static org.opends.server.util.CollectionUtils.*;
 import static org.testng.Assert.*;
 
+import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -65,6 +66,7 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.internal.SearchRequest;
+import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.replication.plugin.DomainFakeCfg;
 import org.opends.server.replication.plugin.DummyReplicationDomain;
@@ -74,6 +76,7 @@
 import org.opends.server.replication.protocol.ReplSessionSecurity;
 import org.opends.server.replication.protocol.ReplicationMsg;
 import org.opends.server.replication.protocol.Session;
+import org.opends.server.replication.protocol.UpdateMsg;
 import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.replication.server.changelog.file.FileChangelogDB;
 import org.opends.server.replication.service.ReplicationBroker;
@@ -1407,6 +1410,40 @@
   }
 
   /**
+   * Receives from the broker until the update with the given CSN arrives, returning everything
+   * received before it - so that what the broker was not sent can be asserted on without
+   * waiting out a timeout.
+   *
+   * @param broker Broker from which the update is expected.
+   * @param csn CSN of the update to receive up to.
+   * @return the messages received before that update, in order
+   * @throws AssertionError if the broker is stopped or times out before the update arrives
+   */
+  protected static List<ReplicationMsg> receiveUntil(ReplicationBroker broker, CSN csn) throws Exception
+  {
+    final List<ReplicationMsg> received = new ArrayList<>();
+    try
+    {
+      while (true)
+      {
+        final ReplicationMsg msg = broker.receive();
+        assertNotNull(msg, "The broker was stopped before the update " + csn + " reached it."
+            + " Received the following messages before that: " + received);
+        if (msg instanceof UpdateMsg && csn.equals(((UpdateMsg) msg).getCSN()))
+        {
+          return received;
+        }
+        received.add(msg);
+      }
+    }
+    catch (SocketTimeoutException e)
+    {
+      throw new AssertionError("Failed to receive the update " + csn + " before the socket timeout."
+          + " Received the following messages during wait time: " + received, e);
+    }
+  }
+
+  /**
    * Performs an internal search, waiting for at most 3 seconds for expected result code and expected
    * number of entries.
    */

--
Gitblit v1.10.0