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 <[email protected]> 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 {
