diff --git a/ChangeLog.txt b/ChangeLog.txt index c7e0af9a..5385be2d 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -16,6 +16,7 @@ Version 0.7: Removed cause of leakage of Netty Sessions (fix issue #39) Cleaned Netty's stuff reference from Events used in Disruptor (fix issue #40) Bad assignment of PacketID during publish to subscribed QoS0 topics (fix issue #38) + Fixed duplicated subscription with different QoS same client and topic (fix issue # Version 0.6: Fix issue #42, bad password file path composition diff --git a/broker/src/main/java/org/eclipse/moquette/spi/impl/subscriptions/TreeNode.java b/broker/src/main/java/org/eclipse/moquette/spi/impl/subscriptions/TreeNode.java index fdeee9eb..29b90446 100644 --- a/broker/src/main/java/org/eclipse/moquette/spi/impl/subscriptions/TreeNode.java +++ b/broker/src/main/java/org/eclipse/moquette/spi/impl/subscriptions/TreeNode.java @@ -30,8 +30,8 @@ class TreeNode { TreeNode m_parent; Token m_token; - List m_children = new ArrayList(); - List m_subscriptions = new ArrayList(); + List m_children = new ArrayList<>(); + List m_subscriptions = new ArrayList<>(); TreeNode(TreeNode parent) { this.m_parent = parent; @@ -51,7 +51,9 @@ class TreeNode { return; } //remove existing subscription for same client and topic but different QoS - int existingSubIdx = Collections.binarySearch(m_subscriptions, s, new ClientIDComparator()); + Comparator comparator = new ClientIDComparator(); + Collections.sort(m_subscriptions, comparator); + int existingSubIdx = Collections.binarySearch(m_subscriptions, s, comparator); if (existingSubIdx >= 0) { m_subscriptions.remove(existingSubIdx); } diff --git a/broker/src/test/java/org/eclipse/moquette/spi/impl/subscriptions/SubscriptionsStoreTest.java b/broker/src/test/java/org/eclipse/moquette/spi/impl/subscriptions/SubscriptionsStoreTest.java index d6e5d99d..72a8a8b1 100644 --- a/broker/src/test/java/org/eclipse/moquette/spi/impl/subscriptions/SubscriptionsStoreTest.java +++ b/broker/src/test/java/org/eclipse/moquette/spi/impl/subscriptions/SubscriptionsStoreTest.java @@ -356,6 +356,28 @@ public class SubscriptionsStoreTest { assertEquals(overrindingSubscription.getRequestedQos(), sub.getRequestedQos()); } + /* + Test for Issue #49 + * */ + @Test + public void duplicatedSubscriptionsWithDifferentQos() { + Subscription client2Sub = new Subscription("client2", "client/test/b", AbstractMessage.QOSType.MOST_ONE, true); + store.add(client2Sub); + Subscription client1SubQoS0 = new Subscription("client1", "client/test/b", AbstractMessage.QOSType.MOST_ONE, true); + store.add(client1SubQoS0); + + Subscription client1SubQoS2 = new Subscription("client1", "client/test/b", AbstractMessage.QOSType.EXACTLY_ONCE, true); + store.add(client1SubQoS2); + + System.out.println(store.dumpTree()); + + //Verify + List subscriptions = store.matches("client/test/b"); + assertTrue(subscriptions.contains(client1SubQoS2)); + assertTrue(subscriptions.contains(client2Sub)); + assertFalse(subscriptions.contains(client1SubQoS0)); //client1SubQoS2 should override client1SubQoS0 + } + private static Token[] asArray(Object... l) { Token[] tokens = new Token[l.length]; for (int i = 0; i < l.length; i++) {