From 5356ca07dd4077650c589010c3c0330396a05867 Mon Sep 17 00:00:00 2001 From: Alan Protasio Date: Wed, 19 Sep 2018 12:20:59 -0700 Subject: [PATCH] AMQ-7055 - Optimization on SequenceSet to prevent iterating through the whole set when a value bigger than the last value is added --- .../store/kahadb/disk/util/Sequence.java | 4 +++ .../store/kahadb/disk/util/SequenceSet.java | 7 +++++ .../kahadb/disk/util/SequenceSetTest.java | 31 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/Sequence.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/Sequence.java index f52931bd254..25e594b1df6 100644 --- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/Sequence.java +++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/Sequence.java @@ -38,6 +38,10 @@ public boolean isAdjacentToLast(long value) { return last + 1 == value; } + public boolean isBiggerButNotAdjacentToLast(long value) { + return last + 1 < value; + } + public boolean isAdjacentToFirst(long value) { return first - 1 == value; } diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/SequenceSet.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/SequenceSet.java index 2946a223c2e..fac831bf706 100644 --- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/SequenceSet.java +++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/disk/util/SequenceSet.java @@ -114,6 +114,13 @@ public boolean add(long value) { return true; } + // check if the value is greater than the bigger sequence value and if it's not adjacent to it + // in this case, we are sure that the value should be add to the tail of the sequence. + if (sequence.isBiggerButNotAdjacentToLast(value)) { + addLast(new Sequence(value)); + return true; + } + sequence = getHead(); while (sequence != null) { diff --git a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java index 272077a7992..a25b4e72aba 100644 --- a/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java +++ b/activemq-kahadb-store/src/test/java/org/apache/activemq/store/kahadb/disk/util/SequenceSetTest.java @@ -85,6 +85,37 @@ public void testContains() { assertFalse(set.contains(11)); } + @Test + public void testAddValuesToTail() { + SequenceSet set = new SequenceSet(); + set.add(new Sequence(0, 10)); + set.add(new Sequence(21, 42)); + set.add(new Sequence(142, 512)); + + set.add(513); + + for (int i = 600; i < 650; i++) { + set.add(i); + } + + for (int i = 0; i < 10; i++) { + set.add(i * 100); + } + + assertTrue(set.contains(0)); + assertTrue(set.contains(25)); + + assertTrue(set.contains(513)); + assertTrue(!set.contains(514)); + assertFalse(set.contains(599)); + assertTrue(set.contains(625)); + assertFalse(set.contains(651)); + + for (int i = 0; i < 10; i++) { + assertTrue(set.contains(i * 100)); + } + } + @Test public void testRemove() { SequenceSet set = new SequenceSet();