This is an automated email from the ASF dual-hosted git repository.

tabish121 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-protonj2.git


The following commit(s) were added to refs/heads/main by this push:
     new 8fb83232 PROTON-2951 Fix issue in next receiver processing return order
8fb83232 is described below

commit 8fb832324b35068c4d52b5cb54c94f5e5ab999c3
Author: Timothy Bish <[email protected]>
AuthorDate: Mon Aug 10 12:37:03 2026 -0400

    PROTON-2951 Fix issue in next receiver processing return order
    
    Ensure correct receiver is returned when using round robin policy for
    selecting the next available receiver
---
 .../client/impl/ClientNextReceiverSelector.java    |  5 +-
 .../qpid/protonj2/client/impl/SessionTest.java     | 91 ++++++++++++++++++++++
 2 files changed, 94 insertions(+), 2 deletions(-)

diff --git 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientNextReceiverSelector.java
 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientNextReceiverSelector.java
index 8fc27a14..c704778a 100644
--- 
a/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientNextReceiverSelector.java
+++ 
b/protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientNextReceiverSelector.java
@@ -146,9 +146,10 @@ final class ClientNextReceiverSelector {
             for (org.apache.qpid.protonj2.engine.Receiver protonReceover : 
session.getProtonSession().receivers()) {
                 if (protonReceover.getLinkedResource() instanceof 
ClientReceiver) {
                     if (foundLast) {
-                        ClientReceiver candidate = 
protonReceover.getLinkedResource();
+                        final ClientReceiver candidate = 
protonReceover.getLinkedResource();
+
                         if (candidate.queuedDeliveries() > 0) {
-                            result = candidate;
+                            return candidate;
                         }
                     } else {
                         foundLast = protonReceover.getLinkedResource() == 
lastReceiver;
diff --git 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/SessionTest.java
 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/SessionTest.java
index 0d4cab58..e1b0a27d 100644
--- 
a/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/SessionTest.java
+++ 
b/protonj2-client/src/test/java/org/apache/qpid/protonj2/client/impl/SessionTest.java
@@ -1579,4 +1579,95 @@ public class SessionTest extends 
ImperativeClientTestCase {
             peer.waitForScriptToComplete();
         }
     }
+
+    @Test
+    public void testNextReceiverRoundRobinPolicyReturnsCorrectReceiver() 
throws Exception {
+        byte[] payload = createEncodedMessage(new AmqpValue<String>("Hello 
World"));
+
+        try (ProtonTestServer peer = new ProtonTestServer()) {
+            peer.expectSASLAnonymousConnect();
+            peer.expectOpen().respond();
+            peer.expectBegin().respond();
+            peer.expectAttach().ofReceiver().respond();
+            peer.expectFlow().withLinkCredit(10);
+            peer.expectAttach().ofReceiver().respond();
+            peer.expectFlow().withLinkCredit(10);
+            peer.expectAttach().ofReceiver().respond();
+            peer.expectFlow().withLinkCredit(10);
+            peer.expectAttach().ofReceiver().respond();
+            peer.expectFlow().withLinkCredit(10);
+            peer.remoteTransfer().withHandle(1)
+                                 .withDeliveryId(0)
+                                 .withMore(false)
+                                 .withMessageFormat(0)
+                                 .withPayload(payload).queue();
+            peer.remoteTransfer().withHandle(1)
+                                 .withDeliveryId(1)
+                                 .withMore(false)
+                                 .withMessageFormat(0)
+                                 .withPayload(payload).queue();
+            peer.remoteTransfer().withHandle(2)
+                                 .withDeliveryId(2)
+                                 .withMore(false)
+                                 .withMessageFormat(0)
+                                 .withPayload(payload).queue();
+            peer.remoteTransfer().withHandle(3)
+                                 .withDeliveryId(3)
+                                 .withMore(false)
+                                 .withMessageFormat(0)
+                                 .withPayload(payload).queue();
+            peer.start();
+
+            URI remoteURI = peer.getServerURI();
+
+            LOG.info("Test started, peer listening on: {}", remoteURI);
+
+            Client container = Client.create();
+            ConnectionOptions options = new 
ConnectionOptions().defaultNextReceiverPolicy(NextReceiverPolicy.RANDOM);
+            Connection connection = container.connect(remoteURI.getHost(), 
remoteURI.getPort(), options);
+            SessionOptions sessionOptions = new 
SessionOptions().defaultNextReceiverPolicy(NextReceiverPolicy.ROUND_ROBIN);
+            Session session = connection.openSession(sessionOptions);
+
+            ReceiverOptions receiverOptions = new 
ReceiverOptions().creditWindow(10).autoAccept(false);
+            Receiver receiver1 = session.openReceiver("test-receiver1", 
receiverOptions).openFuture().get();
+            Receiver receiver2 = session.openReceiver("test-receiver2", 
receiverOptions).openFuture().get();
+            Receiver receiver3 = session.openReceiver("test-receiver3", 
receiverOptions).openFuture().get();
+            Receiver receiver4 = session.openReceiver("test-receiver4", 
receiverOptions).openFuture().get();
+
+            peer.waitForScriptToComplete();
+
+            Wait.waitFor(() -> receiver2.queuedDeliveries() == 2);
+            Wait.waitFor(() -> receiver3.queuedDeliveries() == 1);
+            Wait.waitFor(() -> receiver4.queuedDeliveries() == 1);
+
+            assertEquals(0, receiver1.queuedDeliveries());
+
+            Receiver next = session.nextReceiver();
+            assertSame(next, receiver2, "Should have gotten receiver 2");
+            next = session.nextReceiver();
+            assertSame(next, receiver3, "Should have gotten receiver 3");
+            next = session.nextReceiver();
+            assertSame(next, receiver4, "Should have gotten receiver 4");
+
+            peer.waitForScriptToComplete();
+
+            peer.remoteTransfer().withHandle(0)
+                                 .withDeliveryId(4)
+                                 .withMore(false)
+                                 .withMessageFormat(0)
+                                 .withPayload(payload).now();
+
+            Wait.waitFor(() -> receiver1.queuedDeliveries() == 1);
+
+            next = session.nextReceiver();
+            assertSame(next, receiver1);
+
+            peer.waitForScriptToComplete();
+            peer.expectClose().respond();
+
+            connection.close();
+
+            peer.waitForScriptToComplete();
+        }
+    }
 }


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

Reply via email to