You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2019/06/15 10:21:55 UTC

[qpid-broker-j] 03/04: QPID-8322: [Broker-J] Fix credit restoration in window credit manager when infinite credit limit is used

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

orudyy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git

commit e9f02b361a0edbd27cdf37162ed304df281d9da7
Author: Alex Rudyy <or...@apache.org>
AuthorDate: Sat Jun 15 00:58:45 2019 +0100

    QPID-8322: [Broker-J] Fix credit restoration in window credit manager when infinite credit limit is used
---
 .../server/protocol/v0_10/ConsumerTarget_0_10.java | 10 ++++------
 .../server/protocol/v0_10/WindowCreditManager.java | 22 ++++++++++++++--------
 .../protocol/v0_10/WindowCreditManagerTest.java    | 15 +++++++++++++++
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
index c6c312c..d1004ce 100644
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ConsumerTarget_0_10.java
@@ -22,7 +22,6 @@ package org.apache.qpid.server.protocol.v0_10;
 
 import java.io.IOException;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,16 +68,15 @@ public class ConsumerTarget_0_10 extends AbstractConsumerTarget<ConsumerTarget_0
     private final String _targetAddress;
 
 
-    private FlowCreditManager_0_10 _creditManager;
+    private volatile FlowCreditManager_0_10 _creditManager;
 
     private final MessageAcceptMode _acceptMode;
     private final MessageAcquireMode _acquireMode;
-    private MessageFlowMode _flowMode;
+    private volatile MessageFlowMode _flowMode;
     private final ServerSession _session;
-    private final AtomicBoolean _stopped = new AtomicBoolean(true);
 
-    private int _deferredMessageCredit;
-    private long _deferredSizeCredit;
+    private volatile int _deferredMessageCredit;
+    private volatile long _deferredSizeCredit;
 
     private final StateChangeListener<MessageInstance, EntryState> _unacknowledgedMessageListener = new StateChangeListener<MessageInstance, EntryState>()
     {
diff --git a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManager.java b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManager.java
index 3f6f086..818617b 100644
--- a/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManager.java
+++ b/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManager.java
@@ -63,18 +63,24 @@ public class WindowCreditManager implements FlowCreditManager_0_10
     @Override
     public synchronized void restoreCredit(final long messageCredit, final long bytesCredit)
     {
-        _messageUsed -= messageCredit;
-        if (_messageUsed < 0L)
+        if (_messageCreditLimit >= 0L)
         {
-            LOGGER.error("Message credit used value was negative: " + _messageUsed);
-            _messageUsed = 0;
+            _messageUsed -= messageCredit;
+            if (_messageUsed < 0L)
+            {
+                LOGGER.warn("Message credit used value was negative: " + _messageUsed);
+                _messageUsed = 0;
+            }
         }
 
-        _bytesUsed -= bytesCredit;
-        if (_bytesUsed < 0L)
+        if (_bytesCreditLimit >= 0L)
         {
-            LOGGER.error("Bytes credit used value was negative: " + _bytesUsed);
-            _bytesUsed = 0;
+            _bytesUsed -= bytesCredit;
+            if (_bytesUsed < 0L)
+            {
+                LOGGER.warn("Bytes credit used value was negative: " + _bytesUsed);
+                _bytesUsed = 0;
+            }
         }
     }
 
diff --git a/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManagerTest.java b/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManagerTest.java
index 3f1a403..d9ac43d 100644
--- a/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManagerTest.java
+++ b/broker-plugins/amqp-0-10-protocol/src/test/java/org/apache/qpid/server/protocol/v0_10/WindowCreditManagerTest.java
@@ -96,4 +96,19 @@ public class WindowCreditManagerTest extends UnitTestBase
         assertEquals("unexpected credit value", (long) 1, _creditManager.getMessageCredit());
         assertTrue("Manager should 'haveCredit'", _creditManager.hasCredit());
     }
+
+    @Test
+    public void testRestoreCreditWhenInfiniteBytesCredit()
+    {
+        _creditManager.addCredit(1, WindowCreditManager.INFINITE_CREDIT);
+
+        _creditManager.useCreditForMessage(10);
+        assertEquals(0, _creditManager.getMessageCredit());
+        assertEquals(Long.MAX_VALUE, _creditManager.getBytesCredit());
+
+        _creditManager.restoreCredit(1, 10);
+
+        assertEquals(1, _creditManager.getMessageCredit());
+        assertEquals(Long.MAX_VALUE, _creditManager.getBytesCredit());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org