sijie closed pull request #1322: Improve logging on ledger dirs monitor to 
avoid log flooding
URL: https://github.com/apache/bookkeeper/pull/1322
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
index 1689b11f5..de2c797a8 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieStateManager.java
@@ -31,6 +31,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.bookkeeper.conf.ServerConfiguration;
 import org.apache.bookkeeper.meta.MetadataBookieDriver;
 import org.apache.bookkeeper.stats.Gauge;
@@ -43,6 +44,7 @@
 /**
  * An implementation of StateManager.
  */
+@Slf4j
 public class BookieStateManager implements StateManager {
     private static final Logger LOG = 
LoggerFactory.getLogger(BookieStateManager.class);
     private final ServerConfiguration conf;
@@ -142,6 +144,11 @@ public boolean isAvailableForHighPriorityWrites() {
 
     @Override
     public void setHighPriorityWritesAvailability(boolean available) {
+        if (this.availableForHighPriorityWrites && !available) {
+            log.info("Disable high priority writes on readonly bookie.");
+        } else if (!this.availableForHighPriorityWrites && available) {
+            log.info("Enable high priority writes on readonly bookie.");
+        }
         this.availableForHighPriorityWrites = available;
     }
 
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java
index a615cfaf4..7b632a21b 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/LedgerDirsManager.java
@@ -179,10 +179,11 @@ public boolean hasWritableLedgerDirs() {
         // We don't have writable Ledger Dirs. But we are still okay to create 
new entry log files if we have enough
         // disk spaces. This allows bookie can still function at readonly 
mode. Because compaction, journal replays
         // can still write data to disks.
-        return 
getDirsAboveUsableThresholdSize(minUsableSizeForEntryLogCreation);
+        return 
getDirsAboveUsableThresholdSize(minUsableSizeForEntryLogCreation, true);
     }
 
-    List<File> getDirsAboveUsableThresholdSize(long thresholdSize) throws 
NoWritableLedgerDirException {
+    List<File> getDirsAboveUsableThresholdSize(long thresholdSize, boolean 
loggingNoWritable)
+            throws NoWritableLedgerDirException {
         List<File> fullLedgerDirsToAccomodate = new ArrayList<File>();
         for (File dir: this.ledgerDirectories) {
             // Pick dirs which can accommodate little more than thresholdSize
@@ -192,8 +193,10 @@ public boolean hasWritableLedgerDirs() {
         }
 
         if (!fullLedgerDirsToAccomodate.isEmpty()) {
-            LOG.info("No writable ledger dirs below diskUsageThreshold. "
+            if (loggingNoWritable) {
+                LOG.info("No writable ledger dirs below diskUsageThreshold. "
                     + "But Dirs that can accommodate {} are: {}", 
thresholdSize, fullLedgerDirsToAccomodate);
+            }
             return fullLedgerDirsToAccomodate;
         }
 
@@ -201,7 +204,9 @@ public boolean hasWritableLedgerDirs() {
         // thresholdSize usable space
         String errMsg = "All ledger directories are non writable and no 
reserved space (" + thresholdSize + ") left.";
         NoWritableLedgerDirException e = new 
NoWritableLedgerDirException(errMsg);
-        LOG.error(errMsg, e);
+        if (loggingNoWritable) {
+            LOG.error(errMsg, e);
+        }
         throw e;
     }
 
@@ -307,7 +312,7 @@ File pickRandomWritableDirForNewIndexFile(File excludedDir) 
throws NoWritableLed
             // That means we must have turned readonly. But
             // during the Bookie restart, while replaying the journal there 
might be a need
             // to create new Index file and it should proceed.
-            writableDirsForNewIndexFile = 
getDirsAboveUsableThresholdSize(minUsableSizeForIndexFileCreation);
+            writableDirsForNewIndexFile = 
getDirsAboveUsableThresholdSize(minUsableSizeForIndexFileCreation, true);
         }
         return pickRandomDir(writableDirsForNewIndexFile, excludedDir);
     }
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 2904643b0..4ef02fae4 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
@@ -82,14 +82,22 @@ private void check() {
                         listener.diskFailed(dir);
                     }
                 } catch (DiskWarnThresholdException e) {
-                    LOG.warn("Ledger directory {} is almost full.", dir);
-                    diskUsages.put(dir, e.getUsage());
+                    diskUsages.compute(dir, (d, prevUsage) -> {
+                        if (null == prevUsage || e.getUsage() != prevUsage) {
+                            LOG.warn("Ledger directory {} is almost full : 
usage {}", dir, e.getUsage());
+                        }
+                        return e.getUsage();
+                    });
                     for (LedgerDirsListener listener : ldm.getListeners()) {
                         listener.diskAlmostFull(dir);
                     }
                 } catch (DiskOutOfSpaceException e) {
-                    LOG.error("Ledger directory {} is out-of-space.", dir);
-                    diskUsages.put(dir, e.getUsage());
+                    diskUsages.compute(dir, (d, prevUsage) -> {
+                        if (null == prevUsage || e.getUsage() != prevUsage) {
+                            LOG.error("Ledger directory {} is out-of-space : 
usage {}", dir, e.getUsage());
+                        }
+                        return e.getUsage();
+                    });
                     // Notify disk full to all listeners
                     ldm.addToFilledDirs(dir);
                 }
@@ -102,7 +110,8 @@ private void check() {
         } catch (NoWritableLedgerDirException e) {
             boolean highPriorityWritesAllowed = true;
             try {
-                
ldm.getDirsAboveUsableThresholdSize(minUsableSizeForHighPriorityWrites);
+                // disk check can be frequent, so disable 'loggingNoWritable' 
to avoid log flooding.
+                
ldm.getDirsAboveUsableThresholdSize(minUsableSizeForHighPriorityWrites, false);
             } catch (NoWritableLedgerDirException e1) {
                 highPriorityWritesAllowed = false;
             }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to