MAPREDUCE-3240. Fixed NodeManager to be able to forcefully cleanup its containers (process-trees) irrespective of whether the container succeeded, or killed. Contributed by Hitesh Shah.
Added the new files which I missed earlier. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1189815 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
28676b5345
commit
1f42531bce
|
@ -0,0 +1,74 @@
|
||||||
|
package org.apache.hadoop.yarn.server.nodemanager.util;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper functionality to read the pid from a file.
|
||||||
|
*/
|
||||||
|
public class ProcessIdFileReader {
|
||||||
|
|
||||||
|
private static final Log LOG = LogFactory.getLog(ProcessIdFileReader.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the process id from specified file path.
|
||||||
|
* Parses each line to find a valid number
|
||||||
|
* and returns the first one found.
|
||||||
|
* @return Process Id if obtained from path specified else null
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String getProcessId(Path path) throws IOException {
|
||||||
|
if (path == null) {
|
||||||
|
throw new IOException("Trying to access process id from a null path");
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.debug("Accessing pid from pid file " + path);
|
||||||
|
String processId = null;
|
||||||
|
FileReader fileReader = null;
|
||||||
|
BufferedReader bufReader = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
File file = new File(path.toString());
|
||||||
|
if (file.exists()) {
|
||||||
|
fileReader = new FileReader(file);
|
||||||
|
bufReader = new BufferedReader(fileReader);
|
||||||
|
while (true) {
|
||||||
|
String line = bufReader.readLine();
|
||||||
|
if (line == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
String temp = line.trim();
|
||||||
|
if (!temp.isEmpty()) {
|
||||||
|
try {
|
||||||
|
Long pid = Long.valueOf(temp);
|
||||||
|
if (pid > 0) {
|
||||||
|
processId = temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (fileReader != null) {
|
||||||
|
fileReader.close();
|
||||||
|
}
|
||||||
|
if (bufReader != null) {
|
||||||
|
bufReader.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG.debug("Got pid "
|
||||||
|
+ (processId != null? processId : "null")
|
||||||
|
+ " from path " + path);
|
||||||
|
return processId;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package org.apache.hadoop.yarn.server.nodemanager.util;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.yarn.server.nodemanager.util.ProcessIdFileReader;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestProcessIdFileReader {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNullPath() {
|
||||||
|
String pid = null;
|
||||||
|
try {
|
||||||
|
pid = ProcessIdFileReader.getProcessId(null);
|
||||||
|
fail("Expected an error to be thrown for null path");
|
||||||
|
} catch (Exception e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
assert(pid == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimpleGet() throws IOException {
|
||||||
|
String rootDir = new File(System.getProperty(
|
||||||
|
"test.build.data", "/tmp")).getAbsolutePath();
|
||||||
|
File testFile = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
testFile = new File(rootDir, "temp.txt");
|
||||||
|
PrintWriter fileWriter = new PrintWriter(testFile);
|
||||||
|
fileWriter.println("56789");
|
||||||
|
fileWriter.close();
|
||||||
|
String processId = null;
|
||||||
|
|
||||||
|
processId = ProcessIdFileReader.getProcessId(
|
||||||
|
new Path(rootDir + Path.SEPARATOR + "temp.txt"));
|
||||||
|
Assert.assertEquals("56789", processId);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
if (testFile != null
|
||||||
|
&& testFile.exists()) {
|
||||||
|
testFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testComplexGet() throws IOException {
|
||||||
|
String rootDir = new File(System.getProperty(
|
||||||
|
"test.build.data", "/tmp")).getAbsolutePath();
|
||||||
|
File testFile = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
testFile = new File(rootDir, "temp.txt");
|
||||||
|
PrintWriter fileWriter = new PrintWriter(testFile);
|
||||||
|
fileWriter.println(" ");
|
||||||
|
fileWriter.println("");
|
||||||
|
fileWriter.println("abc");
|
||||||
|
fileWriter.println("-123");
|
||||||
|
fileWriter.println("-123 ");
|
||||||
|
fileWriter.println(" 23 ");
|
||||||
|
fileWriter.println("6236");
|
||||||
|
fileWriter.close();
|
||||||
|
String processId = null;
|
||||||
|
|
||||||
|
processId = ProcessIdFileReader.getProcessId(
|
||||||
|
new Path(rootDir + Path.SEPARATOR + "temp.txt"));
|
||||||
|
Assert.assertEquals("23", processId);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
if (testFile != null
|
||||||
|
&& testFile.exists()) {
|
||||||
|
testFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue