Return-Path: Delivered-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Received: (qmail 92470 invoked from network); 11 Apr 2011 17:15:51 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 11 Apr 2011 17:15:51 -0000 Received: (qmail 13479 invoked by uid 500); 11 Apr 2011 17:15:51 -0000 Delivered-To: apmail-hadoop-hdfs-commits-archive@hadoop.apache.org Received: (qmail 13427 invoked by uid 500); 11 Apr 2011 17:15:50 -0000 Mailing-List: contact hdfs-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hdfs-dev@hadoop.apache.org Delivered-To: mailing list hdfs-commits@hadoop.apache.org Received: (qmail 13419 invoked by uid 99); 11 Apr 2011 17:15:50 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 11 Apr 2011 17:15:50 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 11 Apr 2011 17:15:48 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 6BE3A23889B1; Mon, 11 Apr 2011 17:15:28 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1091131 - in /hadoop/hdfs/trunk: ./ src/java/org/apache/hadoop/hdfs/protocol/ src/java/org/apache/hadoop/hdfs/server/namenode/ src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/ src/java/org/apache/hadoop/hdfs/tools/offlineImageView... Date: Mon, 11 Apr 2011 17:15:28 -0000 To: hdfs-commits@hadoop.apache.org From: hairong@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110411171528.6BE3A23889B1@eris.apache.org> Author: hairong Date: Mon Apr 11 17:15:27 2011 New Revision: 1091131 URL: http://svn.apache.org/viewvc?rev=1091131&view=rev Log: HDFS-1630. Support fsedits checksum. Contrbuted by Hairong Kuang. Modified: hadoop/hdfs/trunk/CHANGES.txt hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/BackupImage.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/ImageLoaderCurrent.java hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestEditLog.java Modified: hadoop/hdfs/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/CHANGES.txt?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/CHANGES.txt (original) +++ hadoop/hdfs/trunk/CHANGES.txt Mon Apr 11 17:15:27 2011 @@ -25,6 +25,8 @@ Trunk (unreleased changes) for transferring RBW/Finalized with acknowledgement and without using RPC. (szetszwo) + HDFS_1630. Support fsedits checksum. (hairong) + IMPROVEMENTS HDFS-1510. Added test-patch.properties required by test-patch.sh (nigel) Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java Mon Apr 11 17:15:27 2011 @@ -88,7 +88,7 @@ public interface FSConstants { // Version is reflected in the data storage file. // Versions are negative. // Decrement LAYOUT_VERSION to define a new version. - public static final int LAYOUT_VERSION = -27; + public static final int LAYOUT_VERSION = -28; // Current version: - // -27: remove intentionally corrupt pre-0.13 image directory + // -28: Support fsedits checksum } Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/BackupImage.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/BackupImage.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/BackupImage.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/BackupImage.java Mon Apr 11 17:15:27 2011 @@ -17,12 +17,15 @@ */ package org.apache.hadoop.hdfs.server.namenode; +import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Collection; import java.util.Iterator; +import java.util.zip.CheckedInputStream; +import java.util.zip.Checksum; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.hdfs.server.common.HdfsConstants; @@ -226,8 +229,15 @@ public class BackupImage extends FSImage // update NameSpace in memory backupInputStream.setBytes(data); FSEditLogLoader logLoader = new FSEditLogLoader(namesystem); - logLoader.loadEditRecords(storage.getLayoutVersion(), - backupInputStream.getDataInputStream(), true); + int logVersion = storage.getLayoutVersion(); + BufferedInputStream bin = new BufferedInputStream(backupInputStream); + DataInputStream in = new DataInputStream(bin); + Checksum checksum = null; + if (logVersion <= -28) { // support fsedits checksum + checksum = FSEditLog.getChecksum(); + in = new DataInputStream(new CheckedInputStream(bin, checksum)); + } + logLoader.loadEditRecords(logVersion, in, checksum, true); getFSNamesystem().dir.updateCountForINodeWithQuota(); // inefficient! break; case INPROGRESS: @@ -346,14 +356,21 @@ public class BackupImage extends FSImage if(jSpoolFile.exists()) { // load edits.new EditLogFileInputStream edits = new EditLogFileInputStream(jSpoolFile); - DataInputStream in = edits.getDataInputStream(); + BufferedInputStream bin = new BufferedInputStream(edits); + DataInputStream in = new DataInputStream(bin); FSEditLogLoader logLoader = new FSEditLogLoader(namesystem); - numEdits += logLoader.loadFSEdits(in, false); + int logVersion = logLoader.readLogVersion(in); + Checksum checksum = null; + if (logVersion <= -28) { // support fsedits checksum + checksum = FSEditLog.getChecksum(); + in = new DataInputStream(new CheckedInputStream(bin, checksum)); + } + numEdits += logLoader.loadEditRecords(logVersion, in, checksum, false); // first time reached the end of spool jsState = JSpoolState.WAIT; - numEdits += logLoader.loadEditRecords(storage.getLayoutVersion(), - in, true); + numEdits += logLoader.loadEditRecords(logVersion, + in, checksum, true); getFSNamesystem().dir.updateCountForINodeWithQuota(); edits.close(); } Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java Mon Apr 11 17:15:27 2011 @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.util.zip.Checksum; import org.apache.hadoop.hdfs.protocol.FSConstants; import org.apache.hadoop.io.DataOutputBuffer; @@ -84,10 +85,18 @@ class EditLogFileOutputStream extends Ed /** {@inheritDoc} */ @Override void write(byte op, Writable... writables) throws IOException { + int start = bufCurrent.getLength(); write(op); for (Writable w : writables) { w.write(bufCurrent); } + // write transaction checksum + int end = bufCurrent.getLength(); + Checksum checksum = FSEditLog.getChecksum(); + checksum.reset(); + checksum.update(bufCurrent.getData(), start, end-start); + int sum = (int)checksum.getValue(); + bufCurrent.writeInt(sum); } /** Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java Mon Apr 11 17:15:27 2011 @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.zip.Checksum; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -47,6 +48,7 @@ import org.apache.hadoop.io.BytesWritabl import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Writable; import org.apache.hadoop.security.token.delegation.DelegationKey; +import org.apache.hadoop.util.PureJavaCrc32; import static org.apache.hadoop.hdfs.server.namenode.FSEditLogOpCodes.*; @@ -90,6 +92,18 @@ public class FSEditLog implements NNStor private NNStorage storage; + private static ThreadLocal localChecksum = + new ThreadLocal() { + protected Checksum initialValue() { + return new PureJavaCrc32(); + } + }; + + /** Get a thread local checksum */ + public static Checksum getChecksum() { + return localChecksum.get(); + } + private static class TransactionId { public long txid; Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogLoader.java Mon Apr 11 17:15:27 2011 @@ -17,12 +17,16 @@ */ package org.apache.hadoop.hdfs.server.namenode; +import java.io.BufferedInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutput; import java.io.EOFException; import java.io.IOException; +import java.util.zip.CheckedInputStream; +import java.util.zip.Checksum; +import org.apache.hadoop.fs.ChecksumException; import org.apache.hadoop.fs.Options.Rename; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.PermissionStatus; @@ -54,42 +58,62 @@ public class FSEditLogLoader { * along. */ int loadFSEdits(EditLogInputStream edits) throws IOException { - DataInputStream in = edits.getDataInputStream(); long startTime = now(); - int numEdits = loadFSEdits(in, true); + int numEdits = loadFSEdits(edits, true); FSImage.LOG.info("Edits file " + edits.getName() + " of size " + edits.length() + " edits # " + numEdits + " loaded in " + (now()-startTime)/1000 + " seconds."); return numEdits; } - int loadFSEdits(DataInputStream in, boolean closeOnExit) throws IOException { + /** + * Read the header of fsedit log + * @param in fsedit stream + * @return the edit log version number + * @throws IOException if error occurs + */ + int readLogVersion(DataInputStream in) throws IOException { + int logVersion = 0; + // Read log file version. Could be missing. + in.mark(4); + // If edits log is greater than 2G, available method will return negative + // numbers, so we avoid having to call available + boolean available = true; + try { + logVersion = in.readByte(); + } catch (EOFException e) { + available = false; + } + if (available) { + in.reset(); + logVersion = in.readInt(); + if (logVersion < FSConstants.LAYOUT_VERSION) // future version + throw new IOException( + "Unexpected version of the file system log file: " + + logVersion + ". Current version = " + + FSConstants.LAYOUT_VERSION + "."); + } + assert logVersion <= Storage.LAST_UPGRADABLE_LAYOUT_VERSION : + "Unsupported version " + logVersion; + return logVersion; + } + + int loadFSEdits(EditLogInputStream edits, boolean closeOnExit) throws IOException { + BufferedInputStream bin = new BufferedInputStream(edits); + DataInputStream in = new DataInputStream(bin); + int numEdits = 0; int logVersion = 0; try { - // Read log file version. Could be missing. - in.mark(4); - // If edits log is greater than 2G, available method will return negative - // numbers, so we avoid having to call available - boolean available = true; - try { - logVersion = in.readByte(); - } catch (EOFException e) { - available = false; - } - if (available) { - in.reset(); - logVersion = in.readInt(); - if (logVersion < FSConstants.LAYOUT_VERSION) // future version - throw new IOException( - "Unexpected version of the file system log file: " - + logVersion + ". Current version = " - + FSConstants.LAYOUT_VERSION + "."); + logVersion = readLogVersion(in); + Checksum checksum = null; + if (logVersion <= -28) { // support fsedits checksum + checksum = FSEditLog.getChecksum(); + in = new DataInputStream(new CheckedInputStream(bin, checksum)); } - assert logVersion <= Storage.LAST_UPGRADABLE_LAYOUT_VERSION : - "Unsupported version " + logVersion; - numEdits = loadEditRecords(logVersion, in, false); + + numEdits = loadEditRecords(logVersion, in, checksum, false); } finally { if(closeOnExit) in.close(); @@ -101,7 +125,7 @@ public class FSEditLogLoader { @SuppressWarnings("deprecation") int loadEditRecords(int logVersion, DataInputStream in, - boolean closeOnExit) throws IOException { + Checksum checksum, boolean closeOnExit) throws IOException { FSDirectory fsDir = fsNamesys.dir; int numEdits = 0; String clientName = null; @@ -123,6 +147,9 @@ public class FSEditLogLoader { long blockSize = 0; FSEditLogOpCodes opCode; try { + if (checksum != null) { + checksum.reset(); + } in.mark(1); byte opCodeByte = in.readByte(); opCode = FSEditLogOpCodes.fromByte(opCodeByte); @@ -480,6 +507,7 @@ public class FSEditLogLoader { throw new IOException("Never seen opCode " + opCode); } } + validateChecksum(in, checksum, numEdits); } } finally { if(closeOnExit) @@ -505,6 +533,22 @@ public class FSEditLogLoader { return numEdits; } + /** + * Validate a transaction's checksum + */ + private static void validateChecksum( + DataInputStream in, Checksum checksum, int tid) + throws IOException { + if (checksum != null) { + int calculatedChecksum = (int)checksum.getValue(); + int readChecksum = in.readInt(); // read in checksum + if (readChecksum != calculatedChecksum) { + throw new ChecksumException( + "Transaction " + tid + " is corrupt. Calculated checksum is " + + calculatedChecksum + " but read checksum " + readChecksum, tid); + } + } + } /** * A class to read in blocks stored in the old format. The only two Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java Mon Apr 11 17:15:27 2011 @@ -80,5 +80,6 @@ public enum EditsElement { KEY_ID, KEY_EXPIRY_DATE, KEY_LENGTH, - KEY_BLOB + KEY_BLOB, + CHECKSUM } Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java Mon Apr 11 17:15:27 2011 @@ -17,26 +17,15 @@ */ package org.apache.hadoop.hdfs.tools.offlineEditsViewer; -import java.io.DataInputStream; import java.io.IOException; -import java.io.EOFException; - import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOpCodes; import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.ByteToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.ShortToken; import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.IntToken; import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.VIntToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.LongToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.VLongToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.StringUTF8Token; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.StringTextToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.BlobToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.BytesWritableToken; -import static org.apache.hadoop.hdfs.tools.offlineEditsViewer.Tokenizer.EmptyToken; /** * EditsLoaderCurrent processes Hadoop EditLogs files and walks over @@ -49,7 +38,7 @@ import static org.apache.hadoop.hdfs.too class EditsLoaderCurrent implements EditsLoader { private static int [] supportedVersions = { - -18, -19, -20, -21, -22, -23, -24, -25, -26, -27 }; + -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28 }; private EditsVisitor v; private int editsVersion = 0; @@ -464,6 +453,10 @@ class EditsLoaderCurrent implements Edit visitOpCode(editsOpCode); v.leaveEnclosingElement(); // DATA + + if (editsOpCode != FSEditLogOpCodes.OP_INVALID && editsVersion <= -28) { + v.visitInt(EditsElement.CHECKSUM); + } v.leaveEnclosingElement(); // RECORD } while(editsOpCode != FSEditLogOpCodes.OP_INVALID); Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/ImageLoaderCurrent.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/ImageLoaderCurrent.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/ImageLoaderCurrent.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/tools/offlineImageViewer/ImageLoaderCurrent.java Mon Apr 11 17:15:27 2011 @@ -121,7 +121,7 @@ class ImageLoaderCurrent implements Imag protected final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); private static int [] versions = - {-16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27}; + {-16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28}; private int imageVersion = 0; /* (non-Javadoc) Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestEditLog.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestEditLog.java?rev=1091131&r1=1091130&r2=1091131&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestEditLog.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestEditLog.java Mon Apr 11 17:15:27 2011 @@ -20,12 +20,15 @@ package org.apache.hadoop.hdfs.server.na import junit.framework.TestCase; import java.io.*; import java.net.URI; +import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.ChecksumException; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.permission.*; import org.apache.hadoop.hdfs.HdfsConfiguration; @@ -303,4 +306,37 @@ public class TestEditLog extends TestCas if(cluster != null) cluster.shutdown(); } } + + public void testEditChecksum() throws Exception { + // start a cluster + Configuration conf = new HdfsConfiguration(); + MiniDFSCluster cluster = null; + FileSystem fileSys = null; + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(NUM_DATA_NODES).build(); + cluster.waitActive(); + fileSys = cluster.getFileSystem(); + final FSNamesystem namesystem = cluster.getNamesystem(); + + FSImage fsimage = namesystem.getFSImage(); + final FSEditLog editLog = fsimage.getEditLog(); + fileSys.mkdirs(new Path("/tmp")); + File editFile = editLog.getFsEditName(); + editLog.close(); + cluster.shutdown(); + long fileLen = editFile.length(); + System.out.println("File name: " + editFile + " len: " + fileLen); + RandomAccessFile rwf = new RandomAccessFile(editFile, "rw"); + rwf.seek(fileLen-4); // seek to checksum bytes + int b = rwf.readInt(); + rwf.seek(fileLen-4); + rwf.writeInt(b+1); + rwf.close(); + + try { + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(NUM_DATA_NODES).format(false).build(); + fail("should not be able to start"); + } catch (ChecksumException e) { + // expected + } + } }