diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 28583724e6f..da3d8a076e4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -360,6 +360,8 @@ Release 2.8.0 - UNRELEASED HDFS-8703. Merge refactor of DFSInputStream from ErasureCoding branch (vinayakumarb) + HDFS-8709. Clarify automatic sync in FSEditLog#logEdit. (wang) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java index b4513bd85f5..f6d95bc5aa0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java @@ -410,10 +410,14 @@ public class FSEditLog implements LogsPurgeable { } /** - * Write an operation to the edit log. Do not sync to persistent - * store yet. + * Write an operation to the edit log. + *
+ * Additionally, this will sync the edit log if required by the underlying + * edit stream's automatic sync policy (e.g. when the buffer is full, or + * if a time interval has elapsed). */ void logEdit(final FSEditLogOp op) { + boolean needsSync = false; synchronized (this) { assert isOpenForWrite() : "bad state: " + state; @@ -435,14 +439,16 @@ public class FSEditLog implements LogsPurgeable { endTransaction(start); // check if it is time to schedule an automatic sync - if (!shouldForceSync()) { - return; + needsSync = shouldForceSync(); + if (needsSync) { + isAutoSyncScheduled = true; } - isAutoSyncScheduled = true; } - // sync buffered edit log entries to persistent store - logSync(); + // Sync the log if an automatic sync is required. + if (needsSync) { + logSync(); + } } /** @@ -1192,11 +1198,13 @@ public class FSEditLog implements LogsPurgeable { throws IOException { return journalSet.getEditLogManifest(fromTxId); } - + /** * Finalizes the current edit log and opens a new log segment. - * @return the transaction id of the BEGIN_LOG_SEGMENT transaction - * in the new log. + * + * @param layoutVersion The layout version of the new edit log segment. + * @return the transaction id of the BEGIN_LOG_SEGMENT transaction in the new + * log. */ synchronized long rollEditLog(int layoutVersion) throws IOException { LOG.info("Rolling edit logs");