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

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


The following commit(s) were added to refs/heads/master by this push:
     new dd80e967e7 [fix][server] When dbStorage_directIOEntryLogger=true, 
EntryLogIdsImpl only takes effect for a single ledger directory (#3680)
dd80e967e7 is described below

commit dd80e967e7d3dc6873231a7bc04feaba83be54c3
Author: LinChen <[email protected]>
AuthorDate: Thu Dec 22 09:48:52 2022 +0800

    [fix][server] When dbStorage_directIOEntryLogger=true, EntryLogIdsImpl only 
takes effect for a single ledger directory (#3680)
    
    ### Motivation
    When building the EntryLogIdsImpl object, the ledgerDirsManager variable is 
used. When the EntryLogIdsImpl object is used to generate an id, all ledger 
directories will be scanned in the findLargestGap method. for example:
    We configured three ledger directories:
    /data1/bk-data1
    /data1/bk-data2
      /data1/bk-data3
    
    The findLargestGap method scans these three data directories to generate 
ids, but actually only needs to scan one data directory corresponding to the 
EntryLogIdsImpl object:
    
https://github.com/apache/bookkeeper/blob/01232c94c91759a175345e8c055951e5cc6091dd/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java#L225-L236
    
    ### Changes
    When building the EntryLogIdsImpl object, use the variable ldm instead of 
the variable ledgerDirsManager:
    
    ```
               lDirs[0] = ledgerDir.getParentFile();
                LedgerDirsManager ldm = new LedgerDirsManager(conf, lDirs, 
ledgerDirsManager.getDiskChecker(),
                        NullStatsLogger.INSTANCE);
    
    ```
    
    ```
     entrylogger = new DirectEntryLogger(ledgerDir, new EntryLogIdsImpl(ldm, 
slog),
                        new NativeIOImpl(),
                        allocator, entryLoggerWriteExecutor, 
entryLoggerFlushExecutor,
                        conf.getEntryLogSizeLimit(),
                        conf.getNettyMaxFrameSizeBytes() - 500,
                        perDirectoryTotalWriteBufferSize,
                        perDirectoryTotalReadBufferSize,
                        readBufferSize,
                        numReadThreads,
                        maxFdCacheTimeSeconds,
                        slog, statsLogger);
    ```
---
 .../bookie/storage/ldb/DbLedgerStorage.java        |  2 +-
 .../bookkeeper/bookie/storage/TestEntryLogIds.java | 47 ++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java
index df071acb67..31697067a1 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/DbLedgerStorage.java
@@ -217,7 +217,7 @@ public class DbLedgerStorage implements LedgerStorage {
                     numReadThreads = conf.getServerNumIOThreads();
                 }
 
-                entrylogger = new DirectEntryLogger(ledgerDir, new 
EntryLogIdsImpl(ledgerDirsManager, slog),
+                entrylogger = new DirectEntryLogger(ledgerDir, new 
EntryLogIdsImpl(ldm, slog),
                     new NativeIOImpl(),
                     allocator, entryLoggerWriteExecutor, 
entryLoggerFlushExecutor,
                     conf.getEntryLogSizeLimit(),
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/TestEntryLogIds.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/TestEntryLogIds.java
index 54701cbcf1..cee1365f0a 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/TestEntryLogIds.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/storage/TestEntryLogIds.java
@@ -32,6 +32,7 @@ import static org.junit.Assert.assertEquals;
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
 import java.io.File;
+import org.apache.bookkeeper.bookie.LedgerDirsManager;
 import 
org.apache.bookkeeper.bookie.storage.directentrylogger.DirectCompactionEntryLog;
 import 
org.apache.bookkeeper.bookie.storage.directentrylogger.DirectEntryLogger;
 import org.apache.bookkeeper.slogger.Slogger;
@@ -127,6 +128,52 @@ public class TestEntryLogIds {
         highestSoFar = logId4;
     }
 
+    @Test
+    public void testIdGenerator() throws Exception {
+        File base = tmpDirs.createNew("entryLogIds", "ledgers");
+        File ledgerDir1 = new File(base, "l1");
+        File ledgerDir2 = new File(base, "l2");
+        File ledgerDir3 = new File(base, "l3");
+        File ledgerDir4 = new File(base, "l4");
+        ledgerDir1.mkdir();
+        ledgerDir2.mkdir();
+        ledgerDir3.mkdir();
+        ledgerDir4.mkdir();
+
+        //case 1: use root ledgerDirsManager
+        LedgerDirsManager ledgerDirsManager = newDirsManager(ledgerDir1, 
ledgerDir2);
+        EntryLogIds ids1 = new EntryLogIdsImpl(ledgerDirsManager, slog);
+        for (int i = 0; i < 10; i++) {
+            int logId = ids1.nextId();
+            File log1 = new File(ledgerDir1 + "/current", logId + ".log");
+            log1.createNewFile();
+            assertEquals(logId, i);
+        }
+
+        EntryLogIds ids2 = new EntryLogIdsImpl(ledgerDirsManager, slog);
+        for (int i = 0; i < 10; i++) {
+            int logId = ids2.nextId();
+            assertEquals(logId, 10 + i);
+        }
+
+        // case 2: new LedgerDirsManager for per directory
+        LedgerDirsManager ledgerDirsManager3 = newDirsManager(ledgerDir3);
+        LedgerDirsManager ledgerDirsManager4 = newDirsManager(ledgerDir4);
+        EntryLogIds ids3 = new EntryLogIdsImpl(ledgerDirsManager3, slog);
+        for (int i = 0; i < 10; i++) {
+            int logId = ids3.nextId();
+            File log1 = new File(ledgerDir3 + "/current", logId + ".log");
+            log1.createNewFile();
+            assertEquals(logId, i);
+        }
+
+        EntryLogIds ids4 = new EntryLogIdsImpl(ledgerDirsManager4, slog);
+        for (int i = 0; i < 10; i++) {
+            int logId = ids4.nextId();
+            assertEquals(logId, i);
+        }
+    }
+
     @Test
     public void testMultiDirectory() throws Exception {
         File base = tmpDirs.createNew("entryLogIds", "ledgers");

Reply via email to