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 <[email protected]> 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); + } }
