You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mp...@apache.org on 2016/03/03 15:46:10 UTC
ambari git commit: AMBARI-15202. Status commands temporary break host
component state machine. (mpapirkovskyy)
Repository: ambari
Updated Branches:
refs/heads/branch-2.2 486981463 -> 0e583d354
AMBARI-15202. Status commands temporary break host component state machine. (mpapirkovskyy)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0e583d35
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0e583d35
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0e583d35
Branch: refs/heads/branch-2.2
Commit: 0e583d354f7e40e4cd11f0d7a8bc5d611ddfbb60
Parents: 4869814
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Fri Feb 26 16:59:58 2016 +0200
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Thu Mar 3 16:43:45 2016 +0200
----------------------------------------------------------------------
.../ambari/server/agent/HeartbeatProcessor.java | 11 +--
.../server/agent/HeartbeatProcessorTest.java | 79 +++++++++++++++++++-
2 files changed, 84 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/0e583d35/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
index cc986c4..b5e61d1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
@@ -208,8 +208,9 @@ public class HeartbeatProcessor extends AbstractService{
processAlerts(heartbeat);
- processCommandReports(heartbeat, now);
+ //process status reports before command reports to prevent status override immediately after task finish
processStatusReports(heartbeat);
+ processCommandReports(heartbeat, now);
//host status calculation are based on task and status reports, should be performed last
processHostStatus(heartbeat);
}
@@ -595,18 +596,18 @@ public class HeartbeatProcessor extends AbstractService{
org.apache.ambari.server.state.State liveState =
org.apache.ambari.server.state.State.valueOf(org.apache.ambari.server.state.State.class,
status.getStatus());
+ //ignore reports from status commands if component is in INIT or any "in progress" state
if (prevState.equals(org.apache.ambari.server.state.State.INSTALLED)
|| prevState.equals(org.apache.ambari.server.state.State.STARTED)
- || prevState.equals(org.apache.ambari.server.state.State.STARTING)
- || prevState.equals(org.apache.ambari.server.state.State.STOPPING)
|| prevState.equals(org.apache.ambari.server.state.State.UNKNOWN)) {
- scHost.setState(liveState); //TODO direct status set breaks state machine sometimes !!!
+ scHost.setState(liveState);
if (!prevState.equals(liveState)) {
LOG.info("State of service component " + componentName
+ " of service " + status.getServiceName()
+ " of cluster " + status.getClusterName()
+ " has changed from " + prevState + " to " + liveState
- + " at host " + hostname);
+ + " at host " + hostname
+ + " according to STATUS_COMMAND report");
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/0e583d35/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
index eb99142..7f3d763 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/HeartbeatProcessorTest.java
@@ -520,7 +520,8 @@ public class HeartbeatProcessorTest {
assertEquals(SecurityState.SECURED_KERBEROS, serviceComponentHost1.getSecurityState());
assertEquals(State.INSTALLED, componentState2);
assertEquals(SecurityState.SECURING, serviceComponentHost2.getSecurityState());
- assertEquals(State.STARTED, componentState3);
+ //starting state will not be overridden by status command
+ assertEquals(State.STARTING, componentState3);
assertEquals(SecurityState.UNSECURED, serviceComponentHost3.getSecurityState());
}
@@ -1286,5 +1287,81 @@ public class HeartbeatProcessorTest {
Assert.assertNotNull(entity);
}
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testComponentInProgressStatusSafeAfterStatusReport() throws Exception {
+ Cluster cluster = heartbeatTestHelper.getDummyCluster();
+ Service hdfs = cluster.addService(HDFS);
+ hdfs.persist();
+ hdfs.addServiceComponent(DATANODE).persist();
+ hdfs.getServiceComponent(DATANODE).
+ addServiceComponentHost(DummyHostname1).persist();
+ hdfs.addServiceComponent(NAMENODE).persist();
+ hdfs.getServiceComponent(NAMENODE).
+ addServiceComponentHost(DummyHostname1).persist();
+
+ ActionQueue aq = new ActionQueue();
+
+ ServiceComponentHost serviceComponentHost1 = clusters.
+ getCluster(DummyCluster).getService(HDFS).
+ getServiceComponent(DATANODE).
+ getServiceComponentHost(DummyHostname1);
+ ServiceComponentHost serviceComponentHost2 = clusters.
+ getCluster(DummyCluster).getService(HDFS).
+ getServiceComponent(NAMENODE).
+ getServiceComponentHost(DummyHostname1);
+ serviceComponentHost1.setState(State.STARTING);
+ serviceComponentHost2.setState(State.STOPPING);
+
+ HeartBeat hb = new HeartBeat();
+ hb.setTimestamp(System.currentTimeMillis());
+ hb.setResponseId(0);
+ hb.setHostname(DummyHostname1);
+ hb.setNodeStatus(new HostStatus(HostStatus.Status.HEALTHY, DummyHostStatus));
+ hb.setReports(new ArrayList<CommandReport>());
+ ArrayList<ComponentStatus> componentStatuses = new ArrayList<ComponentStatus>();
+
+ ComponentStatus componentStatus1 = new ComponentStatus();
+ componentStatus1.setClusterName(DummyCluster);
+ componentStatus1.setServiceName(HDFS);
+ componentStatus1.setMessage(DummyHostStatus);
+ componentStatus1.setStatus(State.INSTALLED.name());
+ componentStatus1.setSecurityState(SecurityState.UNSECURED.name());
+ componentStatus1.setComponentName(DATANODE);
+ componentStatuses.add(componentStatus1);
+
+ ComponentStatus componentStatus2 = new ComponentStatus();
+ componentStatus2.setClusterName(DummyCluster);
+ componentStatus2.setServiceName(HDFS);
+ componentStatus2.setMessage(DummyHostStatus);
+ componentStatus2.setStatus(State.INSTALLED.name());
+ componentStatus2.setSecurityState(SecurityState.UNSECURED.name());
+ componentStatus2.setComponentName(NAMENODE);
+ componentStatuses.add(componentStatus2);
+
+ hb.setComponentStatus(componentStatuses);
+
+ final HostRoleCommand command = hostRoleCommandFactory.create(DummyHostname1,
+ Role.DATANODE, null, null);
+
+ ActionManager am = heartbeatTestHelper.getMockActionManager();
+ expect(am.getTasks(anyObject(List.class))).andReturn(
+ new ArrayList<HostRoleCommand>() {{
+ add(command);
+ add(command);
+ }});
+ replay(am);
+
+ HeartBeatHandler handler = heartbeatTestHelper.getHeartBeatHandler(am, aq);
+ HeartbeatProcessor heartbeatProcessor = handler.getHeartbeatProcessor();
+ heartbeatProcessor.processHeartbeat(hb);
+
+ State componentState1 = serviceComponentHost1.getState();
+ State componentState2 = serviceComponentHost2.getState();
+ assertEquals(State.STARTING, componentState1);
+ assertEquals(State.STOPPING, componentState2);
+ }
+
+
}
\ No newline at end of file