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