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/01 13:44:57 UTC

[bookkeeper] 11/17: validate diskUsageThreshold and diskUsageLwmThreshold (#3285)

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 db3ee4e9d99036f41b07157a68202c39fdd5b129
Author: wenbingshen <ol...@gmail.com>
AuthorDate: Tue Jul 26 17:24:18 2022 +0800

    validate diskUsageThreshold and diskUsageLwmThreshold (#3285)
    
    ### Motivation
    
    When `diskUsageThreshold < diskUsageLwmThreshold`, the bookie can be started normally. When the disk usage reaches `diskUsageThreshold` , bookie will automatically switch to `ReadOnly` mode. The `LedgerDirsMonitor` then switches the bookie back to  `read-write` mode since the disk usage is less than `diskUsageLwmThreshold`, the bookie will switch state back and forth frequently.
    
    ### Changes
    When creating `LedgerDirsMonitor`, we need to validate `diskUsageThreshold` and `diskUsageLwmThreshold` first.
    
    (cherry picked from commit f181325b9fff32d1b26af4b049a5c343081c97a5)
---
 .../bookkeeper/bookie/LedgerDirsMonitor.java       |  9 +++++++
 .../bookkeeper/bookie/LedgerDirsManagerTest.java   | 29 ++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java
index 2b7c90152d..f565119395 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsMonitor.java
@@ -59,6 +59,7 @@ class LedgerDirsMonitor {
     public LedgerDirsMonitor(final ServerConfiguration conf,
                              final DiskChecker diskChecker,
                              final List<LedgerDirsManager> dirsManagers) {
+        validateThreshold(conf.getDiskUsageThreshold(), conf.getDiskLowWaterMarkUsageThreshold());
         this.interval = conf.getDiskCheckInterval();
         this.minUsableSizeForHighPriorityWrites = conf.getMinUsableSizeForHighPriorityWrites();
         this.conf = conf;
@@ -229,5 +230,13 @@ class LedgerDirsMonitor {
         }
         ldm.getWritableLedgerDirs();
     }
+
+    private void validateThreshold(float diskSpaceThreshold, float diskSpaceLwmThreshold) {
+        if (diskSpaceThreshold <= 0 || diskSpaceThreshold >= 1 || diskSpaceLwmThreshold - diskSpaceThreshold > 1e-6) {
+            throw new IllegalArgumentException("Disk space threashold: "
+                    + diskSpaceThreshold + " and lwm threshold: " + diskSpaceLwmThreshold
+                    + " are not valid. Should be > 0 and < 1 and diskSpaceThreshold >= diskSpaceLwmThreshold");
+        }
+    }
 }
 
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/LedgerDirsManagerTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/LedgerDirsManagerTest.java
index 31b6da37a3..7e0e84f7fd 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/LedgerDirsManagerTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/LedgerDirsManagerTest.java
@@ -428,6 +428,35 @@ public class LedgerDirsManagerTest {
         verifyUsage(curDir1, nospace + 0.05f, curDir2, nospace + 0.05f, mockLedgerDirsListener, true);
     }
 
+    @Test
+    public void testValidateLwmThreshold() {
+        final ServerConfiguration configuration = TestBKConfiguration.newServerConfiguration();
+        // check failed because diskSpaceThreshold < diskSpaceLwmThreshold
+        configuration.setDiskUsageThreshold(0.65f);
+        configuration.setDiskLowWaterMarkUsageThreshold(0.90f);
+        try {
+            new LedgerDirsMonitor(configuration, mockDiskChecker, Collections.singletonList(dirsManager));
+            fail("diskSpaceThreshold < diskSpaceLwmThreshold, should be failed.");
+        } catch (Exception e) {
+            assertTrue(e.getMessage().contains("diskSpaceThreshold >= diskSpaceLwmThreshold"));
+        }
+
+        // check failed because diskSpaceThreshold = 0 and diskUsageLwmThreshold = 1
+        configuration.setDiskUsageThreshold(0f);
+        configuration.setDiskLowWaterMarkUsageThreshold(1f);
+        try {
+            new LedgerDirsMonitor(configuration, mockDiskChecker, Collections.singletonList(dirsManager));
+            fail("diskSpaceThreshold = 0 and diskUsageLwmThreshold = 1, should be failed.");
+        } catch (Exception e) {
+            assertTrue(e.getMessage().contains("Should be > 0 and < 1"));
+        }
+
+        // check succeeded
+        configuration.setDiskUsageThreshold(0.95f);
+        configuration.setDiskLowWaterMarkUsageThreshold(0.90f);
+        new LedgerDirsMonitor(configuration, mockDiskChecker, Collections.singletonList(dirsManager));
+    }
+
     private void setUsageAndThenVerify(File dir1, float dir1Usage, File dir2, float dir2Usage,
             MockDiskChecker mockDiskChecker, MockLedgerDirsListener mockLedgerDirsListener, boolean verifyReadOnly)
             throws InterruptedException {