You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2021/04/15 15:36:42 UTC

[pulsar] branch master updated: Fix entry cache size update logic so it won't go negative. (#10225)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 7e83406  Fix entry cache size update logic so it won't go negative. (#10225)
7e83406 is described below

commit 7e8340663bbd75b120eefd1f47fe19e36351f6c8
Author: Marvin Cai <zx...@streamnative.io>
AuthorDate: Thu Apr 15 08:35:54 2021 -0700

    Fix entry cache size update logic so it won't go negative. (#10225)
---
 .../apache/bookkeeper/mledger/util/RangeCache.java |  5 +--
 .../mledger/impl/EntryCacheManagerTest.java        | 36 ++++++++++++++++++++--
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/util/RangeCache.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/util/RangeCache.java
index 042137a..a5786ad 100644
--- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/util/RangeCache.java
+++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/util/RangeCache.java
@@ -219,7 +219,7 @@ public class RangeCache<Key extends Comparable<Key>, Value extends ReferenceCoun
     /**
      * Remove all the entries from the cache.
      *
-     * @return the old size
+     * @return size of removed entries
      */
     public synchronized long clear() {
         long removedSize = 0;
@@ -235,7 +235,8 @@ public class RangeCache<Key extends Comparable<Key>, Value extends ReferenceCoun
         }
 
         entries.clear();
-        return size.getAndAdd(-removedSize);
+        size.getAndAdd(-removedSize);
+        return removedSize;
     }
 
     /**
diff --git a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/EntryCacheManagerTest.java b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/EntryCacheManagerTest.java
index c7572bd..d8cb3dc 100644
--- a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/EntryCacheManagerTest.java
+++ b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/EntryCacheManagerTest.java
@@ -26,8 +26,9 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
-import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -40,7 +41,6 @@ import org.apache.bookkeeper.mledger.ManagedLedgerException;
 import org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig;
 import org.apache.bookkeeper.test.MockedBookKeeperTestCase;
 import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 public class EntryCacheManagerTest extends MockedBookKeeperTestCase {
@@ -149,6 +149,38 @@ public class EntryCacheManagerTest extends MockedBookKeeperTestCase {
     }
 
     @Test
+    public void cacheSizeUpdate() throws Exception {
+        ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig();
+        config.setMaxCacheSize(200);
+        config.setCacheEvictionWatermark(0.8);
+
+        factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config);
+
+        EntryCacheManager cacheManager = factory.getEntryCacheManager();
+        EntryCache cache1 = cacheManager.getEntryCache(ml1);
+        List<EntryImpl> entries = new ArrayList<>();
+
+        // Put entries into cache.
+        for (int i = 0; i < 20; i++) {
+            entries.add(EntryImpl.create(1, i, new byte[i + 1]));
+            assertTrue(cache1.insert(entries.get(i)));
+        }
+        assertEquals(210, cacheManager.getSize());
+
+        // Consume some entries.
+        Random random = new Random();
+        for (int i = 0; i < 20; i++) {
+            if (random.nextBoolean()) {
+                (entries.get(i).getDataBuffer()).readBytes(new byte[entries.get(i).getDataBuffer().readableBytes()]);
+            }
+        }
+
+        cacheManager.removeEntryCache(ml1.getName());
+        assertTrue(cacheManager.getSize() > 0);
+    }
+
+
+    @Test
     public void cacheDisabled() throws Exception {
         ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig();
         config.setMaxCacheSize(0);