Author: ivank Date: Wed Aug 10 10:37:39 2011 New Revision: 1156096 URL: http://svn.apache.org/viewvc?rev=1156096&view=rev Log: BOOKKEEPER-29: BookieRecoveryTest fails intermittently (fpj via ivank) Modified: zookeeper/bookkeeper/trunk/CHANGES.txt zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/BookieRecoveryTest.java Modified: zookeeper/bookkeeper/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1156096&r1=1156095&r2=1156096&view=diff ============================================================================== --- zookeeper/bookkeeper/trunk/CHANGES.txt (original) +++ zookeeper/bookkeeper/trunk/CHANGES.txt Wed Aug 10 10:37:39 2011 @@ -23,3 +23,6 @@ BUGFIXES: BOOKKEEPER-11: Read from open ledger (fpj via ivank) BOOKKEEPER-27: mvn site failed with unresolved dependencies (ivank via fpj) + + BOOKKEEPER-29: BookieRecoveryTest fails intermittently (fpj via ivank) + Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/BookieRecoveryTest.java URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/BookieRecoveryTest.java?rev=1156096&r1=1156095&r2=1156096&view=diff ============================================================================== --- zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/BookieRecoveryTest.java (original) +++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/test/BookieRecoveryTest.java Wed Aug 10 10:37:39 2011 @@ -39,6 +39,8 @@ import org.apache.bookkeeper.tools.BookK import org.apache.log4j.Logger; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -46,7 +48,7 @@ import org.junit.Test; /** * This class tests the bookie recovery admin functionality. */ -public class BookieRecoveryTest extends BaseTestCase { +public class BookieRecoveryTest extends BaseTestCase implements Watcher { static Logger LOG = Logger.getLogger(BookieRecoveryTest.class); // Object used for synchronizing async method calls @@ -75,7 +77,7 @@ public class BookieRecoveryTest extends // Objects to use for this jUnit test. DigestType digestType; - SyncObject sync; + SyncObject sync, zkSync; BookieRecoverCallback bookieRecoverCb; BookKeeperTools bkTools; @@ -93,6 +95,7 @@ public class BookieRecoveryTest extends System.setProperty("digestType", digestType.toString()); System.setProperty("passwd", ""); sync = new SyncObject(); + zkSync = new SyncObject(); bookieRecoverCb = new BookieRecoverCallback(); bkTools = new BookKeeperTools(HOSTPORT); } @@ -155,20 +158,30 @@ public class BookieRecoveryTest extends * @throws IOException */ private void startNewBookie(int port) - throws IOException, InterruptedException { + throws IOException, InterruptedException, KeeperException { File f = File.createTempFile("bookie", "test"); tmpDirs.add(f); f.delete(); f.mkdir(); + zkSync.value = false; + bkc.getZkHandle().getChildren("/ledgers/available", this); + BookieServer server = new BookieServer(port, HOSTPORT, f, new File[] { f }); server.start(); bs.add(server); - while(!server.isRunning()){ + + while(!zkSync.value){ Thread.sleep(500); } + LOG.info("New bookie on port " + port + " has been created."); } + @Override + public void process(WatchedEvent event) { + zkSync.value = true; + } + /** * Helper method to verify that we can read the recovered ledger entries. * @@ -221,9 +234,16 @@ public class BookieRecoveryTest extends writeEntriestoLedgers(numMsgs, 0, lhs); // Shutdown the first bookie server + zkSync.value = false; + bkc.getZkHandle().getChildren("/ledgers/available", this); LOG.info("Finished writing all ledger entries so shutdown one of the bookies."); bs.get(0).shutdown(); bs.remove(0); + + // Block until I get a notification + while(!zkSync.value){ + Thread.sleep(100); + } // Startup a new bookie server int newBookiePort = initialPort + numBookies; @@ -274,10 +294,17 @@ public class BookieRecoveryTest extends writeEntriestoLedgers(numMsgs, 0, lhs); // Shutdown the first bookie server + zkSync.value = false; + bkc.getZkHandle().getChildren("/ledgers/available", this); LOG.info("Finished writing all ledger entries so shutdown one of the bookies."); bs.get(0).shutdown(); bs.remove(0); - + + // Block until I get a notification + while(!zkSync.value){ + Thread.sleep(100); + } + // Startup three new bookie servers for (int i = 0; i < 3; i++) { int newBookiePort = initialPort + numBookies + i; @@ -328,10 +355,17 @@ public class BookieRecoveryTest extends writeEntriestoLedgers(numMsgs, 0, lhs); // Shutdown the first bookie server + zkSync.value = false; + bkc.getZkHandle().getChildren("/ledgers/available", this); LOG.info("Finished writing all ledger entries so shutdown one of the bookies."); bs.get(0).shutdown(); bs.remove(0); + // Block until I get a notification + while(!zkSync.value){ + Thread.sleep(100); + } + // Startup a new bookie server int newBookiePort = initialPort + numBookies; startNewBookie(newBookiePort); @@ -372,10 +406,16 @@ public class BookieRecoveryTest extends writeEntriestoLedgers(numMsgs, 0, lhs); // Shutdown the first bookie server + zkSync.value = false; + bkc.getZkHandle().getChildren("/ledgers/available", this); LOG.info("Finished writing all ledger entries so shutdown one of the bookies."); bs.get(0).shutdown(); bs.remove(0); + // Block until I get a notification + while(!zkSync.value){ + Thread.sleep(100); + } // Startup three new bookie servers for (int i = 0; i < 3; i++) { int newBookiePort = initialPort + numBookies + i;