Skip to content

Commit

Permalink
Fix the bookie doesn't transition to writable
Browse files Browse the repository at this point in the history
---

### Motivation

When bookie started with readonly, and the disk usage is
small than the warning threshold, it won't transition to
write mode. Notify the disk writable when init the bookie
  • Loading branch information
zymap committed Mar 6, 2024
1 parent 34bd4b3 commit 8845a77
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public LedgerDirsMonitor(final ServerConfiguration conf,
this.dirsManagers = dirsManagers;
}

private void check(final LedgerDirsManager ldm) {
void check(final LedgerDirsManager ldm, boolean notifyDiskWritable) {
final ConcurrentMap<File, Float> diskUsages = ldm.getDiskUsages();
boolean someDiskFulled = false;
boolean highPriorityWritesAllowed = true;
Expand All @@ -78,6 +78,11 @@ private void check(final LedgerDirsManager ldm) {
for (File dir : writableDirs) {
try {
diskUsages.put(dir, diskChecker.checkDir(dir));
if (notifyDiskWritable) {
for (LedgerDirsListener listener : ldm.getListeners()) {
listener.diskWritable(dir);
}
}
} catch (DiskErrorException e) {
LOG.error("Ledger directory {} failed on disk checking : ", dir, e);
// Notify disk failure to all listeners
Expand Down Expand Up @@ -193,7 +198,11 @@ private void check(final LedgerDirsManager ldm) {
}

private void check() {
dirsManagers.forEach(this::check);
check(false);
}

private void check(boolean notifyDiskWritable) {
dirsManagers.forEach(ldm -> check(ldm, notifyDiskWritable));
}

/**
Expand All @@ -207,6 +216,7 @@ private void check() {
*/
public void init() throws DiskErrorException, NoWritableLedgerDirException {
checkDirs();
check(true);
}

// start the daemon for disk monitoring
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,32 @@ public void testValidateLwmThreshold() {
new LedgerDirsMonitor(configuration, mockDiskChecker, Collections.singletonList(dirsManager));
}

@Test
public void testBookieStartWithReadonlyAndDiskIsLowerThanThreshold() throws Exception {
File tmpDir1 = createTempDir("bkTest", ".dir");
File curDir1 = BookieImpl.getCurrentDirectory(tmpDir1);
BookieImpl.checkDirectoryStructure(curDir1);

final ServerConfiguration configuration = TestBKConfiguration.newServerConfiguration();
configuration.setDiskUsageThreshold(0.95f);
configuration.setDiskUsageWarnThreshold(0.80f);
configuration.setDiskLowWaterMarkUsageThreshold(0.80f);
configuration.setLedgerDirNames(new String[]{tmpDir1.toString()});

MockDiskChecker diskChecker = new MockDiskChecker(configuration.getDiskUsageThreshold(), configuration.getDiskUsageWarnThreshold());

LedgerDirsManager ldm = new LedgerDirsManager(configuration, configuration.getLedgerDirs(), diskChecker, statsLogger);
LedgerDirsMonitor ldmMonitor = new LedgerDirsMonitor(configuration, diskChecker, Collections.singletonList(ldm));
MockLedgerDirsListener mockLedgerDirsListener = new MockLedgerDirsListener();
mockLedgerDirsListener.readOnly = true;
ldm.addLedgerDirsListener(mockLedgerDirsListener);
HashMap<File, Float> usageMap = new HashMap<>();
usageMap.put(curDir1, 0.75f);
diskChecker.setUsageMap(usageMap);
ldmMonitor.init();
assertFalse(mockLedgerDirsListener.readOnly);
}

private void setUsageAndThenVerify(File dir1, float dir1Usage, File dir2, float dir2Usage,
MockDiskChecker mockDiskChecker, MockLedgerDirsListener mockLedgerDirsListener, boolean verifyReadOnly)
throws InterruptedException {
Expand Down

0 comments on commit 8845a77

Please sign in to comment.