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);
+    }
 }
 

Reply via email to