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 2013/07/04 14:01:38 UTC

svn commit: r1499731 - in /zookeeper/bookkeeper/trunk: ./ bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ bookkeeper-server/src/main/java/org/apache/bookkeeper/util/

Author: ivank
Date: Thu Jul  4 12:01:37 2013
New Revision: 1499731

URL: http://svn.apache.org/r1499731
Log:
BOOKKEEPER-636: Latest txn logs might be deleted in a race condition which is not recoverable if BK goes down before next txn log created. (vinay via ivank)

Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/MathUtils.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1499731&r1=1499730&r2=1499731&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Thu Jul  4 12:01:37 2013
@@ -40,6 +40,8 @@ Trunk (unreleased changes)
 
       BOOKKEEPER-641: DeathWatcher thread is unnecessarily running even after bookie shutdown (rakeshr via ivank)
 
+      BOOKKEEPER-636: Latest txn logs might be deleted in a race condition which is not recoverable if BK goes down before next txn log created. (vinay via ivank)
+
       bookkeeper-server:
 
         BOOKKEEPER-567: ReadOnlyBookieTest hangs on shutdown (sijie via ivank)

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java?rev=1499731&r1=1499730&r2=1499731&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java Thu Jul  4 12:01:37 2013
@@ -479,7 +479,11 @@ class Journal extends Thread implements 
         ByteBuffer lenBuff = ByteBuffer.allocate(4);
         JournalChannel logFile = null;
         try {
-            long logId = 0;
+            List<Long> journalIds = listJournalIds(journalDirectory, null);
+            // Should not use MathUtils.now(), which use System.nanoTime() and
+            // could only be used to measure elapsed time.
+            // http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29
+            long logId = journalIds.isEmpty() ? System.currentTimeMillis() : journalIds.get(journalIds.size() - 1);
             BufferedChannel bc = null;
             long lastFlushPosition = 0;
 
@@ -487,7 +491,7 @@ class Journal extends Thread implements 
             while (true) {
                 // new journal file to write
                 if (null == logFile) {
-                    logId = MathUtils.now();
+                    logId = logId + 1;
                     logFile = new JournalChannel(journalDirectory, logId);
                     bc = logFile.getBufferedChannel();
 

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java?rev=1499731&r1=1499730&r2=1499731&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/JournalChannel.java Thu Jul  4 12:01:37 2013
@@ -67,6 +67,12 @@ class JournalChannel implements Closeabl
 
         LOG.info("Opening journal {}", fn);
         if (!fn.exists()) { // new file, write version
+            if (!fn.createNewFile()) {
+                LOG.error("Journal file {}, that shouldn't exist, already exists. "
+                          + " is there another bookie process running?", fn);
+                throw new IOException("File " + fn
+                        + " suddenly appeared, is another bookie process running?");
+            }
             fc = new RandomAccessFile(fn, "rw").getChannel();
             formatVersion = CURRENT_JOURNAL_FORMAT_VERSION;
 

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/MathUtils.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/MathUtils.java?rev=1499731&r1=1499730&r2=1499731&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/MathUtils.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/MathUtils.java Thu Jul  4 12:01:37 2013
@@ -32,13 +32,16 @@ public class MathUtils {
         return mod;
 
     }
-    
+
     /**
      * Current time from some arbitrary time base in the past, counting in
      * milliseconds, and not affected by settimeofday or similar system clock
      * changes. This is appropriate to use when computing how much longer to
      * wait for an interval to expire.
-     * 
+     *
+     * NOTE: only use it for measuring.
+     * http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29
+     *
      * @return current time in milliseconds.
      */
     public static long now() {