MAPREDUCE-6252. JobHistoryServer should not fail when encountering a

missing directory. Contributed by Craig Welch.

(cherry picked from commit 5e67c4d384)
This commit is contained in:
Devaraj K 2015-04-27 15:01:42 +05:30
parent 3a7bfdf318
commit a940f19226
3 changed files with 37 additions and 7 deletions

View File

@ -20,6 +20,9 @@ Release 2.7.1 - UNRELEASED
MAPREDUCE-6324. Fixed MapReduce uber jobs to not fail the udpate of AM-RM MAPREDUCE-6324. Fixed MapReduce uber jobs to not fail the udpate of AM-RM
tokens when they roll-over. (Jason Lowe via vinodkv) tokens when they roll-over. (Jason Lowe via vinodkv)
MAPREDUCE-6252. JobHistoryServer should not fail when encountering a
missing directory. (Craig Welch via devaraj)
Release 2.7.0 - 2015-04-20 Release 2.7.0 - 2015-04-20
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -740,17 +740,22 @@ public class HistoryFileManager extends AbstractService {
} }
} }
private static List<FileStatus> scanDirectory(Path path, FileContext fc, @VisibleForTesting
protected static List<FileStatus> scanDirectory(Path path, FileContext fc,
PathFilter pathFilter) throws IOException { PathFilter pathFilter) throws IOException {
path = fc.makeQualified(path); path = fc.makeQualified(path);
List<FileStatus> jhStatusList = new ArrayList<FileStatus>(); List<FileStatus> jhStatusList = new ArrayList<FileStatus>();
RemoteIterator<FileStatus> fileStatusIter = fc.listStatus(path); try {
while (fileStatusIter.hasNext()) { RemoteIterator<FileStatus> fileStatusIter = fc.listStatus(path);
FileStatus fileStatus = fileStatusIter.next(); while (fileStatusIter.hasNext()) {
Path filePath = fileStatus.getPath(); FileStatus fileStatus = fileStatusIter.next();
if (fileStatus.isFile() && pathFilter.accept(filePath)) { Path filePath = fileStatus.getPath();
jhStatusList.add(fileStatus); if (fileStatus.isFile() && pathFilter.accept(filePath)) {
jhStatusList.add(fileStatus);
}
} }
} catch (FileNotFoundException fe) {
LOG.error("Error while scanning directory " + path, fe);
} }
return jhStatusList; return jhStatusList;
} }

View File

@ -21,13 +21,17 @@ package org.apache.hadoop.mapreduce.v2.hs;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.util.UUID; import java.util.UUID;
import java.util.List;
import org.junit.Assert; import org.junit.Assert;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileContext;
import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster; import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.protocol.HdfsConstants; import org.apache.hadoop.hdfs.protocol.HdfsConstants;
@ -45,6 +49,8 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TestName; import org.junit.rules.TestName;
import static org.mockito.Mockito.*;
public class TestHistoryFileManager { public class TestHistoryFileManager {
private static MiniDFSCluster dfsCluster = null; private static MiniDFSCluster dfsCluster = null;
private static MiniDFSCluster dfsCluster2 = null; private static MiniDFSCluster dfsCluster2 = null;
@ -199,4 +205,20 @@ public class TestHistoryFileManager {
testCreateHistoryDirs(dfsCluster.getConfiguration(0), clock); testCreateHistoryDirs(dfsCluster.getConfiguration(0), clock);
} }
@Test
public void testScanDirectory() throws Exception {
Path p = new Path("any");
FileContext fc = mock(FileContext.class);
when(fc.makeQualified(p)).thenReturn(p);
when(fc.listStatus(p)).thenThrow(new FileNotFoundException());
List<FileStatus> lfs = HistoryFileManager.scanDirectory(p, fc, null);
//primarily, succcess is that an exception was not thrown. Also nice to
//check this
Assert.assertNotNull(lfs);
}
} }