Repository: hadoop Updated Branches: refs/heads/trunk 5a3c7714c -> 8f3e12ff0
HDDS-882. Provide a config to optionally turn on/off the sync flag during chunk writes. Contributed by Shashikant Banerjee. Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/8f3e12ff Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/8f3e12ff Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/8f3e12ff Branch: refs/heads/trunk Commit: 8f3e12ff07f5a8490af23f3ca231f97b381682e5 Parents: 5a3c771 Author: Shashikant Banerjee <shashik...@apache.org> Authored: Sun Dec 2 08:06:24 2018 +0530 Committer: Shashikant Banerjee <shashik...@apache.org> Committed: Sun Dec 2 08:06:24 2018 +0530 ---------------------------------------------------------------------- .../java/org/apache/hadoop/ozone/OzoneConfigKeys.java | 3 +++ hadoop-hdds/common/src/main/resources/ozone-default.xml | 8 ++++++++ .../hadoop/ozone/container/keyvalue/KeyValueHandler.java | 7 ++++++- .../ozone/container/keyvalue/helpers/ChunkUtils.java | 11 ++++++++--- .../ozone/container/keyvalue/impl/ChunkManagerImpl.java | 10 ++++++++-- .../ozone/container/keyvalue/TestChunkManagerImpl.java | 2 +- .../container/common/impl/TestContainerPersistence.java | 2 +- 7 files changed, 35 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java ---------------------------------------------------------------------- diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java index df233f7..496861c 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java @@ -52,6 +52,9 @@ public final class OzoneConfigKeys { public static final boolean DFS_CONTAINER_IPC_RANDOM_PORT_DEFAULT = false; + public static final String DFS_CONTAINER_CHUNK_WRITE_SYNC_KEY = + "dfs.container.chunk.write.sync"; + public static final boolean DFS_CONTAINER_CHUNK_WRITE_SYNC_DEFAULT = true; /** * Ratis Port where containers listen to. */ http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/common/src/main/resources/ozone-default.xml ---------------------------------------------------------------------- diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml index 0545805..edce616 100644 --- a/hadoop-hdds/common/src/main/resources/ozone-default.xml +++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml @@ -53,6 +53,14 @@ </description> </property> <property> + <name>dfs.container.chunk.write.sync</name> + <value>true</value> + <tag>OZONE, CONTAINER, MANAGEMENT</tag> + <description>Determines whether the chunk writes in the container happen as + sync I/0 or buffered I/O operation. + </description> + </property> + <property> <name>dfs.container.ratis.statemachinedata.sync.timeout</name> <value>10s</value> <tag>OZONE, DEBUG, CONTAINER, RATIS</tag> http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java ---------------------------------------------------------------------- diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java index b4cfcd0..5130253 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java @@ -49,6 +49,7 @@ import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.container.common.helpers .StorageContainerException; +import org.apache.hadoop.ozone.OzoneConfigKeys; import org.apache.hadoop.ozone.container.common.helpers.BlockData; import org.apache.hadoop.ozone.container.common.helpers.ChunkInfo; import org.apache.hadoop.ozone.container.common.helpers.ContainerMetrics; @@ -111,13 +112,17 @@ public class KeyValueHandler extends Handler { private final VolumeChoosingPolicy volumeChoosingPolicy; private final long maxContainerSize; private final AutoCloseableLock handlerLock; + private final boolean doSyncWrite; public KeyValueHandler(Configuration config, StateContext context, ContainerSet contSet, VolumeSet volSet, ContainerMetrics metrics) { super(config, context, contSet, volSet, metrics); containerType = ContainerType.KeyValueContainer; blockManager = new BlockManagerImpl(config); - chunkManager = new ChunkManagerImpl(); + doSyncWrite = + conf.getBoolean(OzoneConfigKeys.DFS_CONTAINER_CHUNK_WRITE_SYNC_KEY, + OzoneConfigKeys.DFS_CONTAINER_CHUNK_WRITE_SYNC_DEFAULT); + chunkManager = new ChunkManagerImpl(doSyncWrite); long svcInterval = config .getTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, OZONE_BLOCK_DELETING_SERVICE_INTERVAL_DEFAULT, http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java index 7239843..6df6f3d 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java @@ -67,10 +67,11 @@ public final class ChunkUtils { * @param chunkInfo - Data stream to write. * @param data - The data buffer. * @param volumeIOStats + * @param sync whether to do fsync or not * @throws StorageContainerException */ public static void writeData(File chunkFile, ChunkInfo chunkInfo, - ByteBuffer data, VolumeIOStats volumeIOStats) + ByteBuffer data, VolumeIOStats volumeIOStats, boolean sync) throws StorageContainerException, ExecutionException, InterruptedException, NoSuchAlgorithmException { int bufferSize = data.capacity(); @@ -88,12 +89,16 @@ public final class ChunkUtils { try { long writeTimeStart = Time.monotonicNow(); - file = + file = sync ? AsynchronousFileChannel.open(chunkFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.SPARSE, - StandardOpenOption.SYNC); + StandardOpenOption.SYNC) : + AsynchronousFileChannel.open(chunkFile.toPath(), + StandardOpenOption.CREATE, + StandardOpenOption.WRITE, + StandardOpenOption.SPARSE); lock = file.lock().get(); int size = file.write(data, chunkInfo.getOffset()).get(); // Increment volumeIO stats here. http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerImpl.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerImpl.java index 38430af..a2e8e5c 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerImpl.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerImpl.java @@ -54,6 +54,11 @@ import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Res */ public class ChunkManagerImpl implements ChunkManager { static final Logger LOG = LoggerFactory.getLogger(ChunkManagerImpl.class); + private final boolean doSyncWrite; + + public ChunkManagerImpl(boolean sync) { + doSyncWrite = sync; + } /** * writes a given chunk. @@ -115,7 +120,8 @@ public class ChunkManagerImpl implements ChunkManager { "tmpChunkFile already exists" + tmpChunkFile + "Overwriting it."); } // Initially writes to temporary chunk file. - ChunkUtils.writeData(tmpChunkFile, info, data, volumeIOStats); + ChunkUtils + .writeData(tmpChunkFile, info, data, volumeIOStats, doSyncWrite); // No need to increment container stats here, as still data is not // committed here. break; @@ -139,7 +145,7 @@ public class ChunkManagerImpl implements ChunkManager { break; case COMBINED: // directly write to the chunk file - ChunkUtils.writeData(chunkFile, info, data, volumeIOStats); + ChunkUtils.writeData(chunkFile, info, data, volumeIOStats, doSyncWrite); if (!isOverwrite) { containerData.incrBytesUsed(info.getLen()); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestChunkManagerImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestChunkManagerImpl.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestChunkManagerImpl.java index f17288f..fd48bf5 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestChunkManagerImpl.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestChunkManagerImpl.java @@ -99,7 +99,7 @@ public class TestChunkManagerImpl { .getLocalID(), 0), 0, data.length); // Create a ChunkManager object. - chunkManager = new ChunkManagerImpl(); + chunkManager = new ChunkManagerImpl(true); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f3e12ff/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java ---------------------------------------------------------------------- diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java index 1637ff7..32b01ae 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/impl/TestContainerPersistence.java @@ -131,7 +131,7 @@ public class TestContainerPersistence { containerSet = new ContainerSet(); volumeSet = new VolumeSet(DATANODE_UUID, conf); blockManager = new BlockManagerImpl(conf); - chunkManager = new ChunkManagerImpl(); + chunkManager = new ChunkManagerImpl(true); for (String dir : conf.getStrings(ScmConfigKeys.HDDS_DATANODE_DIR_KEY)) { StorageLocation location = StorageLocation.parse(dir); --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org