You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by eo...@apache.org on 2022/03/15 10:28:37 UTC

[bookkeeper] branch master updated: ConcurrentOpenHashSet: fix reduce unnecessary expansions (#3082)

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

eolivelli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 81dee85  ConcurrentOpenHashSet: fix reduce  unnecessary expansions (#3082)
81dee85 is described below

commit 81dee85444de2c3f2036f3209fb0e700a5223cf0
Author: LinChen <15...@qq.com>
AuthorDate: Tue Mar 15 18:28:29 2022 +0800

    ConcurrentOpenHashSet: fix reduce  unnecessary expansions (#3082)
---
 .../util/collections/ConcurrentOpenHashSet.java      | 12 ++++++++++--
 .../util/collections/ConcurrentOpenHashSetTest.java  | 20 ++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSet.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSet.java
index 35fce48..58ef4a0 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSet.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSet.java
@@ -169,6 +169,14 @@ public class ConcurrentOpenHashSet<V> {
         return capacity;
     }
 
+    long getUsedBucketCount() {
+        long usedBucketCount = 0;
+        for (Section<V> s : sections) {
+            usedBucketCount += s.usedBuckets;
+        }
+        return usedBucketCount;
+    }
+
     public boolean isEmpty() {
         for (Section<V> s : sections) {
             if (s.size != 0) {
@@ -385,8 +393,8 @@ public class ConcurrentOpenHashSet<V> {
                             // Cleanup all the buckets that were in `DeletedValue` state,
                             // so that we can reduce unnecessary expansions
                             int lastBucket = signSafeMod(bucket - 1, capacity);
-                            while (values[bucket] == DeletedValue) {
-                                values[bucket] = (V) EmptyValue;
+                            while (values[lastBucket] == DeletedValue) {
+                                values[lastBucket] = (V) EmptyValue;
                                 --usedBuckets;
 
                                 lastBucket = signSafeMod(--lastBucket, capacity);
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSetTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSetTest.java
index 72dd93f..e49c103 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSetTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/collections/ConcurrentOpenHashSetTest.java
@@ -159,6 +159,26 @@ public class ConcurrentOpenHashSetTest {
     }
 
     @Test
+    public void testReduceUnnecessaryExpansions(){
+        ConcurrentOpenHashSet<String> set =
+                ConcurrentOpenHashSet.<String>newBuilder()
+                        .expectedItems(2)
+                        .concurrencyLevel(1)
+                        .build();
+
+        assertTrue(set.add("1"));
+        assertTrue(set.add("2"));
+        assertTrue(set.add("3"));
+        assertTrue(set.add("4"));
+
+        assertTrue(set.remove("1"));
+        assertTrue(set.remove("2"));
+        assertTrue(set.remove("3"));
+        assertTrue(set.remove("4"));
+        assertEquals(0, set.getUsedBucketCount());
+    }
+
+    @Test
     public void testRemove() {
         ConcurrentOpenHashSet<String> set =
                 ConcurrentOpenHashSet.<String>newBuilder().build();