Bläddra i källkod

AMBARI-4362 - Start Hadoop Cluster Service task fails if only one host component was stopped before

Artem Baranchuk 11 år sedan
förälder
incheckning
e41b89cbdd

+ 5 - 3
contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/msi/ClusterDefinition.java

@@ -283,8 +283,8 @@ public class ClusterDefinition {
         state.equals("INSTALLED") ? StateProvider.State.Stopped : StateProvider.State.Unknown;
         state.equals("INSTALLED") ? StateProvider.State.Stopped : StateProvider.State.Unknown;
 
 
     int requestId = -1;
     int requestId = -1;
-
-    if (s != StateProvider.State.Unknown) {
+    // if the state is already set to the desired state or state is unknown then skip it
+    if (s != StateProvider.State.Unknown && !state.equals(getServiceState(serviceName))) {
       Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
       Map<String, Set<String>> serviceHostComponents = hostComponents.get(serviceName);
       if (serviceHostComponents != null) {
       if (serviceHostComponents != null) {
 
 
@@ -293,6 +293,7 @@ public class ClusterDefinition {
           Set<String> componentNames = entry.getValue();
           Set<String> componentNames = entry.getValue();
 
 
           for (String componentName : componentNames) {
           for (String componentName : componentNames) {
+            if(state.equals(getHostComponentState(hostName, componentName))) continue;
             requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
             requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
                 "Set service " + serviceName + " state to " + s);
                 "Set service " + serviceName + " state to " + s);
           }
           }
@@ -356,6 +357,7 @@ public class ClusterDefinition {
 
 
           for (String name : componentNames) {
           for (String name : componentNames) {
             if (name.equals(componentName)) {
             if (name.equals(componentName)) {
+              if(state.equals(getHostComponentState(hostName, componentName))) continue;
               requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
               requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), requestId,
                   "Set component " + componentName + " state to " + s);
                   "Set component " + componentName + " state to " + s);
             }
             }
@@ -394,7 +396,7 @@ public class ClusterDefinition {
 
 
     int requestId = -1;
     int requestId = -1;
 
 
-    if (s != StateProvider.State.Unknown) {
+    if (s != StateProvider.State.Unknown && !state.equals(getHostComponentState(hostName, componentName))) {
       requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), -1,
       requestId = recordProcess(stateProvider.setRunningState(hostName, componentName, s), -1,
           "Set host component " + componentName + " state to " + s);
           "Set host component " + componentName + " state to " + s);
     }
     }

+ 169 - 1
contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterDefinitionTest.java

@@ -18,13 +18,16 @@
 
 
 package org.apache.ambari.msi;
 package org.apache.ambari.msi;
 
 
+import org.apache.ambari.scom.ClusterDefinitionProvider;
+import org.apache.ambari.scom.HostInfoProvider;
 import org.apache.ambari.scom.TestClusterDefinitionProvider;
 import org.apache.ambari.scom.TestClusterDefinitionProvider;
 import org.apache.ambari.scom.TestHostInfoProvider;
 import org.apache.ambari.scom.TestHostInfoProvider;
 import org.junit.Assert;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Test;
-
 import java.util.Set;
 import java.util.Set;
 
 
+import static org.easymock.EasyMock.*;
+
 /**
 /**
  */
  */
 public class ClusterDefinitionTest {
 public class ClusterDefinitionTest {
@@ -115,4 +118,169 @@ public class ClusterDefinitionTest {
 
 
     Assert.assertTrue(hostComponents.contains("DATANODE"));
     Assert.assertTrue(hostComponents.contains("DATANODE"));
   }
   }
+
+  @Test
+  public void testSetServiceState_IfStateAlreadySetToDesired() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Running).times(5);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(-1, clusterDefinition.setServiceState("HDFS", "STARTED"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetServiceState_IfStateUnknown() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(-1, clusterDefinition.setServiceState("HDFS", "UNKNOWN"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetServiceState_FromInstalledToStarted() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+    //checking if a service state already set
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    //checking if a component state not set yet
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(1, clusterDefinition.setServiceState("HDFS", "STARTED"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetServiceStateFromInstalledToStartedWhenOneOfTheComponentsAlreadyStarted() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+    //checking if a service state already set
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    //checking if a component state not set yet
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Running).times(4);
+    expect(mockStateProvider.getRunningState(anyObject(String.class), anyObject(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(1, clusterDefinition.setServiceState("HDFS", "STARTED"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetHostComponentState_IfStateUnknown() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(-1, clusterDefinition.setHostComponentState("hostName", "DATANODE", "UNKNOWN"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetHostComponentState_IfStateAlreadySetToDesired() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+
+    expect(mockStateProvider.getRunningState(isA(String.class), isA(String.class))).andReturn(StateProvider.State.Running);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(-1, clusterDefinition.setHostComponentState("hostName", "DATANODE", "STARTED"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
+
+  @Test
+  public void testSetHostComponentState_FromInstalledToStarted() {
+    StateProvider mockStateProvider = createStrictMock(StateProvider.class);
+    ClusterDefinitionProvider mockClusterDefinitionProvider = createStrictMock(ClusterDefinitionProvider.class);
+    HostInfoProvider mockHostInfoProvider = createStrictMock(HostInfoProvider.class);
+
+    TestClusterDefinitionProvider testClusterDefinitionProvider = new TestClusterDefinitionProvider();
+
+    expect(mockClusterDefinitionProvider.getClusterName()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getVersionId()).andDelegateTo(testClusterDefinitionProvider);
+    expect(mockClusterDefinitionProvider.getInputStream()).andDelegateTo(testClusterDefinitionProvider);
+
+    expect(mockStateProvider.getRunningState(isA(String.class), isA(String.class))).andReturn(StateProvider.State.Stopped);
+    expect(mockStateProvider.setRunningState(anyObject(String.class), anyObject(String.class), eq(StateProvider.State.Running))).andReturn(null);
+
+    replay(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(mockStateProvider, mockClusterDefinitionProvider, mockHostInfoProvider);
+    Assert.assertEquals(1, clusterDefinition.setHostComponentState("hostName", "DATANODE", "STARTED"));
+
+    verify(mockClusterDefinitionProvider, mockHostInfoProvider, mockStateProvider);
+  }
 }
 }