You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dd...@apache.org on 2011/12/18 05:54:32 UTC

svn commit: r1220334 - in /incubator/ambari/trunk/controller/src: main/java/org/apache/ambari/controller/HeartbeatHandler.java main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java test/java/org/apache/ambari/controller/TestHeartbeat.java

Author: ddas
Date: Sun Dec 18 04:54:32 2011
New Revision: 1220334

URL: http://svn.apache.org/viewvc?rev=1220334&view=rev
Log:
AMBARI-148.Fixed a bug in FSM

Modified:
    incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/controller/HeartbeatHandler.java
    incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java
    incubator/ambari/trunk/controller/src/test/java/org/apache/ambari/controller/TestHeartbeat.java

Modified: incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/controller/HeartbeatHandler.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/controller/HeartbeatHandler.java?rev=1220334&r1=1220333&r2=1220334&view=diff
==============================================================================
--- incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/controller/HeartbeatHandler.java (original)
+++ incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/controller/HeartbeatHandler.java Sun Dec 18 04:54:32 2011
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.controller;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -134,14 +135,17 @@ public class HeartbeatHandler {
         List<ServiceFSM> clusterServices = clusterFsm.getServices();
         //go through all the components, and check which role should be started
         for (ServiceFSM service : clusterServices) {
+          ComponentPlugin plugin = 
+              cluster.getComponentDefinition(service.getServiceName());
+          //check whether all the dependent components have started up
+          if (!dependentComponentsActive(plugin, clusterFsm)) {
+            continue;
+          }
           List<RoleFSM> roles = service.getRoles();
           for (RoleFSM role : roles) {
             boolean nodePlayingRole = 
                 nodePlayingRole(hostname, role.getRoleName());
-            if (nodePlayingRole) {
-              ComponentPlugin plugin = 
-                  cluster.getComponentDefinition(service.getServiceName());
-
+            if (nodePlayingRole) {          
               //check whether the agent should start any server
               if (role.shouldStart()) {
                 Action action = 
@@ -186,6 +190,26 @@ public class HeartbeatHandler {
     return createResponse(responseId,allActions,heartbeat);
   }
   
+  private boolean dependentComponentsActive(ComponentPlugin plugin, 
+      ClusterFSM cluster) throws IOException {
+    String[] dependents = plugin.getRequiredComponents();
+    if (dependents == null || dependents.length == 0) {
+      return true;
+    }
+    List<ServiceFSM> componentFsms = cluster.getServices();
+    
+    for (ServiceFSM component : componentFsms) {
+      for (String dependent : dependents) {
+        if (component.getServiceName().equals(dependent)) {
+          if (!component.isActive()) {
+            return false;
+          }
+        }
+      }
+    }
+    return true;
+  }
+  
   private ControllerResponse createResponse(short responseId, 
       List<Action> allActions, HeartBeat heartbeat) {
     ControllerResponse r = new ControllerResponse();

Modified: incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java?rev=1220334&r1=1220333&r2=1220334&view=diff
==============================================================================
--- incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java (original)
+++ incubator/ambari/trunk/controller/src/main/java/org/apache/ambari/resource/statemachine/ClusterImpl.java Sun Dec 18 04:54:32 2011
@@ -215,7 +215,7 @@ public class ClusterImpl implements Clus
     public ClusterStateFSM transition(ClusterImpl operand, ClusterEvent event){
       //check whether all services started, and if not remain in the STARTING
       //state, else move to the ACTIVE state
-      ServiceFSM service = operand.getFirstService();
+      ServiceFSM service = operand.getNextService();
       if (service != null) {
         stateMachineInvoker.getAMBARIEventHandler().handle(new ServiceEvent(
             ServiceEventType.START, service));

Modified: incubator/ambari/trunk/controller/src/test/java/org/apache/ambari/controller/TestHeartbeat.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/controller/src/test/java/org/apache/ambari/controller/TestHeartbeat.java?rev=1220334&r1=1220333&r2=1220334&view=diff
==============================================================================
--- incubator/ambari/trunk/controller/src/test/java/org/apache/ambari/controller/TestHeartbeat.java (original)
+++ incubator/ambari/trunk/controller/src/test/java/org/apache/ambari/controller/TestHeartbeat.java Sun Dec 18 04:54:32 2011
@@ -104,6 +104,7 @@ public class TestHeartbeat {
     invoker = injector.getInstance(StateMachineInvokerInterface.class);
     plugin = mock(ComponentPlugin.class);
     when(plugin.getActiveRoles()).thenReturn(roles);
+    when(plugin.getRequiredComponents()).thenReturn(null);
     cdef = mock(ClusterDefinition.class);
     when(cdef.getEnabledServices()).thenReturn(Arrays.asList("comp1"));
     cluster = mock(Cluster.class);