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/09/09 12:29:10 UTC

svn commit: r1521028 - in /zookeeper/bookkeeper/branches/branch-4.2: ./ bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/ bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/

Author: ivank
Date: Mon Sep  9 10:29:09 2013
New Revision: 1521028

URL: http://svn.apache.org/r1521028
Log:
BOOKKEEPER-679: Bookie should exit with non-zero if NIOServer crashes with Error (ivank)

Modified:
    zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt
    zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java
    zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java
    zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShutdownTest.java

Modified: zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt?rev=1521028&r1=1521027&r2=1521028&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/CHANGES.txt Mon Sep  9 10:29:09 2013
@@ -72,6 +72,8 @@ Release 4.2.2 - Unreleased
 
         BOOKKEEPER-664: Compaction increases latency on journal writes (ivank & sijie via ivank)
 
+        BOOKKEEPER-679: Bookie should exit with non-zero if NIOServer crashes with Error (ivank)
+
       hedwig-server:
 
         BOOKKEEPER-579: TestSubAfterCloseSub was put in a wrong package (sijie via ivank)

Modified: zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java?rev=1521028&r1=1521027&r2=1521028&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/BookieServer.java Mon Sep  9 10:29:09 2013
@@ -70,8 +70,6 @@ public class BookieServer implements NIO
     DeathWatcher deathWatcher;
     static Logger LOG = LoggerFactory.getLogger(BookieServer.class);
 
-    int exitCode = ExitCode.OK;
-
     // operation stats
     final BKStats bkStats = BKStats.getInstance();
     final boolean isStatsEnabled;
@@ -102,7 +100,6 @@ public class BookieServer implements NIO
         this.bookie.start();
         // fail fast, when bookie startup is not successful
         if (!this.bookie.isRunning()) {
-            exitCode = bookie.getExitCode();
             return;
         }
         if (isAutoRecoveryDaemonEnabled && this.autoRecoveryMain != null) {
@@ -153,7 +150,8 @@ public class BookieServer implements NIO
             return;
         }
         nioServerFactory.shutdown();
-        exitCode = bookie.shutdown();
+        bookie.shutdown();
+
         if (isAutoRecoveryDaemonEnabled && this.autoRecoveryMain != null) {
             this.autoRecoveryMain.shutdown();
         }
@@ -224,6 +222,12 @@ public class BookieServer implements NIO
     }
 
     public int getExitCode() {
+        int exitCode = bookie.getExitCode();
+        if (exitCode == ExitCode.OK) {
+            if (nioServerFactory.hasCrashed()) {
+                return ExitCode.SERVER_EXCEPTION;
+            }
+        }
         return exitCode;
     }
 

Modified: zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java?rev=1521028&r1=1521027&r2=1521028&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/main/java/org/apache/bookkeeper/proto/NIOServerFactory.java Mon Sep  9 10:29:09 2013
@@ -33,6 +33,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.bookkeeper.bookie.Bookie;
 import org.apache.bookkeeper.conf.ServerConfiguration;
@@ -77,6 +78,7 @@ public class NIOServerFactory extends Th
 
     ServerConfiguration conf;
 
+    private AtomicBoolean crashed = new AtomicBoolean(false);
     private Object suspensionLock = new Object();
     private boolean suspended = false;
 
@@ -111,6 +113,10 @@ public class NIOServerFactory extends Th
         return !ss.socket().isClosed() && isAlive();
     }
 
+    boolean hasCrashed() {
+        return crashed.get();
+    }
+
     /**
      * Stop nio server from processing requests. (for testing)
      */
@@ -166,6 +172,7 @@ public class NIOServerFactory extends Th
                 LOG.warn("Exception in server socket loop: " + ss.socket().getInetAddress(), e);
             } catch (Throwable e) {
                 LOG.error("Error in server socket loop: " + ss.socket().getInetAddress(), e);
+                crashed.set(true);
                 break;
             }
         }

Modified: zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShutdownTest.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShutdownTest.java?rev=1521028&r1=1521027&r2=1521028&view=diff
==============================================================================
--- zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShutdownTest.java (original)
+++ zookeeper/bookkeeper/branches/branch-4.2/bookkeeper-server/src/test/java/org/apache/bookkeeper/bookie/BookieShutdownTest.java Mon Sep  9 10:29:09 2013
@@ -25,7 +25,19 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.bookkeeper.conf.ServerConfiguration;
 import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
+import org.apache.bookkeeper.client.LedgerHandle;
+import org.apache.bookkeeper.client.BookKeeper;
+import org.apache.bookkeeper.client.AsyncCallback.AddCallback;
+
+import org.apache.bookkeeper.proto.BookieServer;
+import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.WriteCallback;
+
+import java.io.IOException;
+import org.apache.zookeeper.KeeperException;
+
+import java.nio.ByteBuffer;
 import org.junit.Test;
+import org.junit.Assert;
 
 public class BookieShutdownTest extends BookKeeperClusterTestCase {
 
@@ -68,4 +80,43 @@ public class BookieShutdownTest extends 
         latch.countDown();
         shutdownComplete.await(5000, TimeUnit.MILLISECONDS);
     }
+
+    /**
+     * Test whether bookieserver returns the correct error code when it crashes.
+     */
+    @Test(timeout=60000)
+    public void testBookieServerThreadError() throws Exception {
+        ServerConfiguration conf = bsConfs.get(0);
+        killBookie(0);
+        final CountDownLatch latch = new CountDownLatch(1);
+        final CountDownLatch shutdownComplete = new CountDownLatch(1);
+        // simulating ZooKeeper exception by assigning a closed zk client to bk
+        BookieServer bkServer = new BookieServer(conf) {
+            protected Bookie newBookie(ServerConfiguration conf)
+                    throws IOException, KeeperException, InterruptedException,
+                    BookieException {
+                return new Bookie(conf) {
+                    @Override
+                    public void addEntry(ByteBuffer entry, WriteCallback cb,
+                                         Object ctx, byte[] masterKey)
+                            throws IOException, BookieException {
+                        throw new OutOfMemoryError();
+                    }
+                };
+            }
+        };
+        bkServer.start();
+
+        LedgerHandle lh = bkc.createLedger(1, 1, BookKeeper.DigestType.CRC32, "passwd".getBytes());
+        lh.asyncAddEntry("test".getBytes(), new AddCallback() {
+                @Override
+                public void addComplete(int rc, LedgerHandle lh, long entryId, Object ctx) {
+                    // dont care, only trying to trigger OOM
+                }
+            }, null);
+        bkServer.join();
+        Assert.assertFalse("Should have died", bkServer.isRunning());
+        Assert.assertEquals("Should have died with server exception code",
+                            ExitCode.SERVER_EXCEPTION, bkServer.getExitCode());
+    }
 }