diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java index 7bf429eed48..84863a525ba 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java @@ -791,6 +791,15 @@ public class RawLocalFileSystem extends FileSystem { pathToFile(p).toPath(), BasicFileAttributeView.class); FileTime fmtime = (mtime >= 0) ? FileTime.fromMillis(mtime) : null; FileTime fatime = (atime >= 0) ? FileTime.fromMillis(atime) : null; + + // On some macOS environment, BasicFileAttributeView.setTimes + // does not set times correctly when the argument of accessTime is null. + // TODO: Remove this after the issue is fixed. + if (fatime == null && Shell.MAC) { + FileStatus f = getFileStatus(p); + fatime = FileTime.fromMillis(f.getAccessTime()); + } + view.setTimes(fmtime, fatime, null); } catch (NoSuchFileException e) { throw new FileNotFoundException("File " + p + " does not exist"); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java index e2baf32ff28..18188dddbc8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java @@ -37,6 +37,8 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; + +import org.apache.commons.lang.time.FastDateFormat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience; @@ -61,7 +63,7 @@ public class DirectoryScanner implements Runnable { private static final int MILLIS_PER_SECOND = 1000; private static final String START_MESSAGE = "Periodic Directory Tree Verification scan" - + " starting at %dms with interval of %dms"; + + " starting at %s with interval of %dms"; private static final String START_MESSAGE_WITH_THROTTLE = START_MESSAGE + " and throttle limit of %dms/s"; @@ -268,10 +270,12 @@ public class DirectoryScanner implements Runnable { String logMsg; if (throttleLimitMsPerSec < MILLIS_PER_SECOND) { - logMsg = String.format(START_MESSAGE_WITH_THROTTLE, firstScanTime, - scanPeriodMsecs, throttleLimitMsPerSec); + logMsg = String.format(START_MESSAGE_WITH_THROTTLE, + FastDateFormat.getInstance().format(firstScanTime), scanPeriodMsecs, + throttleLimitMsPerSec); } else { - logMsg = String.format(START_MESSAGE, firstScanTime, scanPeriodMsecs); + logMsg = String.format(START_MESSAGE, + FastDateFormat.getInstance().format(firstScanTime), scanPeriodMsecs); } LOG.info(logMsg);