Author: phunt Date: Fri May 22 07:43:14 2009 New Revision: 777419 URL: http://svn.apache.org/viewvc?rev=777419&view=rev Log: ZOOKEEPER-385. crctest failed on hudson patch test
Modified: hadoop/zookeeper/trunk/CHANGES.txt hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/CRCTest.java Modified: hadoop/zookeeper/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=777419&r1=777418&r2=777419&view=diff ============================================================================== --- hadoop/zookeeper/trunk/CHANGES.txt (original) +++ hadoop/zookeeper/trunk/CHANGES.txt Fri May 22 07:43:14 2009 @@ -94,6 +94,8 @@ ZOOKEEPER-415. zookeeper c tests hang. (mahadev via phunt) + ZOOKEEPER-385. crctest failed on hudson patch test (mahadev via phunt) + IMPROVEMENTS: ZOOKEEPER-308. improve the atomic broadcast performance 3x. (breed via mahadev) Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/CRCTest.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/CRCTest.java?rev=777419&r1=777418&r2=777419&view=diff ============================================================================== --- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/CRCTest.java (original) +++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/CRCTest.java Fri May 22 07:43:14 2009 @@ -26,6 +26,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; @@ -81,6 +82,33 @@ raf.close(); } + /** return if checksum matches for a snapshot **/ + private boolean getCheckSum(FileSnap snap, File snapFile) throws IOException { + DataTree dt = new DataTree(); + Map<Long, Integer> sessions = new ConcurrentHashMap<Long, Integer>(); + InputStream snapIS = new BufferedInputStream(new FileInputStream( + snapFile)); + CheckedInputStream crcIn = new CheckedInputStream(snapIS, new Adler32()); + InputArchive ia = BinaryInputArchive.getArchive(crcIn); + try { + snap.deserialize(dt, sessions, ia); + } catch (IOException ie) { + // we failed on the most recent snapshot + // must be incomplete + // try reading the next one + // after corrupting + snapIS.close(); + crcIn.close(); + throw ie; + } + + long checksum = crcIn.getChecksum().getValue(); + long val = ia.readLong("val"); + snapIS.close(); + crcIn.close(); + return (val != checksum); + } + /** test checksums for the logs and snapshots. * the reader should fail on reading * a corrupt snapshot and a corrupt log @@ -134,21 +162,21 @@ itr.close(); // find the last snapshot FileSnap snap = new FileSnap(versionDir); - snapFile = snap.findMostRecentSnapshot(); - // corrupt this file + List<File> snapFiles = snap.findNRecentSnapshots(2); + snapFile = snapFiles.get(0); corruptFile(snapFile); - DataTree dt = new DataTree(); - Map<Long, Integer> sessions = - new ConcurrentHashMap<Long, Integer>(); - InputStream snapIS = new BufferedInputStream(new FileInputStream(snapFile)); - CheckedInputStream crcIn = new CheckedInputStream(snapIS, new Adler32()); - InputArchive ia=BinaryInputArchive.getArchive(crcIn); - snap.deserialize(dt,sessions, ia); - long checkSum = crcIn.getChecksum().getValue(); - long val = ia.readLong("val"); - snapIS.close(); - crcIn.close(); - assertTrue(val != checkSum); + boolean cfile = false; + try { + cfile = getCheckSum(snap, snapFile); + } catch(IOException ie) { + //the last snapshot seems incompelte + // corrupt the last but one + // and use that + snapFile = snapFiles.get(1); + corruptFile(snapFile); + cfile = getCheckSum(snap, snapFile); + } + assertTrue(cfile); } public void process(WatchedEvent event) {