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 f181325b9f validate diskUsageThreshold and diskUsageLwmThreshold
(#3285)
f181325b9f is described below
commit f181325b9fff32d1b26af4b049a5c343081c97a5
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.
---
.../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 f7c2dc31ba..971c602e84 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;
@@ -251,5 +252,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 91d3ba2b34..6ae40258d0 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
@@ -498,6 +498,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 {