You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by yo...@apache.org on 2021/10/26 01:18:12 UTC
[bookkeeper] 09/11: Release semaphore when addEntry accepts the
same entries (#2832)
This is an automated email from the ASF dual-hosted git repository.
yong pushed a commit to branch branch-4.14
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 82c4e1ceb6b3f48a17a44a8afea2c39e2eb34e99
Author: Yunze Xu <xy...@163.com>
AuthorDate: Sun Oct 17 06:00:04 2021 +0800
Release semaphore when addEntry accepts the same entries (#2832)
(cherry picked from commit a9b576da2f7f974ce46789dd8308240d18765754)
---
.../org/apache/bookkeeper/bookie/EntryMemTable.java | 3 +++
.../apache/bookkeeper/bookie/EntryMemTableTest.java | 20 ++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java
index f54d73a..840f681 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryMemTable.java
@@ -320,6 +320,9 @@ public class EntryMemTable implements AutoCloseable{
try {
EntryKeyValue toAdd = cloneWithAllocator(ledgerId, entryId, entry);
size = internalAdd(toAdd);
+ if (size == 0) {
+ skipListSemaphore.release(len);
+ }
} finally {
this.lock.readLock().unlock();
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/EntryMemTableTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/EntryMemTableTest.java
index 946af02..f067f11 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/EntryMemTableTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/EntryMemTableTest.java
@@ -451,5 +451,25 @@ public class EntryMemTableTest implements CacheCallback, SkipListFlusher, Checkp
assertEquals("listOfEntries should be sorted", Long.valueOf(i + 1), listOfEntries.get(i));
}
}
+
+ @Test
+ public void testAddSameEntries() throws IOException {
+ final long ledgerId = 1;
+ final long entryId = 1;
+ final int size = 10;
+ final byte[] bytes = new byte[size];
+ final int initialPermits = memTable.skipListSemaphore.availablePermits();
+
+ for (int i = 0; i < 5; i++) {
+ memTable.addEntry(ledgerId, entryId, ByteBuffer.wrap(bytes), this);
+ assertEquals(memTable.kvmap.size(), 1);
+ assertEquals(memTable.skipListSemaphore.availablePermits(), initialPermits - size);
+ }
+
+ memTable.snapshot(Checkpoint.MAX);
+ memTable.flush(this);
+ assertEquals(memTable.kvmap.size(), 0);
+ assertEquals(memTable.skipListSemaphore.availablePermits(), initialPermits);
+ }
}