diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index bc1f4278905..7e34297aed6 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -425,6 +425,10 @@ Release 2.8.0 - UNRELEASED MAPREDUCE-5708. Duplicate String.format in YarnOutputFiles.getSpillFileForWrite. (Konstantin Weitz via devaraj) + MAPREDUCE-6273. HistoryFileManager should check whether summaryFile exists to + avoid FileNotFoundException causing HistoryFileInfo into MOVE_FAILED state. + (zhihai xu via devaraj) + Release 2.7.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/HistoryFileManager.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/HistoryFileManager.java index 69f814dc5f6..f0786da3fde 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/HistoryFileManager.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/HistoryFileManager.java @@ -303,8 +303,9 @@ public class HistoryFileManager extends AbstractService { private JobIndexInfo jobIndexInfo; private HistoryInfoState state; - private HistoryFileInfo(Path historyFile, Path confFile, Path summaryFile, - JobIndexInfo jobIndexInfo, boolean isInDone) { + @VisibleForTesting + protected HistoryFileInfo(Path historyFile, Path confFile, + Path summaryFile, JobIndexInfo jobIndexInfo, boolean isInDone) { this.historyFile = historyFile; this.confFile = confFile; this.summaryFile = summaryFile; @@ -337,7 +338,8 @@ public class HistoryFileManager extends AbstractService { + " historyFile = " + historyFile; } - private synchronized void moveToDone() throws IOException { + @VisibleForTesting + synchronized void moveToDone() throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("moveToDone: " + historyFile); } @@ -368,7 +370,8 @@ public class HistoryFileManager extends AbstractService { paths.add(confFile); } - if (summaryFile == null) { + if (summaryFile == null || !intermediateDoneDirFc.util().exists( + summaryFile)) { LOG.info("No summary file for job: " + jobId); } else { String jobSummaryString = getJobSummary(intermediateDoneDirFc, diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestHistoryFileManager.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestHistoryFileManager.java index 1c5cc5ce741..7694de93e08 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestHistoryFileManager.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestHistoryFileManager.java @@ -35,7 +35,12 @@ import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.protocol.HdfsConstants; +import org.apache.hadoop.mapreduce.JobID; +import org.apache.hadoop.mapreduce.TypeConverter; +import org.apache.hadoop.mapreduce.v2.api.records.JobId; +import org.apache.hadoop.mapreduce.v2.hs.HistoryFileManager.HistoryFileInfo; import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig; +import org.apache.hadoop.mapreduce.v2.jobhistory.JobIndexInfo; import org.apache.hadoop.test.CoreTestDriver; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; @@ -221,4 +226,34 @@ public class TestHistoryFileManager { } + @Test + public void testHistoryFileInfoSummaryFileNotExist() throws Exception { + HistoryFileManagerTest hmTest = new HistoryFileManagerTest(); + String job = "job_1410889000000_123456"; + Path summaryFile = new Path(job + ".summary"); + JobIndexInfo jobIndexInfo = new JobIndexInfo(); + jobIndexInfo.setJobId(TypeConverter.toYarn(JobID.forName(job))); + Configuration conf = dfsCluster.getConfiguration(0); + conf.set(JHAdminConfig.MR_HISTORY_DONE_DIR, + "/" + UUID.randomUUID()); + conf.set(JHAdminConfig.MR_HISTORY_INTERMEDIATE_DONE_DIR, + "/" + UUID.randomUUID()); + hmTest.serviceInit(conf); + HistoryFileInfo info = hmTest.getHistoryFileInfo(null, null, + summaryFile, jobIndexInfo, false); + info.moveToDone(); + Assert.assertFalse(info.didMoveFail()); + } + + static class HistoryFileManagerTest extends HistoryFileManager { + public HistoryFileManagerTest() { + super(); + } + public HistoryFileInfo getHistoryFileInfo(Path historyFile, + Path confFile, Path summaryFile, JobIndexInfo jobIndexInfo, + boolean isInDone) { + return new HistoryFileInfo(historyFile, confFile, summaryFile, + jobIndexInfo, isInDone); + } + } }