YARN-2602. Fixed possible NPE in ApplicationHistoryManagerOnTimelineStore. Contributed by Zhijie Shen
This commit is contained in:
parent
d7075ada5d
commit
bbff96be48
@ -491,6 +491,9 @@ Release 2.6.0 - UNRELEASED
|
|||||||
YARN-2594. Potential deadlock in RM when querying
|
YARN-2594. Potential deadlock in RM when querying
|
||||||
ApplicationResourceUsageReport. (Wangda Tan via kasha)
|
ApplicationResourceUsageReport. (Wangda Tan via kasha)
|
||||||
|
|
||||||
|
YARN-2602. Fixed possible NPE in ApplicationHistoryManagerOnTimelineStore.
|
||||||
|
(Zhijie Shen via jianhe)
|
||||||
|
|
||||||
Release 2.5.1 - 2014-09-05
|
Release 2.5.1 - 2014-09-05
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
@ -227,7 +227,9 @@ private static ApplicationReportExt convertToApplicationReport(
|
|||||||
if (entityInfo.containsKey(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO)) {
|
if (entityInfo.containsKey(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO)) {
|
||||||
String appViewACLsStr = entityInfo.get(
|
String appViewACLsStr = entityInfo.get(
|
||||||
ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO).toString();
|
ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO).toString();
|
||||||
appViewACLs.put(ApplicationAccessType.VIEW_APP, appViewACLsStr);
|
if (appViewACLsStr.length() > 0) {
|
||||||
|
appViewACLs.put(ApplicationAccessType.VIEW_APP, appViewACLsStr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (field == ApplicationReportField.USER_AND_ACLS) {
|
if (field == ApplicationReportField.USER_AND_ACLS) {
|
||||||
return new ApplicationReportExt(ApplicationReport.newInstance(
|
return new ApplicationReportExt(ApplicationReport.newInstance(
|
||||||
|
@ -122,7 +122,11 @@ private static void prepareTimelineStore(TimelineStore store)
|
|||||||
for (int i = 1; i <= SCALE; ++i) {
|
for (int i = 1; i <= SCALE; ++i) {
|
||||||
TimelineEntities entities = new TimelineEntities();
|
TimelineEntities entities = new TimelineEntities();
|
||||||
ApplicationId appId = ApplicationId.newInstance(0, i);
|
ApplicationId appId = ApplicationId.newInstance(0, i);
|
||||||
entities.addEntity(createApplicationTimelineEntity(appId));
|
if (i == 2) {
|
||||||
|
entities.addEntity(createApplicationTimelineEntity(appId, true));
|
||||||
|
} else {
|
||||||
|
entities.addEntity(createApplicationTimelineEntity(appId, false));
|
||||||
|
}
|
||||||
store.put(entities);
|
store.put(entities);
|
||||||
for (int j = 1; j <= SCALE; ++j) {
|
for (int j = 1; j <= SCALE; ++j) {
|
||||||
entities = new TimelineEntities();
|
entities = new TimelineEntities();
|
||||||
@ -142,50 +146,58 @@ private static void prepareTimelineStore(TimelineStore store)
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetApplicationReport() throws Exception {
|
public void testGetApplicationReport() throws Exception {
|
||||||
final ApplicationId appId = ApplicationId.newInstance(0, 1);
|
for (int i = 1; i <= 2; ++i) {
|
||||||
ApplicationReport app;
|
final ApplicationId appId = ApplicationId.newInstance(0, i);
|
||||||
if (callerUGI == null) {
|
ApplicationReport app;
|
||||||
app = historyManager.getApplication(appId);
|
if (callerUGI == null) {
|
||||||
} else {
|
app = historyManager.getApplication(appId);
|
||||||
app =
|
} else {
|
||||||
callerUGI.doAs(new PrivilegedExceptionAction<ApplicationReport> () {
|
app =
|
||||||
@Override
|
callerUGI.doAs(new PrivilegedExceptionAction<ApplicationReport> () {
|
||||||
public ApplicationReport run() throws Exception {
|
@Override
|
||||||
return historyManager.getApplication(appId);
|
public ApplicationReport run() throws Exception {
|
||||||
}
|
return historyManager.getApplication(appId);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Assert.assertNotNull(app);
|
||||||
|
Assert.assertEquals(appId, app.getApplicationId());
|
||||||
|
Assert.assertEquals("test app", app.getName());
|
||||||
|
Assert.assertEquals("test app type", app.getApplicationType());
|
||||||
|
Assert.assertEquals("user1", app.getUser());
|
||||||
|
Assert.assertEquals("test queue", app.getQueue());
|
||||||
|
Assert.assertEquals(Integer.MAX_VALUE + 2L, app.getStartTime());
|
||||||
|
Assert.assertEquals(Integer.MAX_VALUE + 3L, app.getFinishTime());
|
||||||
|
Assert.assertTrue(Math.abs(app.getProgress() - 1.0F) < 0.0001);
|
||||||
|
// App 2 doesn't have the ACLs, such that the default ACLs " " will be used.
|
||||||
|
// Nobody except admin and owner has access to the details of the app.
|
||||||
|
if ((i == 1 && callerUGI != null &&
|
||||||
|
callerUGI.getShortUserName().equals("user3")) ||
|
||||||
|
(i == 2 && callerUGI != null &&
|
||||||
|
(callerUGI.getShortUserName().equals("user2") ||
|
||||||
|
callerUGI.getShortUserName().equals("user3")))) {
|
||||||
|
Assert.assertEquals(ApplicationAttemptId.newInstance(appId, -1),
|
||||||
|
app.getCurrentApplicationAttemptId());
|
||||||
|
Assert.assertEquals(null, app.getHost());
|
||||||
|
Assert.assertEquals(-1, app.getRpcPort());
|
||||||
|
Assert.assertEquals(null, app.getTrackingUrl());
|
||||||
|
Assert.assertEquals(null, app.getOriginalTrackingUrl());
|
||||||
|
Assert.assertEquals(null, app.getDiagnostics());
|
||||||
|
} else {
|
||||||
|
Assert.assertEquals(ApplicationAttemptId.newInstance(appId, 1),
|
||||||
|
app.getCurrentApplicationAttemptId());
|
||||||
|
Assert.assertEquals("test host", app.getHost());
|
||||||
|
Assert.assertEquals(-100, app.getRpcPort());
|
||||||
|
Assert.assertEquals("test tracking url", app.getTrackingUrl());
|
||||||
|
Assert.assertEquals("test original tracking url",
|
||||||
|
app.getOriginalTrackingUrl());
|
||||||
|
Assert.assertEquals("test diagnostics info", app.getDiagnostics());
|
||||||
|
}
|
||||||
|
Assert.assertEquals(FinalApplicationStatus.UNDEFINED,
|
||||||
|
app.getFinalApplicationStatus());
|
||||||
|
Assert.assertEquals(YarnApplicationState.FINISHED,
|
||||||
|
app.getYarnApplicationState());
|
||||||
}
|
}
|
||||||
Assert.assertNotNull(app);
|
|
||||||
Assert.assertEquals(appId, app.getApplicationId());
|
|
||||||
Assert.assertEquals("test app", app.getName());
|
|
||||||
Assert.assertEquals("test app type", app.getApplicationType());
|
|
||||||
Assert.assertEquals("user1", app.getUser());
|
|
||||||
Assert.assertEquals("test queue", app.getQueue());
|
|
||||||
Assert.assertEquals(Integer.MAX_VALUE + 2L, app.getStartTime());
|
|
||||||
Assert.assertEquals(Integer.MAX_VALUE + 3L, app.getFinishTime());
|
|
||||||
Assert.assertTrue(Math.abs(app.getProgress() - 1.0F) < 0.0001);
|
|
||||||
if (callerUGI != null && callerUGI.getShortUserName().equals("user3")) {
|
|
||||||
Assert.assertEquals(ApplicationAttemptId.newInstance(appId, -1),
|
|
||||||
app.getCurrentApplicationAttemptId());
|
|
||||||
Assert.assertEquals(null, app.getHost());
|
|
||||||
Assert.assertEquals(-1, app.getRpcPort());
|
|
||||||
Assert.assertEquals(null, app.getTrackingUrl());
|
|
||||||
Assert.assertEquals(null, app.getOriginalTrackingUrl());
|
|
||||||
Assert.assertEquals(null, app.getDiagnostics());
|
|
||||||
} else {
|
|
||||||
Assert.assertEquals(ApplicationAttemptId.newInstance(appId, 1),
|
|
||||||
app.getCurrentApplicationAttemptId());
|
|
||||||
Assert.assertEquals("test host", app.getHost());
|
|
||||||
Assert.assertEquals(-100, app.getRpcPort());
|
|
||||||
Assert.assertEquals("test tracking url", app.getTrackingUrl());
|
|
||||||
Assert.assertEquals("test original tracking url",
|
|
||||||
app.getOriginalTrackingUrl());
|
|
||||||
Assert.assertEquals("test diagnostics info", app.getDiagnostics());
|
|
||||||
}
|
|
||||||
Assert.assertEquals(FinalApplicationStatus.UNDEFINED,
|
|
||||||
app.getFinalApplicationStatus());
|
|
||||||
Assert.assertEquals(YarnApplicationState.FINISHED,
|
|
||||||
app.getYarnApplicationState());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -396,7 +408,7 @@ public ContainerReport run() throws Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static TimelineEntity createApplicationTimelineEntity(
|
private static TimelineEntity createApplicationTimelineEntity(
|
||||||
ApplicationId appId) {
|
ApplicationId appId, boolean emptyACLs) {
|
||||||
TimelineEntity entity = new TimelineEntity();
|
TimelineEntity entity = new TimelineEntity();
|
||||||
entity.setEntityType(ApplicationMetricsConstants.ENTITY_TYPE);
|
entity.setEntityType(ApplicationMetricsConstants.ENTITY_TYPE);
|
||||||
entity.setEntityId(appId.toString());
|
entity.setEntityId(appId.toString());
|
||||||
@ -410,8 +422,12 @@ private static TimelineEntity createApplicationTimelineEntity(
|
|||||||
entityInfo.put(ApplicationMetricsConstants.QUEUE_ENTITY_INFO, "test queue");
|
entityInfo.put(ApplicationMetricsConstants.QUEUE_ENTITY_INFO, "test queue");
|
||||||
entityInfo.put(ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO,
|
entityInfo.put(ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO,
|
||||||
Integer.MAX_VALUE + 1L);
|
Integer.MAX_VALUE + 1L);
|
||||||
entityInfo.put(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO,
|
if (emptyACLs) {
|
||||||
"user2");
|
entityInfo.put(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO, "");
|
||||||
|
} else {
|
||||||
|
entityInfo.put(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO,
|
||||||
|
"user2");
|
||||||
|
}
|
||||||
entity.setOtherInfo(entityInfo);
|
entity.setOtherInfo(entityInfo);
|
||||||
TimelineEvent tEvent = new TimelineEvent();
|
TimelineEvent tEvent = new TimelineEvent();
|
||||||
tEvent.setEventType(ApplicationMetricsConstants.CREATED_EVENT_TYPE);
|
tEvent.setEventType(ApplicationMetricsConstants.CREATED_EVENT_TYPE);
|
||||||
|
@ -137,7 +137,7 @@ public void appACLsUpdated(RMApp app, String appViewACLs,
|
|||||||
dispatcher.getEventHandler().handle(
|
dispatcher.getEventHandler().handle(
|
||||||
new ApplicationACLsUpdatedEvent(
|
new ApplicationACLsUpdatedEvent(
|
||||||
app.getApplicationId(),
|
app.getApplicationId(),
|
||||||
appViewACLs,
|
appViewACLs == null ? "" : appViewACLs,
|
||||||
updatedTime));
|
updatedTime));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,77 +95,89 @@ public static void tearDown() throws Exception {
|
|||||||
|
|
||||||
@Test(timeout = 10000)
|
@Test(timeout = 10000)
|
||||||
public void testPublishApplicationMetrics() throws Exception {
|
public void testPublishApplicationMetrics() throws Exception {
|
||||||
ApplicationId appId = ApplicationId.newInstance(0, 1);
|
for (int i = 1; i <= 2; ++i) {
|
||||||
RMApp app = createRMApp(appId);
|
ApplicationId appId = ApplicationId.newInstance(0, i);
|
||||||
metricsPublisher.appCreated(app, app.getStartTime());
|
RMApp app = createRMApp(appId);
|
||||||
metricsPublisher.appFinished(app, RMAppState.FINISHED, app.getFinishTime());
|
metricsPublisher.appCreated(app, app.getStartTime());
|
||||||
metricsPublisher.appACLsUpdated(app, "uers1,user2", 4L);
|
metricsPublisher.appFinished(app, RMAppState.FINISHED, app.getFinishTime());
|
||||||
TimelineEntity entity = null;
|
if (i == 1) {
|
||||||
do {
|
metricsPublisher.appACLsUpdated(app, "uers1,user2", 4L);
|
||||||
entity =
|
} else {
|
||||||
store.getEntity(appId.toString(),
|
// in case user doesn't specify the ACLs
|
||||||
ApplicationMetricsConstants.ENTITY_TYPE,
|
metricsPublisher.appACLsUpdated(app, null, 4L);
|
||||||
EnumSet.allOf(Field.class));
|
|
||||||
// ensure three events are both published before leaving the loop
|
|
||||||
} while (entity == null || entity.getEvents().size() < 3);
|
|
||||||
// verify all the fields
|
|
||||||
Assert.assertEquals(ApplicationMetricsConstants.ENTITY_TYPE,
|
|
||||||
entity.getEntityType());
|
|
||||||
Assert
|
|
||||||
.assertEquals(app.getApplicationId().toString(), entity.getEntityId());
|
|
||||||
Assert
|
|
||||||
.assertEquals(
|
|
||||||
app.getName(),
|
|
||||||
entity.getOtherInfo().get(
|
|
||||||
ApplicationMetricsConstants.NAME_ENTITY_INFO));
|
|
||||||
Assert.assertEquals(app.getQueue(),
|
|
||||||
entity.getOtherInfo()
|
|
||||||
.get(ApplicationMetricsConstants.QUEUE_ENTITY_INFO));
|
|
||||||
Assert
|
|
||||||
.assertEquals(
|
|
||||||
app.getUser(),
|
|
||||||
entity.getOtherInfo().get(
|
|
||||||
ApplicationMetricsConstants.USER_ENTITY_INFO));
|
|
||||||
Assert
|
|
||||||
.assertEquals(
|
|
||||||
app.getApplicationType(),
|
|
||||||
entity.getOtherInfo().get(
|
|
||||||
ApplicationMetricsConstants.TYPE_ENTITY_INFO));
|
|
||||||
Assert.assertEquals(app.getSubmitTime(),
|
|
||||||
entity.getOtherInfo().get(
|
|
||||||
ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO));
|
|
||||||
Assert.assertEquals("uers1,user2",
|
|
||||||
entity.getOtherInfo().get(
|
|
||||||
ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO));
|
|
||||||
boolean hasCreatedEvent = false;
|
|
||||||
boolean hasFinishedEvent = false;
|
|
||||||
boolean hasACLsUpdatedEvent = false;
|
|
||||||
for (TimelineEvent event : entity.getEvents()) {
|
|
||||||
if (event.getEventType().equals(
|
|
||||||
ApplicationMetricsConstants.CREATED_EVENT_TYPE)) {
|
|
||||||
hasCreatedEvent = true;
|
|
||||||
Assert.assertEquals(app.getStartTime(), event.getTimestamp());
|
|
||||||
} else if (event.getEventType().equals(
|
|
||||||
ApplicationMetricsConstants.FINISHED_EVENT_TYPE)) {
|
|
||||||
hasFinishedEvent = true;
|
|
||||||
Assert.assertEquals(app.getFinishTime(), event.getTimestamp());
|
|
||||||
Assert.assertEquals(
|
|
||||||
app.getDiagnostics().toString(),
|
|
||||||
event.getEventInfo().get(
|
|
||||||
ApplicationMetricsConstants.DIAGNOSTICS_INFO_EVENT_INFO));
|
|
||||||
Assert.assertEquals(
|
|
||||||
app.getFinalApplicationStatus().toString(),
|
|
||||||
event.getEventInfo().get(
|
|
||||||
ApplicationMetricsConstants.FINAL_STATUS_EVENT_INFO));
|
|
||||||
Assert.assertEquals(YarnApplicationState.FINISHED.toString(), event
|
|
||||||
.getEventInfo().get(ApplicationMetricsConstants.STATE_EVENT_INFO));
|
|
||||||
} else if (event.getEventType().equals(
|
|
||||||
ApplicationMetricsConstants.ACLS_UPDATED_EVENT_TYPE)) {
|
|
||||||
hasACLsUpdatedEvent = true;
|
|
||||||
Assert.assertEquals(4L, event.getTimestamp());
|
|
||||||
}
|
}
|
||||||
|
TimelineEntity entity = null;
|
||||||
|
do {
|
||||||
|
entity =
|
||||||
|
store.getEntity(appId.toString(),
|
||||||
|
ApplicationMetricsConstants.ENTITY_TYPE,
|
||||||
|
EnumSet.allOf(Field.class));
|
||||||
|
// ensure three events are both published before leaving the loop
|
||||||
|
} while (entity == null || entity.getEvents().size() < 3);
|
||||||
|
// verify all the fields
|
||||||
|
Assert.assertEquals(ApplicationMetricsConstants.ENTITY_TYPE,
|
||||||
|
entity.getEntityType());
|
||||||
|
Assert
|
||||||
|
.assertEquals(app.getApplicationId().toString(), entity.getEntityId());
|
||||||
|
Assert
|
||||||
|
.assertEquals(
|
||||||
|
app.getName(),
|
||||||
|
entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.NAME_ENTITY_INFO));
|
||||||
|
Assert.assertEquals(app.getQueue(),
|
||||||
|
entity.getOtherInfo()
|
||||||
|
.get(ApplicationMetricsConstants.QUEUE_ENTITY_INFO));
|
||||||
|
Assert
|
||||||
|
.assertEquals(
|
||||||
|
app.getUser(),
|
||||||
|
entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.USER_ENTITY_INFO));
|
||||||
|
Assert
|
||||||
|
.assertEquals(
|
||||||
|
app.getApplicationType(),
|
||||||
|
entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.TYPE_ENTITY_INFO));
|
||||||
|
Assert.assertEquals(app.getSubmitTime(),
|
||||||
|
entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO));
|
||||||
|
if (i == 1) {
|
||||||
|
Assert.assertEquals("uers1,user2",
|
||||||
|
entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO));
|
||||||
|
} else {
|
||||||
|
Assert.assertEquals("", entity.getOtherInfo().get(
|
||||||
|
ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO));
|
||||||
|
}
|
||||||
|
boolean hasCreatedEvent = false;
|
||||||
|
boolean hasFinishedEvent = false;
|
||||||
|
boolean hasACLsUpdatedEvent = false;
|
||||||
|
for (TimelineEvent event : entity.getEvents()) {
|
||||||
|
if (event.getEventType().equals(
|
||||||
|
ApplicationMetricsConstants.CREATED_EVENT_TYPE)) {
|
||||||
|
hasCreatedEvent = true;
|
||||||
|
Assert.assertEquals(app.getStartTime(), event.getTimestamp());
|
||||||
|
} else if (event.getEventType().equals(
|
||||||
|
ApplicationMetricsConstants.FINISHED_EVENT_TYPE)) {
|
||||||
|
hasFinishedEvent = true;
|
||||||
|
Assert.assertEquals(app.getFinishTime(), event.getTimestamp());
|
||||||
|
Assert.assertEquals(
|
||||||
|
app.getDiagnostics().toString(),
|
||||||
|
event.getEventInfo().get(
|
||||||
|
ApplicationMetricsConstants.DIAGNOSTICS_INFO_EVENT_INFO));
|
||||||
|
Assert.assertEquals(
|
||||||
|
app.getFinalApplicationStatus().toString(),
|
||||||
|
event.getEventInfo().get(
|
||||||
|
ApplicationMetricsConstants.FINAL_STATUS_EVENT_INFO));
|
||||||
|
Assert.assertEquals(YarnApplicationState.FINISHED.toString(), event
|
||||||
|
.getEventInfo().get(ApplicationMetricsConstants.STATE_EVENT_INFO));
|
||||||
|
} else if (event.getEventType().equals(
|
||||||
|
ApplicationMetricsConstants.ACLS_UPDATED_EVENT_TYPE)) {
|
||||||
|
hasACLsUpdatedEvent = true;
|
||||||
|
Assert.assertEquals(4L, event.getTimestamp());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Assert.assertTrue(hasCreatedEvent && hasFinishedEvent && hasACLsUpdatedEvent);
|
||||||
}
|
}
|
||||||
Assert.assertTrue(hasCreatedEvent && hasFinishedEvent && hasACLsUpdatedEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(timeout = 10000)
|
@Test(timeout = 10000)
|
||||||
|
Loading…
Reference in New Issue
Block a user