You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by iv...@apache.org on 2012/05/17 19:07:45 UTC

svn commit: r1339715 - in /zookeeper/bookkeeper/trunk: CHANGES.txt bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java

Author: ivank
Date: Thu May 17 17:07:44 2012
New Revision: 1339715

URL: http://svn.apache.org/viewvc?rev=1339715&view=rev
Log:
BOOKKEEPER-251: Noise error message printed when scanning entry log files those have been garbage collected. (sijie via ivank)

Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1339715&r1=1339714&r2=1339715&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Thu May 17 17:07:44 2012
@@ -112,6 +112,8 @@ Trunk (unreleased changes)
 
         BOOKKEEPER-224: Fix findbugs in bookkeeper-server component (ivank)
 
+        BOOKKEEPER-251: Noise error message printed when scanning entry log files those have been garbage collected. (sijie via ivank)
+
       hedwig-client/
 
         BOOKKEEPER-217: NPE in hedwig client when enable DEBUG (sijie via ivank)

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java?rev=1339715&r1=1339714&r2=1339715&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/EntryLogger.java Thu May 17 17:07:44 2012
@@ -361,6 +361,19 @@ public class EntryLogger {
         }
     }
 
+    /**
+     * Whether the log file exists or not.
+     */
+    boolean logExists(long logId) {
+        for (File d : dirs) {
+            File f = new File(d, Long.toHexString(logId) + ".log");
+            if (f.exists()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private File findFile(long logId) throws FileNotFoundException {
         for(File d: dirs) {
             File f = new File(d, Long.toHexString(logId)+".log");

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java?rev=1339715&r1=1339714&r2=1339715&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/GarbageCollectorThread.java Thu May 17 17:07:44 2012
@@ -81,6 +81,9 @@ public class GarbageCollectorThread exte
 
     volatile boolean running = true;
 
+    // track the last scanned successfully log id
+    long scannedLogId = 0;
+
     /**
      * A scanner wrapper to check whether a ledger is alive in an entry log file
      */
@@ -458,11 +461,19 @@ public class GarbageCollectorThread exte
         // Entry Log ID's are just a long value that starts at 0 and increments
         // by 1 when the log fills up and we roll to a new one.
         long curLogId = entryLogger.getCurrentLogId();
-        for (long entryLogId = 0; entryLogId < curLogId; entryLogId++) {
+        boolean hasExceptionWhenScan = false;
+        for (long entryLogId = scannedLogId; entryLogId < curLogId; entryLogId++) {
             // Comb the current entry log file if it has not already been extracted.
             if (entryLogMetaMap.containsKey(entryLogId)) {
                 continue;
             }
+
+            // check whether log file exists or not
+            // if it doesn't exist, this log file might have been garbage collected.
+            if (!entryLogger.logExists(entryLogId)) {
+                continue;
+            }
+
             LOG.info("Extracting entry log meta from entryLogId: " + entryLogId);
 
             try {
@@ -470,9 +481,17 @@ public class GarbageCollectorThread exte
                 EntryLogMetadata entryLogMeta = extractMetaFromEntryLog(entryLogger, entryLogId);
                 entryLogMetaMap.put(entryLogId, entryLogMeta);
             } catch (IOException e) {
+                hasExceptionWhenScan = true;
                 LOG.warn("Premature exception when processing " + entryLogId +
                          "recovery will take care of the problem", e);
             }
+
+            // if scan failed on some entry log, we don't move 'scannedLogId' to next id
+            // if scan succeed, we don't need to scan it again during next gc run,
+            // we move 'scannedLogId' to next id
+            if (!hasExceptionWhenScan) {
+                ++scannedLogId;
+            }
         }
         return entryLogMetaMap;
     }