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();