You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ph...@apache.org on 2017/12/06 22:14:32 UTC

zookeeper git commit: ZOOKEEPER-2924: Refactor tests of LoadFromLogTest.java

Repository: zookeeper
Updated Branches:
  refs/heads/master 75411ab34 -> d857e042f


ZOOKEEPER-2924: Refactor tests of LoadFromLogTest.java

This patch is the trunk version of https://github.com/apache/zookeeper/pull/409

Author: Andor Molnár <an...@cloudera.com>

Reviewers: phunt@apache.org

Closes #420 from anmolnar/ZOOKEEPER-2924-trunk

Change-Id: I2260247e271eb86a6d37fe297e9fb5a7be3babc0


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/d857e042
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/d857e042
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/d857e042

Branch: refs/heads/master
Commit: d857e042fe4d188a7ba750ea6947f93f39cb7ed1
Parents: 75411ab
Author: Andor Molnár <an...@cloudera.com>
Authored: Wed Dec 6 14:14:10 2017 -0800
Committer: Patrick Hunt <ph...@apache.org>
Committed: Wed Dec 6 14:14:10 2017 -0800

----------------------------------------------------------------------
 .../zookeeper/test/LoadFromLogNoServerTest.java | 176 ++++++++++
 .../apache/zookeeper/test/LoadFromLogTest.java  | 317 +++----------------
 2 files changed, 212 insertions(+), 281 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d857e042/src/java/test/org/apache/zookeeper/test/LoadFromLogNoServerTest.java
