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 2022/08/02 06:26:11 UTC

[bookkeeper] 18/22: Stable testBookieContinueWritingIfMultipleLedgersPresent test (#3421)

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

yong pushed a commit to branch branch-4.15
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git

commit ea146161a917bdfa85ea64b8629d22adf8c0f97f
Author: wenbingshen <ol...@gmail.com>
AuthorDate: Tue Jul 26 11:34:27 2022 +0800

    Stable testBookieContinueWritingIfMultipleLedgersPresent test (#3421)
    
    ### Motivation
    
    Fixes issue #2665
    
    When the disk is full, `InterleavedLedgerStorage` creates a new entryLog and index file, copies and moves the old index (newFile) `FileInfo` to the new directory, and finally deletes the old index file.
    
    The old file of `FileInfo` was `deleted`, but it was copied and moved a newFile to the new directory. Therefore, the delete status flag should be restored. If it is not set to false,`checkOpen` will throw `FileInfoDeletedException` when judging the fence status of `ledgerHandle` when adding an entry, causing the writing to fail. When the client changes the `ensemble`, it throws an exception because the test has only two bookie nodes and cannot satisfy the two writeSet: `Not enough non [...]
    ```java
        public synchronized boolean isFenced() throws IOException {
            checkOpen(false);
            return (stateBits & STATE_FENCED_BIT) == STATE_FENCED_BIT;
        }
    
        private synchronized void checkOpen(boolean create, boolean openBeforeClose)
                throws IOException {
            if (deleted) {
                throw new FileInfoDeletedException();
            }
          .....
        }
    ```
    
    ### Changes
    When `FileInfo` moves to a new directory by `moveToNewLocation`,delete the old index file and restore the `delete` flag, because the new index file is ready.
    
    Set the disk check interval to the `Integer.MAX_VALUE`, which is stable
    `assertEquals("writable dirs should have one dir", 1, ledgerDirsManager
                    .getWritableLedgerDirs().size());`
    Because once the test thrashes, the disk check thread will restore the full disk to a writable state.
    ```java
    newConf.setDiskCheckInterval(Integer.MAX_VALUE);
    ```
    
    (cherry picked from commit 1908b7ecdbe4aea0dabdb91009d9635a4d14c533)
---
 .../src/main/java/org/apache/bookkeeper/bookie/FileInfo.java             | 1 +
 .../src/test/java/org/apache/bookkeeper/test/ReadOnlyBookieTest.java     | 1 +
 2 files changed, 2 insertions(+)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java
index 89f820b56d..553d52f606 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileInfo.java
@@ -549,6 +549,7 @@ class FileInfo extends Watchable<LastAddConfirmedUpdateNotification> {
         }
         fc = new RandomAccessFile(newFile, mode).getChannel();
         lf = newFile;
+        deleted = false;
     }
 
     public synchronized byte[] getMasterKey() throws IOException {
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/ReadOnlyBookieTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/ReadOnlyBookieTest.java
index e1270d25b4..cf03cf6629 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/ReadOnlyBookieTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/ReadOnlyBookieTest.java
@@ -248,6 +248,7 @@ public class ReadOnlyBookieTest extends BookKeeperClusterTestCase {
         ServerConfiguration newConf = newServerConfiguration(
                 PortManager.nextFreePort(),
                 ledgerDirs[0], ledgerDirs);
+        newConf.setDiskCheckInterval(Integer.MAX_VALUE);
         startAndAddBookie(newConf);
     }