You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by si...@apache.org on 2012/04/10 05:21:55 UTC

svn commit: r1311564 - in /zookeeper/bookkeeper/trunk: CHANGES.txt bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java

Author: sijie
Date: Tue Apr 10 03:21:55 2012
New Revision: 1311564

URL: http://svn.apache.org/viewvc?rev=1311564&view=rev
Log:
BOOKKEEPER-211: Bookie fails to to start (sijie)

Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1311564&r1=1311563&r2=1311564&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Tue Apr 10 03:21:55 2012
@@ -80,6 +80,8 @@ Trunk (unreleased changes)
 
 	BOOKKEEPER-212: Bookie stops responding when creating and deleting many ledgers (sijie via fpj)
 
+        BOOKKEEPER-211: Bookie fails to to start (sijie)
+
       hedwig-server/
       
         BOOKKEEPER-140: Hub server doesn't subscribe remote region correctly when a region is down. (Sijie Gou via ivank)

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java?rev=1311564&r1=1311563&r2=1311564&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Bookie.java Tue Apr 10 03:21:55 2012
@@ -316,25 +316,38 @@ public class Bookie extends Thread {
             } catch (KeeperException.NoNodeException nne) {
                 newEnv = true;
             }
-            try {
-                checkDirectoryStructure(journalDirectory);
+            List<File> missedCookieDirs = new ArrayList<File>();
+            checkDirectoryStructure(journalDirectory);
 
+            // try to read cookie from journal directory
+            try {
                 Cookie journalCookie = Cookie.readFromDirectory(journalDirectory);
                 journalCookie.verify(masterCookie);
-                for (File dir : ledgerDirectories) {
-                    checkDirectoryStructure(dir);
+            } catch (FileNotFoundException fnf) {
+                missedCookieDirs.add(journalDirectory);
+            }
+            for (File dir : ledgerDirectories) {
+                checkDirectoryStructure(dir);
+                try {
                     Cookie c = Cookie.readFromDirectory(dir);
                     c.verify(masterCookie);
+                } catch (FileNotFoundException fnf) {
+                    missedCookieDirs.add(dir);
                 }
-            } catch (FileNotFoundException fnf) {
-                if (!newEnv){
-                    LOG.error("Cookie exists in zookeeper, but not in all local directories", fnf);
-                    throw new BookieException.InvalidCookieException();
-                }
+            }
 
-                masterCookie.writeToDirectory(journalDirectory);
-                for (File dir : ledgerDirectories) {
-                    masterCookie.writeToDirectory(dir);
+            if (!newEnv && missedCookieDirs.size() > 0){
+                LOG.error("Cookie exists in zookeeper, but not in all local directories. "
+                        + " Directories missing cookie file are " + missedCookieDirs);
+                throw new BookieException.InvalidCookieException();
+            }
+            if (newEnv) {
+                if (missedCookieDirs.size() > 0) {
+                    LOG.debug("Directories missing cookie file are {}", missedCookieDirs);
+                    masterCookie.writeToDirectory(journalDirectory);
+                    for (File dir : ledgerDirectories) {
+                        masterCookie.writeToDirectory(dir);
+                    }
                 }
                 masterCookie.writeToZooKeeper(zk, conf);
             }

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java?rev=1311564&r1=1311563&r2=1311564&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/CookieTest.java Tue Apr 10 03:21:55 2012
@@ -60,14 +60,37 @@ public class CookieTest {
     }
 
     private static String newDirectory() throws IOException {
+        return newDirectory(true);
+    }
+
+    private static String newDirectory(boolean createCurDir) throws IOException {
         File d = File.createTempFile("bookie", "tmpdir");
         d.delete();
         d.mkdirs();
-        new File(d, "current").mkdirs();
+        if (createCurDir) {
+            new File(d, "current").mkdirs();
+        }
         return d.getPath();
     }
 
     /**
+     * Test starting bookie with clean state.
+     */
+    @Test
+    public void testCleanStart() throws Exception {
+        ServerConfiguration conf = new ServerConfiguration()
+            .setZkServers(zkutil.getZooKeeperConnectString())
+            .setJournalDirName(newDirectory(false))
+            .setLedgerDirNames(new String[] { newDirectory(false) })
+            .setBookiePort(3181);
+        try {
+            Bookie b = new Bookie(conf);
+        } catch (Exception e) {
+            fail("Should not reach here.");
+        }
+    }
+
+    /**
      * Test that if a zookeeper cookie
      * is different to a local cookie, the bookie
      * will fail to start
@@ -295,4 +318,4 @@ public class CookieTest {
             assertTrue("wrong exception", ice.getCause().getMessage().contains("upgrade needed"));
         }
     }
-}
\ No newline at end of file
+}