----------------------------------------------------------------------
diff --git a/src/java/test/org/apache/zookeeper/test/LoadFromLogNoServerTest.java b/src/java/test/org/apache/zookeeper/test/LoadFromLogNoServerTest.java
new file mode 100644
index 0000000..4d56f60
--- /dev/null
+++ b/src/java/test/org/apache/zookeeper/test/LoadFromLogNoServerTest.java
@@ -0,0 +1,176 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zookeeper.test;
+
+import org.apache.jute.BinaryInputArchive;
+import org.apache.jute.BinaryOutputArchive;
+import org.apache.jute.Record;
+import org.apache.zookeeper.ZKTestCase;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.common.Time;
+import org.apache.zookeeper.server.DataNode;
+import org.apache.zookeeper.server.DataTree;
+import org.apache.zookeeper.server.persistence.FileHeader;
+import org.apache.zookeeper.server.persistence.FileTxnLog;
+import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
+import org.apache.zookeeper.txn.CreateTxn;
+import org.apache.zookeeper.txn.DeleteTxn;
+import org.apache.zookeeper.txn.MultiTxn;
+import org.apache.zookeeper.txn.Txn;
+import org.apache.zookeeper.txn.TxnHeader;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoadFromLogNoServerTest extends ZKTestCase {
+    protected static final Logger LOG = LoggerFactory.getLogger(LoadFromLogNoServerTest.class);
+
+    /**
+     * For ZOOKEEPER-1046. Verify if cversion and pzxid if incremented
+     * after create/delete failure during restore.
+     */
+    @Test
+    public void testTxnFailure() throws Exception {
+        long count = 1;
+        File tmpDir = ClientBase.createTmpDir();
+        FileTxnSnapLog logFile = new FileTxnSnapLog(tmpDir, tmpDir);
+        DataTree dt = new DataTree();
+        dt.createNode("/test", new byte[0], null, 0, -1, 1, 1);
+        for (count = 1; count <= 3; count++) {
+            dt.createNode("/test/" + count, new byte[0], null, 0, -1, count,
+                    Time.currentElapsedTime());
+        }
+        DataNode zk = dt.getNode("/test");
+
+        // Make create to fail, then verify cversion.
+        LOG.info("Attempting to create " + "/test/" + (count - 1));
+        doOp(logFile, ZooDefs.OpCode.create, "/test/" + (count - 1), dt, zk, -1);
+
+        LOG.info("Attempting to create " + "/test/" + (count - 1));
+        doOp(logFile, ZooDefs.OpCode.create, "/test/" + (count - 1), dt, zk,
+                zk.stat.getCversion() + 1);
+
+        LOG.info("Attempting to create " + "/test/" + (count - 1));
+        doOp(logFile, ZooDefs.OpCode.multi, "/test/" + (count - 1), dt, zk,
+                zk.stat.getCversion() + 1);
+
+        LOG.info("Attempting to create " + "/test/" + (count - 1));
+        doOp(logFile, ZooDefs.OpCode.multi, "/test/" + (count - 1), dt, zk,
+                -1);
+
+        // Make delete fo fail, then verify cversion.
+        // this doesn't happen anymore, we only set the cversion on create
+        // LOG.info("Attempting to delete " + "/test/" + (count + 1));
+        // doOp(logFile, OpCode.delete, "/test/" + (count + 1), dt, zk);
+    }
+
+    /*
+     * Does create/delete depending on the type and verifies
+     * if cversion before the operation is 1 less than cversion afer.
+     */
+    private void doOp(FileTxnSnapLog logFile, int type, String path,
+                      DataTree dt, DataNode parent, int cversion) throws Exception {
+        int lastSlash = path.lastIndexOf('/');
+        String parentName = path.substring(0, lastSlash);
+
+        int prevCversion = parent.stat.getCversion();
+        long prevPzxid = parent.stat.getPzxid();
+        List<String> child = dt.getChildren(parentName, null, null);
+        StringBuilder childStr = new StringBuilder();
+        for (String s : child) {
+            childStr.append(s).append(" ");
+        }
+        LOG.info("Children: " + childStr + " for " + parentName);
+        LOG.info("(cverions, pzxid): " + prevCversion + ", " + prevPzxid);
+
+        Record txn = null;
+        TxnHeader txnHeader = null;
+        if (type == ZooDefs.OpCode.delete) {
+            txn = new DeleteTxn(path);
+            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
+                    Time.currentElapsedTime(), ZooDefs.OpCode.delete);
+        } else if (type == ZooDefs.OpCode.create) {
+            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
+                    Time.currentElapsedTime(), ZooDefs.OpCode.create);
+            txn = new CreateTxn(path, new byte[0], null, false, cversion);
+        }
+        else if (type == ZooDefs.OpCode.multi) {
+            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
+                    Time.currentElapsedTime(), ZooDefs.OpCode.create);
+            txn = new CreateTxn(path, new byte[0], null, false, cversion);
+            List<Txn> txnList = new ArrayList<Txn>();
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos);
+            txn.serialize(boa, "request") ;
+            ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
+            Txn txact = new Txn(ZooDefs.OpCode.create,  bb.array());
+            txnList.add(txact);
+            txn = new MultiTxn(txnList);
+            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
+                    Time.currentElapsedTime(), ZooDefs.OpCode.multi);
+        }
+        logFile.processTransaction(txnHeader, dt, null, txn);
+
+        int newCversion = parent.stat.getCversion();
+        long newPzxid = parent.stat.getPzxid();
+        child = dt.getChildren(parentName, null, null);
+        childStr = new StringBuilder();
+        for (String s : child) {
+            childStr.append(s).append(" ");
+        }
+        LOG.info("Children: " + childStr + " for " + parentName);
+        LOG.info("(cverions, pzxid): " +newCversion + ", " + newPzxid);
+        Assert.assertTrue(type + " <cversion, pzxid> verification failed. Expected: <" +
+                        (prevCversion + 1) + ", " + (prevPzxid + 1) + ">, found: <" +
+                        newCversion + ", " + newPzxid + ">",
+                (newCversion == prevCversion + 1 && newPzxid == prevPzxid + 1));
+    }
+
+    /**
+     * Simulates ZOOKEEPER-1069 and verifies that flush() before padLogFile
+     * fixes it.
+     */
+    @Test
+    public void testPad() throws Exception {
+        File tmpDir = ClientBase.createTmpDir();
+        FileTxnLog txnLog = new FileTxnLog(tmpDir);
+        TxnHeader txnHeader = new TxnHeader(0xabcd, 0x123, 0x123,
+                Time.currentElapsedTime(), ZooDefs.OpCode.create);
+        Record txn = new CreateTxn("/Test", new byte[0], null, false, 1);
+        txnLog.append(txnHeader, txn);
+        FileInputStream in = new FileInputStream(tmpDir.getPath() + "/log." +
+                Long.toHexString(txnHeader.getZxid()));
+        BinaryInputArchive ia  = BinaryInputArchive.getArchive(in);
+        FileHeader header = new FileHeader();
+        header.deserialize(ia, "fileheader");
+        LOG.info("Received magic : " + header.getMagic() +
+                " Expected : " + FileTxnLog.TXNLOG_MAGIC);
+        Assert.assertTrue("Missing magic number ",
+                header.getMagic() == FileTxnLog.TXNLOG_MAGIC);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/d857e042/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
----------------------------------------------------------------------
diff --git a/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java b/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
index 591cf23..90de755 100644
--- a/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
+++ b/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
@@ -18,50 +18,29 @@
 
 package org.apache.zookeeper.test;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.zookeeper.common.Time;
-import org.apache.jute.BinaryInputArchive;
-import org.apache.jute.BinaryOutputArchive;
-import org.apache.jute.Record;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException.NoNodeException;
-import org.apache.zookeeper.PortAssignment;
-import org.apache.zookeeper.ZKTestCase;
 import org.apache.zookeeper.ZooDefs.Ids;
-import org.apache.zookeeper.ZooDefs.OpCode;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.Stat;
-import org.apache.zookeeper.server.DataNode;
-import org.apache.zookeeper.server.DataTree;
-import org.apache.zookeeper.server.ServerCnxnFactory;
 import org.apache.zookeeper.server.SyncRequestProcessor;
 import org.apache.zookeeper.server.ZooKeeperServer;
-import org.apache.zookeeper.server.persistence.FileHeader;
 import org.apache.zookeeper.server.persistence.FileTxnLog;
-import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
-import org.apache.zookeeper.server.persistence.Util;
 import org.apache.zookeeper.server.persistence.FileTxnLog.FileTxnIterator;
+import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
 import org.apache.zookeeper.server.persistence.TxnLog.TxnIterator;
-import org.apache.zookeeper.txn.CreateTxn;
-import org.apache.zookeeper.txn.DeleteTxn;
-import org.apache.zookeeper.txn.MultiTxn;
-import org.apache.zookeeper.txn.Txn;
+import org.apache.zookeeper.server.persistence.Util;
 import org.apache.zookeeper.txn.TxnHeader;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class LoadFromLogTest extends ZKTestCase {
-    private static final String HOST = "127.0.0.1:";
-    private static final int CONNECTION_TIMEOUT = 3000;
+import java.io.File;
+import java.io.IOException;
+
+public class LoadFromLogTest extends ClientBase {
     private static final int NUM_MESSAGES = 300;
     protected static final Logger LOG = LoggerFactory.getLogger(LoadFromLogTest.class);
 
@@ -69,26 +48,20 @@ public class LoadFromLogTest extends ZKTestCase {
     private static final int TRANSACTION_OVERHEAD = 2;
     private static final int TOTAL_TRANSACTIONS = NUM_MESSAGES + TRANSACTION_OVERHEAD;
 
+    @Before
+    public void setUp() throws Exception {
+        SyncRequestProcessor.setSnapCount(50);
+        super.setUp();
+    }
+
     /**
      * test that all transactions from the Log are loaded, and only once
      * @throws Exception an exception might be thrown here
      */
     @Test
     public void testLoad() throws Exception {
-        final String hostPort = HOST + PortAssignment.unique();
-        // setup a single server cluster
-        File tmpDir = ClientBase.createTmpDir();
-        ClientBase.setupTestEnv();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(100);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ",
-                ClientBase.waitForServerUp(hostPort,CONNECTION_TIMEOUT));
-        ZooKeeper zk = ClientBase.createZKClient(hostPort);
-
         // generate some transactions that will get logged
+        ZooKeeper zk = createZKClient(hostPort);
         try {
             for (int i = 0; i< NUM_MESSAGES; i++) {
                 zk.create("/invalidsnap-" + i, new byte[0], Ids.OPEN_ACL_UNSAFE,
@@ -97,14 +70,11 @@ public class LoadFromLogTest extends ZKTestCase {
         } finally {
             zk.close();
         }
-        f.shutdown();
-        Assert.assertTrue("waiting for server to shutdown",
-                ClientBase.waitForServerDown(hostPort, CONNECTION_TIMEOUT));
+        stopServer();
 
         // now verify that the FileTxnLog reads every transaction only once
         File logDir = new File(tmpDir, FileTxnSnapLog.version + FileTxnSnapLog.VERSION);
         FileTxnLog txnLog = new FileTxnLog(logDir);
-
         TxnIterator itr = txnLog.read(0);
         
         // Check that storage space return some value
@@ -126,7 +96,6 @@ public class LoadFromLogTest extends ZKTestCase {
         }while(itr.next());
 
         Assert.assertTrue("processed all transactions. " + expectedZxid + " == " + TOTAL_TRANSACTIONS, (expectedZxid == TOTAL_TRANSACTIONS));
-        zks.shutdown();
     }
 
     /**
@@ -136,21 +105,8 @@ public class LoadFromLogTest extends ZKTestCase {
      */
     @Test
     public void testLoadFailure() throws Exception {
-        final String hostPort = HOST + PortAssignment.unique();
-        // setup a single server cluster
-        File tmpDir = ClientBase.createTmpDir();
-        ClientBase.setupTestEnv();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        // So we have at least 4 logs
-        SyncRequestProcessor.setSnapCount(50);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ",
-                ClientBase.waitForServerUp(hostPort,CONNECTION_TIMEOUT));
-        ZooKeeper zk = ClientBase.createZKClient(hostPort);
-
         // generate some transactions that will get logged
+        ZooKeeper zk = createZKClient(hostPort);
         try {
             for (int i = 0; i< NUM_MESSAGES; i++) {
                 zk.create("/data-", new byte[0], Ids.OPEN_ACL_UNSAFE,
@@ -159,14 +115,12 @@ public class LoadFromLogTest extends ZKTestCase {
         } finally {
             zk.close();
         }
-        f.shutdown();
-        Assert.assertTrue("waiting for server to shutdown",
-                ClientBase.waitForServerDown(hostPort, CONNECTION_TIMEOUT));
+        stopServer();
 
         File logDir = new File(tmpDir, FileTxnSnapLog.version + FileTxnSnapLog.VERSION);
         File[] logFiles = FileTxnLog.getLogFiles(logDir.listFiles(), 0);
-        // Verify that we have at least 4 txnlog
-        Assert.assertTrue(logFiles.length > 4);
+        // Verify that we have at least NUM_MESSAGES / SNAPCOUNT txnlog
+        Assert.assertTrue(logFiles.length > NUM_MESSAGES / 100);
         // Delete the first log file, so we will fail to read it back from disk
         Assert.assertTrue("delete the first log file", logFiles[0].delete());
 
@@ -201,129 +155,6 @@ public class LoadFromLogTest extends ZKTestCase {
         nextZxid = itr.getHeader().getZxid();
         itr = txnLog.read(nextZxid, false);
         Assert.assertEquals(secondStartZxid, itr.getHeader().getZxid());
-
-    }
-
-    /**
-     * For ZOOKEEPER-1046. Verify if cversion and pzxid if incremented
-     * after create/delete failure during restore.
-     */
-    @Test
-    public void testTxnFailure() throws Exception {
-        long count = 1;
-        File tmpDir = ClientBase.createTmpDir();
-        FileTxnSnapLog logFile = new FileTxnSnapLog(tmpDir, tmpDir);
-        DataTree dt = new DataTree();
-        dt.createNode("/test", new byte[0], null, 0, -1, 1, 1);
-        for (count = 1; count <= 3; count++) {
-            dt.createNode("/test/" + count, new byte[0], null, 0, -1, count,
-                    Time.currentElapsedTime());
-        }
-        DataNode zk = dt.getNode("/test");
-
-        // Make create to fail, then verify cversion.
-        LOG.info("Attempting to create " + "/test/" + (count - 1));
-        doOp(logFile, OpCode.create, "/test/" + (count - 1), dt, zk, -1);
-
-        LOG.info("Attempting to create " + "/test/" + (count - 1));
-        doOp(logFile, OpCode.create, "/test/" + (count - 1), dt, zk,
-                zk.stat.getCversion() + 1);
-
-        LOG.info("Attempting to create " + "/test/" + (count - 1));
-        doOp(logFile, OpCode.multi, "/test/" + (count - 1), dt, zk,
-                zk.stat.getCversion() + 1);
-
-        LOG.info("Attempting to create " + "/test/" + (count - 1));
-        doOp(logFile, OpCode.multi, "/test/" + (count - 1), dt, zk,
-                -1);
-
-        // Make delete fo fail, then verify cversion.
-        // this doesn't happen anymore, we only set the cversion on create
-        // LOG.info("Attempting to delete " + "/test/" + (count + 1));
-        // doOp(logFile, OpCode.delete, "/test/" + (count + 1), dt, zk);
-    }
-    /*
-     * Does create/delete depending on the type and verifies
-     * if cversion before the operation is 1 less than cversion afer.
-     */
-    private void doOp(FileTxnSnapLog logFile, int type, String path,
-            DataTree dt, DataNode parent, int cversion) throws Exception {
-        int lastSlash = path.lastIndexOf('/');
-        String parentName = path.substring(0, lastSlash);
-
-        int prevCversion = parent.stat.getCversion();
-        long prevPzxid = parent.stat.getPzxid();
-        List<String> child = dt.getChildren(parentName, null, null);
-        StringBuilder childStr = new StringBuilder();
-        for (String s : child) {
-            childStr.append(s).append(" ");
-        }
-        LOG.info("Children: " + childStr + " for " + parentName);
-        LOG.info("(cverions, pzxid): " + prevCversion + ", " + prevPzxid);
-
-        Record txn = null;
-        TxnHeader txnHeader = null;
-        if (type == OpCode.delete) {
-            txn = new DeleteTxn(path);
-            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
-                Time.currentElapsedTime(), OpCode.delete);
-        } else if (type == OpCode.create) {
-            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
-                    Time.currentElapsedTime(), OpCode.create);
-            txn = new CreateTxn(path, new byte[0], null, false, cversion);
-        }
-        else if (type == OpCode.multi) {
-            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
-                    Time.currentElapsedTime(), OpCode.create);
-            txn = new CreateTxn(path, new byte[0], null, false, cversion);
-            List<Txn> txnList = new ArrayList<Txn>();
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos);
-            txn.serialize(boa, "request") ;
-            ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
-            Txn txact = new Txn(OpCode.create,  bb.array());
-            txnList.add(txact);
-            txn = new MultiTxn(txnList);
-            txnHeader = new TxnHeader(0xabcd, 0x123, prevPzxid + 1,
-                    Time.currentElapsedTime(), OpCode.multi);
-        }
-        logFile.processTransaction(txnHeader, dt, null, txn);
-
-        int newCversion = parent.stat.getCversion();
-        long newPzxid = parent.stat.getPzxid();
-        child = dt.getChildren(parentName, null, null);
-        childStr = new StringBuilder();
-        for (String s : child) {
-            childStr.append(s).append(" ");
-        }
-        LOG.info("Children: " + childStr + " for " + parentName);
-        LOG.info("(cverions, pzxid): " +newCversion + ", " + newPzxid);
-        Assert.assertTrue(type + " <cversion, pzxid> verification failed. Expected: <" +
-                (prevCversion + 1) + ", " + (prevPzxid + 1) + ">, found: <" +
-                newCversion + ", " + newPzxid + ">",
-                (newCversion == prevCversion + 1 && newPzxid == prevPzxid + 1));
-    }
-    /**
-     * Simulates ZOOKEEPER-1069 and verifies that flush() before padLogFile
-     * fixes it.
-     */
-    @Test
-    public void testPad() throws Exception {
-        File tmpDir = ClientBase.createTmpDir();
-        FileTxnLog txnLog = new FileTxnLog(tmpDir);
-        TxnHeader txnHeader = new TxnHeader(0xabcd, 0x123, 0x123,
-              Time.currentElapsedTime(), OpCode.create);
-        Record txn = new CreateTxn("/Test", new byte[0], null, false, 1);
-        txnLog.append(txnHeader, txn);
-        FileInputStream in = new FileInputStream(tmpDir.getPath() + "/log." +
-              Long.toHexString(txnHeader.getZxid()));
-        BinaryInputArchive ia  = BinaryInputArchive.getArchive(in);
-        FileHeader header = new FileHeader();
-        header.deserialize(ia, "fileheader");
-        LOG.info("Received magic : " + header.getMagic() +
-              " Expected : " + FileTxnLog.TXNLOG_MAGIC);
-        Assert.assertTrue("Missing magic number ",
-              header.getMagic() == FileTxnLog.TXNLOG_MAGIC);
     }
 
     /**
@@ -332,20 +163,8 @@ public class LoadFromLogTest extends ZKTestCase {
      */
     @Test
     public void testRestore() throws Exception {
-        final String hostPort = HOST + PortAssignment.unique();
-        // setup a single server cluster
-        File tmpDir = ClientBase.createTmpDir();
-        ClientBase.setupTestEnv();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ", ClientBase
-                .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-        ZooKeeper zk = getConnectedZkClient(hostPort);
-
         // generate some transactions
+        ZooKeeper zk = createZKClient(hostPort);
         String lastPath = null;
         try {
             zk.create("/invalidsnap", new byte[0], Ids.OPEN_ACL_UNSAFE,
@@ -361,6 +180,7 @@ public class LoadFromLogTest extends ZKTestCase {
         String expectedPath = "/invalidsnap/test-"
                 + String.format("%010d",
                 (new Integer(tokens[1])).intValue() + 1);
+        ZooKeeperServer zks = getServer(serverFactory);
         long eZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
         // force the zxid to be behind the content
         zks.getZKDatabase().setlastProcessedZxid(
@@ -370,20 +190,16 @@ public class LoadFromLogTest extends ZKTestCase {
         // Force snapshot and restore
         zks.takeSnapshot();
         zks.shutdown();
-        f.shutdown();
+        stopServer();
 
-        zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ", ClientBase
-                .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
+        startServer();
+        zks = getServer(serverFactory);
         long fZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
 
         // Verify lastProcessedZxid is set correctly
         Assert.assertTrue("Restore failed expected zxid=" + eZxid + " found="
                 + fZxid, fZxid == eZxid);
-        zk = getConnectedZkClient(hostPort);
+        zk = createZKClient(hostPort);
 
         // Verify correctness of data and whether sequential znode creation
         // proceeds correctly after this point
@@ -403,8 +219,6 @@ public class LoadFromLogTest extends ZKTestCase {
         Assert.assertTrue("Unexpected number of children " + children.length
                         + " expected " + NUM_MESSAGES,
                 (children.length == NUM_MESSAGES));
-        f.shutdown();
-        zks.shutdown();
     }
 
     /**
@@ -413,20 +227,8 @@ public class LoadFromLogTest extends ZKTestCase {
      */
     @Test
     public void testRestoreWithTransactionErrors() throws Exception {
-        final String hostPort = HOST + PortAssignment.unique();
-        // setup a single server cluster
-        File tmpDir = ClientBase.createTmpDir();
-        ClientBase.setupTestEnv();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ", ClientBase
-                .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-        ZooKeeper zk = getConnectedZkClient(hostPort);
-
         // generate some transactions
+        ZooKeeper zk = createZKClient(hostPort);
         try {
             for (int i = 0; i < NUM_MESSAGES; i++) {
                 try {
@@ -441,6 +243,7 @@ public class LoadFromLogTest extends ZKTestCase {
         }
 
         // force the zxid to be behind the content
+        ZooKeeperServer zks = getServer(serverFactory);
         zks.getZKDatabase().setlastProcessedZxid(
                 zks.getZKDatabase().getDataTreeLastProcessedZxid() - 10);
         LOG.info("Set lastProcessedZxid to "
@@ -449,17 +252,10 @@ public class LoadFromLogTest extends ZKTestCase {
         // Force snapshot and restore
         zks.takeSnapshot();
         zks.shutdown();
-        f.shutdown();
+        stopServer();
 
         zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ", ClientBase
-                .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-
-        f.shutdown();
-        zks.shutdown();
+        startServer();
     }
 
     /**
@@ -467,32 +263,13 @@ public class LoadFromLogTest extends ZKTestCase {
      */
     @Test
     public void testDatadirAutocreate() throws Exception {
-        ClientBase.setupTestEnv();
-        final String hostPort = HOST + PortAssignment.unique();
-        // first verify the default (autocreate on) works
-        File tmpDir = ClientBase.createTmpDir();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ", ClientBase
-                .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-        zks.shutdown();
-        f.shutdown();
-        Assert.assertTrue("waiting for server being down ", ClientBase
-                .waitForServerDown(hostPort, CONNECTION_TIMEOUT));
+        stopServer();
 
         try {
             // now verify autocreate off works
             System.setProperty(FileTxnSnapLog.ZOOKEEPER_DATADIR_AUTOCREATE, "false");
-
-            tmpDir = ClientBase.createTmpDir();
-            zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-            f = ServerCnxnFactory.createFactory(PORT, -1);
-            f.startup(zks);
-            Assert.assertTrue("waiting for server being up ", ClientBase
-                    .waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-
+            tmpDir = createTmpDir();
+            startServer();
             Assert.fail("Server should not have started without datadir");
         } catch (IOException e) {
             LOG.info("Server failed to start - correct behavior " + e);
@@ -508,20 +285,8 @@ public class LoadFromLogTest extends ZKTestCase {
      */
     @Test
     public void testReloadSnapshotWithMissingParent() throws Exception {
-        final String hostPort = HOST + PortAssignment.unique();
-        // setup a single server cluster
-        File tmpDir = ClientBase.createTmpDir();
-        ClientBase.setupTestEnv();
-        ZooKeeperServer zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        final int PORT = Integer.parseInt(hostPort.split(":")[1]);
-        ServerCnxnFactory f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ",
-                ClientBase.waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-        ZooKeeper zk = getConnectedZkClient(hostPort);
-
         // create transactions to create the snapshot with create/delete pattern
+        ZooKeeper zk = createZKClient(hostPort);
         zk.create("/a", "".getBytes(), Ids.OPEN_ACL_UNSAFE,
                 CreateMode.PERSISTENT);
         Stat stat = zk.exists("/a", false);
@@ -531,25 +296,15 @@ public class LoadFromLogTest extends ZKTestCase {
         zk.delete("/a/b", -1);
         zk.delete("/a", -1);
         // force the zxid to be behind the content
+        ZooKeeperServer zks = getServer(serverFactory);
         zks.getZKDatabase().setlastProcessedZxid(createZxId);
         LOG.info("Set lastProcessedZxid to {}", zks.getZKDatabase()
                 .getDataTreeLastProcessedZxid());
         // Force snapshot and restore
         zks.takeSnapshot();
         zks.shutdown();
-        f.shutdown();
-
-        zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
-        SyncRequestProcessor.setSnapCount(10000);
-        f = ServerCnxnFactory.createFactory(PORT, -1);
-        f.startup(zks);
-        Assert.assertTrue("waiting for server being up ",
-                ClientBase.waitForServerUp(hostPort, CONNECTION_TIMEOUT));
-        f.shutdown();
-    }
+        stopServer();
 
-    private ZooKeeper getConnectedZkClient(String host) throws Exception {
-        ZooKeeper zk = ClientBase.createZKClient(host);
-        return zk;
+        startServer();
     }
 }