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 {