You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ca...@apache.org on 2011/06/05 22:54:36 UTC
svn commit: r1132489 - in /zookeeper/trunk: CHANGES.txt
src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java
src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
Author: camille
Date: Sun Jun 5 20:54:36 2011
New Revision: 1132489
URL: http://svn.apache.org/viewvc?rev=1132489&view=rev
Log:
ZOOKEEPER-1069: Calling shutdown() on a QuorumPeer too quickly can lead to a corrupt log
Modified:
zookeeper/trunk/CHANGES.txt
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java
zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1132489&r1=1132488&r2=1132489&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Sun Jun 5 20:54:36 2011
@@ -216,6 +216,8 @@ BUGFIXES:
ZOOKEEPER-1058. fix typo in opToString for getData. (camille)
ZOOKEEPER-1046. Creating a new sequential node results in a ZNODEEXISTS error. (Vishal K via camille)
+
+ ZOOKEEPER-1069. Calling shutdown() on a QuorumPeer too quickly can lead to a corrupt log. (Vishal K via camille)
IMPROVEMENTS:
ZOOKEEPER-724. Improve junit test integration - log harness information
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java?rev=1132489&r1=1132488&r2=1132489&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/persistence/FileTxnLog.java Sun Jun 5 20:54:36 2011
@@ -206,6 +206,8 @@ public class FileTxnLog implements TxnLo
oa = BinaryOutputArchive.getArchive(logStream);
FileHeader fhdr = new FileHeader(TXNLOG_MAGIC,VERSION, dbId);
fhdr.serialize(oa, "fileheader");
+ // Make sure that the magic number is written before padding.
+ logStream.flush();
currentSize = fos.getChannel().position();
streamsToFlush.add(fos);
}
Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java?rev=1132489&r1=1132488&r2=1132489&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LoadFromLogTest.java Sun Jun 5 20:54:36 2011
@@ -46,6 +46,9 @@ import org.apache.zookeeper.txn.DeleteTx
import org.apache.zookeeper.txn.TxnHeader;
import org.apache.zookeeper.ZooDefs.OpCode;
import org.apache.jute.Record;
+import java.io.FileInputStream;
+import org.apache.jute.BinaryInputArchive;
+import org.apache.zookeeper.server.persistence.FileHeader;
public class LoadFromLogTest extends ZKTestCase implements Watcher {
private static String HOSTPORT = "127.0.0.1:" + PortAssignment.unique();
@@ -185,4 +188,26 @@ public class LoadFromLogTest extends ZKT
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,
+ System.currentTimeMillis(), OpCode.create);
+ Record txn = new CreateTxn("/Test", new byte[0], null, false);
+ 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("Expected header :" + header.getMagic() +
+ " Received : " + FileTxnLog.TXNLOG_MAGIC);
+ Assert.assertTrue("Missing magic number ",
+ header.getMagic() == FileTxnLog.TXNLOG_MAGIC);
+ }
}