diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java index c052d52cf9..afb9e2afb0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java @@ -126,6 +126,7 @@ class BlockReceiver implements Closeable { private boolean syncOnClose; private volatile boolean dirSyncOnFinalize; + private boolean dirSyncOnHSyncDone = false; private long restartBudget; /** the reference of the volume where the block receiver writes to */ private ReplicaHandler replicaHandler; @@ -424,6 +425,10 @@ class BlockReceiver implements Closeable { } flushTotalNanos += flushEndNanos - flushStartNanos; } + if (isSync && !dirSyncOnHSyncDone && replicaInfo instanceof LocalReplica) { + ((LocalReplica) replicaInfo).fsyncDirectory(); + dirSyncOnHSyncDone = true; + } if (checksumOut != null || streams.getDataOut() != null) { datanode.metrics.addFlushNanos(flushTotalNanos); if (isSync) {