YARN-512. Log aggregation root directory check is more expensive than it needs to be. Contributed by Maysam Yabandeh

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1487498 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jason Darrell Lowe 2013-05-29 14:25:04 +00:00
parent edc6d7d3ab
commit 31c96829c7
3 changed files with 45 additions and 22 deletions

View File

@ -223,6 +223,9 @@ Release 2.0.5-beta - UNRELEASED
OPTIMIZATIONS OPTIMIZATIONS
YARN-512. Log aggregation root directory check is more expensive than it
needs to be. (Maysam Yabandeh via jlowe)
BUG FIXES BUG FIXES
YARN-383. AMRMClientImpl should handle null rmClient in stop() YARN-383. AMRMClientImpl should handle null rmClient in stop()

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation; package org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.util.Map; import java.util.Map;
@ -163,36 +164,31 @@ private void stopAggregators() {
} }
void verifyAndCreateRemoteLogDir(Configuration conf) { void verifyAndCreateRemoteLogDir(Configuration conf) {
// Checking the existance of the TLD // Checking the existence of the TLD
FileSystem remoteFS = null; FileSystem remoteFS = null;
try { try {
remoteFS = FileSystem.get(conf); remoteFS = FileSystem.get(conf);
} catch (IOException e) { } catch (IOException e) {
throw new YarnException("Unable to get Remote FileSystem instance", e); throw new YarnException("Unable to get Remote FileSystem instance", e);
} }
boolean remoteExists = false; boolean remoteExists = true;
try { try {
remoteExists = remoteFS.exists(this.remoteRootLogDir); FsPermission perms =
} catch (IOException e) { remoteFS.getFileStatus(this.remoteRootLogDir).getPermission();
throw new YarnException("Failed to check for existence of remoteLogDir [" if (!perms.equals(TLDIR_PERMISSIONS)) {
+ this.remoteRootLogDir + "]", e); LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
} + "] already exist, but with incorrect permissions. "
if (remoteExists) { + "Expected: [" + TLDIR_PERMISSIONS + "], Found: [" + perms
try { + "]." + " The cluster may have problems with multiple users.");
FsPermission perms =
remoteFS.getFileStatus(this.remoteRootLogDir).getPermission();
if (!perms.equals(TLDIR_PERMISSIONS)) {
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
+ "] already exist, but with incorrect permissions. "
+ "Expected: [" + TLDIR_PERMISSIONS + "], Found: [" + perms
+ "]." + " The cluster may have problems with multiple users.");
}
} catch (IOException e) {
throw new YarnException(
"Failed to check permissions for dir ["
+ this.remoteRootLogDir + "]", e);
} }
} else { } catch (FileNotFoundException e) {
remoteExists = false;
} catch (IOException e) {
throw new YarnException(
"Failed to check permissions for dir ["
+ this.remoteRootLogDir + "]", e);
}
if (!remoteExists) {
LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir LOG.warn("Remote Root Log Dir [" + this.remoteRootLogDir
+ "] does not exist. Attempting to create it."); + "] does not exist. Attempting to create it.");
try { try {

View File

@ -465,6 +465,30 @@ public void testVerifyAndCreateRemoteDirsFailure()
logAggregationService.stop(); logAggregationService.stop();
} }
@Test
public void testVerifyAndCreateRemoteDirNonExistence()
throws Exception {
this.conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDir.getAbsolutePath());
File aNewFile = new File(String.valueOf("tmp"+System.currentTimeMillis()));
this.conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR,
aNewFile.getAbsolutePath());
DrainDispatcher dispatcher = createDispatcher();
LogAggregationService logAggregationService = spy(
new LogAggregationService(dispatcher, this.context, this.delSrvc,
super.dirsHandler));
logAggregationService.init(this.conf);
boolean existsBefore = aNewFile.exists();
assertTrue("The new file already exists!", !existsBefore);
logAggregationService.verifyAndCreateRemoteLogDir(this.conf);
boolean existsAfter = aNewFile.exists();
assertTrue("The new aggregate file is not successfully created", existsAfter);
aNewFile.delete(); //housekeeping
}
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void testLogAggregationInitAppFailsWithoutKillingNM() throws Exception { public void testLogAggregationInitAppFailsWithoutKillingNM() throws Exception {