YARN-5001. Aggregated Logs root directory is created with wrong group if nonexistent. Contributed by Haibo Chen

(cherry picked from commit 76893a4100)
This commit is contained in:
Jason Lowe 2016-11-01 20:23:24 +00:00
parent 045501a538
commit f8d653ef34
2 changed files with 38 additions and 1 deletions

View File

@ -258,6 +258,21 @@ public class LogAggregationService extends AbstractService implements
remoteFS.getWorkingDirectory());
remoteFS.mkdirs(qualified, new FsPermission(TLDIR_PERMISSIONS));
remoteFS.setPermission(qualified, new FsPermission(TLDIR_PERMISSIONS));
UserGroupInformation loginUser = UserGroupInformation.getLoginUser();
String primaryGroupName = null;
try {
primaryGroupName = loginUser.getPrimaryGroupName();
} catch (IOException e) {
LOG.warn("No primary group found. The remote root log directory" +
" will be created with the HDFS superuser being its group " +
"owner. JobHistoryServer may be unable to read the directory.");
}
// set owner on the remote directory only if the primary group exists
if (primaryGroupName != null) {
remoteFS.setOwner(qualified,
loginUser.getShortUserName(), primaryGroupName);
}
} catch (IOException e) {
throw new YarnRuntimeException("Failed to create remoteLogDir ["
+ this.remoteRootLogDir + "]", e);

View File

@ -608,7 +608,7 @@ public class TestLogAggregationService extends BaseContainerManagerTest {
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,
this.conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR,
aNewFile.getAbsolutePath());
LogAggregationService logAggregationService = spy(
@ -625,6 +625,28 @@ public class TestLogAggregationService extends BaseContainerManagerTest {
aNewFile.delete(); //housekeeping
}
@Test
public void testRemoteRootLogDirIsCreatedWithCorrectGroupOwner()
throws IOException {
this.conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDir.getAbsolutePath());
Path aNewFile = new Path(String.valueOf("tmp"+System.currentTimeMillis()));
this.conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR, aNewFile.getName());
LogAggregationService logAggregationService = new LogAggregationService(
dispatcher, this.context, this.delSrvc, super.dirsHandler);
logAggregationService.init(this.conf);
logAggregationService.verifyAndCreateRemoteLogDir(this.conf);
String targetGroup =
UserGroupInformation.getLoginUser().getPrimaryGroupName();
FileSystem fs = FileSystem.get(this.conf);
FileStatus fileStatus = fs.getFileStatus(aNewFile);
Assert.assertEquals("The new aggregate file is not successfully created",
fileStatus.getGroup(), targetGroup);
fs.delete(aNewFile, true);
}
@Test
public void testAppLogDirCreation() throws Exception {
final String logSuffix = "logs";