HDFS-3796. Speed up edit log tests by avoiding fsync(). Contributed by Todd Lipcon.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1373558 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Todd Lipcon 2012-08-15 18:36:15 +00:00
parent 2f7382cd07
commit e8eca906d4
8 changed files with 49 additions and 1 deletions

View File

@ -212,6 +212,8 @@ Release 2.0.1-alpha - UNRELEASED
HDFS-3802. StartupOption.name in HdfsServerConstants should be final. HDFS-3802. StartupOption.name in HdfsServerConstants should be final.
(Jing Zhao via szetszwo) (Jing Zhao via szetszwo)
HDFS-3796. Speed up edit log tests by avoiding fsync() (todd)
OPTIMIZATIONS OPTIMIZATIONS
HDFS-2982. Startup performance suffers when there are many edit log HDFS-2982. Startup performance suffers when there are many edit log

View File

@ -49,6 +49,8 @@ public class EditLogFileOutputStream extends EditLogOutputStream {
private EditsDoubleBuffer doubleBuf; private EditsDoubleBuffer doubleBuf;
static ByteBuffer fill = ByteBuffer.allocateDirect(PREALLOCATION_LENGTH); static ByteBuffer fill = ByteBuffer.allocateDirect(PREALLOCATION_LENGTH);
private static boolean shouldSkipFsyncForTests = false;
static { static {
fill.position(0); fill.position(0);
for (int i = 0; i < fill.capacity(); i++) { for (int i = 0; i < fill.capacity(); i++) {
@ -184,7 +186,9 @@ public class EditLogFileOutputStream extends EditLogOutputStream {
return; return;
} }
doubleBuf.flushTo(fp); doubleBuf.flushTo(fp);
fc.force(false); // metadata updates not needed if (!shouldSkipFsyncForTests) {
fc.force(false); // metadata updates not needed
}
fc.position(fc.position() - 1); // skip back the end-of-file marker fc.position(fc.position() - 1); // skip back the end-of-file marker
preallocate(); // preallocate file if necessary preallocate(); // preallocate file if necessary
} }
@ -242,4 +246,15 @@ public class EditLogFileOutputStream extends EditLogOutputStream {
public FileChannel getFileChannelForTesting() { public FileChannel getFileChannelForTesting() {
return fc; return fc;
} }
/**
* For the purposes of unit tests, we don't need to actually
* write durably to disk. So, we can skip the fsync() calls
* for a speed improvement.
* @param skip true if fsync should <em>not</em> be called
*/
@VisibleForTesting
public static void setShouldSkipFsyncForTesting(boolean skip) {
shouldSkipFsyncForTests = skip;
}
} }

View File

@ -118,6 +118,11 @@ public class TestEditLog {
"a4ff 0000 0000 0000 0000 0000 0000 0000" "a4ff 0000 0000 0000 0000 0000 0000 0000"
).replace(" ","")); ).replace(" ",""));
static {
// No need to fsync for the purposes of tests. This makes
// the tests run much faster.
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
}
static final byte TRAILER_BYTE = FSEditLogOpCodes.OP_INVALID.getOpCode(); static final byte TRAILER_BYTE = FSEditLogOpCodes.OP_INVALID.getOpCode();

View File

@ -45,6 +45,12 @@ public class TestEditLogFileOutputStream {
new File(System.getProperty("test.build.data","/tmp"), new File(System.getProperty("test.build.data","/tmp"),
"editLogStream.dat"); "editLogStream.dat");
static {
// No need to fsync for the purposes of tests. This makes
// the tests run much faster.
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
}
@Before @Before
public void deleteEditsFile() { public void deleteEditsFile() {
TEST_EDITS.delete(); TEST_EDITS.delete();

View File

@ -51,6 +51,12 @@ import com.google.common.collect.TreeMultiset;
public class TestFileJournalManager { public class TestFileJournalManager {
static final Log LOG = LogFactory.getLog(TestFileJournalManager.class); static final Log LOG = LogFactory.getLog(TestFileJournalManager.class);
static {
// No need to fsync for the purposes of tests. This makes
// the tests run much faster.
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
}
/** /**
* Find out how many transactions we can read from a * Find out how many transactions we can read from a
* FileJournalManager, starting at a given transaction ID. * FileJournalManager, starting at a given transaction ID.

View File

@ -57,6 +57,7 @@ public class TestNameNodeRecovery {
static { static {
recoverStartOpt.setForce(MetaRecoveryContext.FORCE_ALL); recoverStartOpt.setForce(MetaRecoveryContext.FORCE_ALL);
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
} }
static void runEditLogTest(EditLogTestSetup elts) throws IOException { static void runEditLogTest(EditLogTestSetup elts) throws IOException {

View File

@ -49,6 +49,12 @@ public class TestSecurityTokenEditLog {
static final int NUM_THREADS = 100; static final int NUM_THREADS = 100;
static final int opsPerTrans = 3; static final int opsPerTrans = 3;
static {
// No need to fsync for the purposes of tests. This makes
// the tests run much faster.
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
}
// //
// an object that does a bunch of transactions // an object that does a bunch of transactions
// //

View File

@ -34,6 +34,7 @@ import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdfs.HAUtil; import org.apache.hadoop.hdfs.HAUtil;
import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.MiniDFSNNTopology; import org.apache.hadoop.hdfs.MiniDFSNNTopology;
import org.apache.hadoop.hdfs.server.namenode.EditLogFileOutputStream;
import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil; import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil;
import org.apache.hadoop.hdfs.server.namenode.NNStorage; import org.apache.hadoop.hdfs.server.namenode.NNStorage;
import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter; import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter;
@ -52,6 +53,12 @@ public class TestEditLogsDuringFailover {
private static final Log LOG = private static final Log LOG =
LogFactory.getLog(TestEditLogsDuringFailover.class); LogFactory.getLog(TestEditLogsDuringFailover.class);
private static final int NUM_DIRS_IN_LOG = 5; private static final int NUM_DIRS_IN_LOG = 5;
static {
// No need to fsync for the purposes of tests. This makes
// the tests run much faster.
EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
}
@Test @Test
public void testStartup() throws Exception { public void testStartup() throws Exception {