HDFS-3020. Fix editlog to automatically sync when buffer is full. Contributed by Todd Lipcon.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1295241 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d9ca467266
commit
d8175c831d
|
@ -131,6 +131,8 @@ Release 0.23.3 - UNRELEASED
|
||||||
HDFS-2968. Protocol translator for BlockRecoveryCommand broken when
|
HDFS-2968. Protocol translator for BlockRecoveryCommand broken when
|
||||||
multiple blocks need recovery. (todd)
|
multiple blocks need recovery. (todd)
|
||||||
|
|
||||||
|
HDFS-3020. Fix editlog to automatically sync when buffer is full. (todd)
|
||||||
|
|
||||||
Release 0.23.2 - UNRELEASED
|
Release 0.23.2 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -86,7 +86,7 @@ class EditsDoubleBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean shouldForceSync() {
|
boolean shouldForceSync() {
|
||||||
return bufReady.size() >= initBufferSize;
|
return bufCurrent.size() >= initBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataOutputBuffer getCurrentBuf() {
|
DataOutputBuffer getCurrentBuf() {
|
||||||
|
|
|
@ -730,6 +730,14 @@ public class FSEditLog {
|
||||||
synchronized void setRuntimeForTesting(Runtime runtime) {
|
synchronized void setRuntimeForTesting(Runtime runtime) {
|
||||||
this.runtime = runtime;
|
this.runtime = runtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used only by tests.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
void setMetricsForTests(NameNodeMetrics metrics) {
|
||||||
|
this.metrics = metrics;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a manifest of what finalized edit logs are available
|
* Return a manifest of what finalized edit logs are available
|
||||||
|
|
|
@ -50,6 +50,7 @@ import org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream;
|
||||||
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.NNStorage.NameNodeDirType;
|
import org.apache.hadoop.hdfs.server.namenode.NNStorage.NameNodeDirType;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.NNStorage;
|
import org.apache.hadoop.hdfs.server.namenode.NNStorage;
|
||||||
|
import org.apache.hadoop.hdfs.server.namenode.metrics.NameNodeMetrics;
|
||||||
import org.apache.hadoop.test.GenericTestUtils;
|
import org.apache.hadoop.test.GenericTestUtils;
|
||||||
import org.apache.hadoop.util.StringUtils;
|
import org.apache.hadoop.util.StringUtils;
|
||||||
import org.apache.log4j.Level;
|
import org.apache.log4j.Level;
|
||||||
|
@ -798,6 +799,40 @@ public class TestEditLog extends TestCase {
|
||||||
log.close();
|
log.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regression test for HDFS-1112/HDFS-3020. Ensures that, even if
|
||||||
|
* logSync isn't called periodically, the edit log will sync itself.
|
||||||
|
*/
|
||||||
|
public void testAutoSync() throws Exception {
|
||||||
|
File logDir = new File(TEST_DIR, "testAutoSync");
|
||||||
|
logDir.mkdirs();
|
||||||
|
FSEditLog log = FSImageTestUtil.createStandaloneEditLog(logDir);
|
||||||
|
|
||||||
|
String oneKB = StringUtils.byteToHexString(
|
||||||
|
new byte[500]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.open();
|
||||||
|
NameNodeMetrics mockMetrics = Mockito.mock(NameNodeMetrics.class);
|
||||||
|
log.setMetricsForTests(mockMetrics);
|
||||||
|
|
||||||
|
for (int i = 0; i < 400; i++) {
|
||||||
|
log.logDelete(oneKB, 1L);
|
||||||
|
}
|
||||||
|
// After ~400KB, we're still within the 512KB buffer size
|
||||||
|
Mockito.verify(mockMetrics, Mockito.times(0)).addSync(Mockito.anyLong());
|
||||||
|
|
||||||
|
// After ~400KB more, we should have done an automatic sync
|
||||||
|
for (int i = 0; i < 400; i++) {
|
||||||
|
log.logDelete(oneKB, 1L);
|
||||||
|
}
|
||||||
|
Mockito.verify(mockMetrics, Mockito.times(1)).addSync(Mockito.anyLong());
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
log.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the getEditLogManifest function using mock storage for a number
|
* Tests the getEditLogManifest function using mock storage for a number
|
||||||
|
|
Loading…
Reference in New Issue