You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2015/06/04 04:40:21 UTC

ambari git commit: AMBARI-11672. Ambari 2.0.1 server doesn't start after upgrade from HDP 2.1.7 to 2.2.4. (swagle)

Repository: ambari
Updated Branches:
  refs/heads/trunk d658e6fd7 -> 33f24d575


AMBARI-11672. Ambari 2.0.1 server doesn't start after upgrade from HDP 2.1.7 to 2.2.4. (swagle)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/33f24d57
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/33f24d57
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/33f24d57

Branch: refs/heads/trunk
Commit: 33f24d57537c5055b896d5b011e535be96d31c8f
Parents: d658e6f
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Wed Jun 3 18:30:50 2015 -0700
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Wed Jun 3 19:40:19 2015 -0700

----------------------------------------------------------------------
 .../server/upgrade/UpgradeCatalog210.java       | 94 +++++++++++++++++---
 .../server/upgrade/UpgradeCatalog210Test.java   | 81 +++++++++++++++++
 2 files changed, 164 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/33f24d57/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java
index e331475..2e40461 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog210.java
@@ -31,14 +31,20 @@ import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.dao.DaoUtils;
+import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
+import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.OsFamily;
+import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.eclipse.persistence.internal.databaseaccess.FieldTypeDefinition;
 import org.slf4j.Logger;
@@ -46,6 +52,9 @@ import org.slf4j.LoggerFactory;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaDelete;
+import javax.persistence.criteria.Root;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.text.MessageFormat;
@@ -471,21 +480,21 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog {
       dbAccessor.executeQuery("ALTER TABLE " + SERVICE_CONFIG_HOSTS_TABLE + " DROP CONSTRAINT serviceconfighosts_pkey");
     }
     dbAccessor.executeQuery("ALTER TABLE " + CONFIG_GROUP_HOST_MAPPING_TABLE +
-        " ADD CONSTRAINT configgrouphostmapping_pkey PRIMARY KEY (config_group_id, host_id)");
+      " ADD CONSTRAINT configgrouphostmapping_pkey PRIMARY KEY (config_group_id, host_id)");
     dbAccessor.executeQuery("ALTER TABLE " + CLUSTER_HOST_MAPPING_TABLE +
-        " ADD CONSTRAINT clusterhostmapping_pkey PRIMARY KEY (cluster_id, host_id)");
+      " ADD CONSTRAINT clusterhostmapping_pkey PRIMARY KEY (cluster_id, host_id)");
     dbAccessor.executeQuery("ALTER TABLE " + HOST_CONFIG_MAPPING_TABLE +
-        " ADD CONSTRAINT hostconfigmapping_pkey PRIMARY KEY (cluster_id, host_id, type_name, create_timestamp)");
+      " ADD CONSTRAINT hostconfigmapping_pkey PRIMARY KEY (cluster_id, host_id, type_name, create_timestamp)");
     dbAccessor.executeQuery("ALTER TABLE " + HOST_COMPONENT_STATE_TABLE +
-        " ADD CONSTRAINT hostcomponentstate_pkey PRIMARY KEY (cluster_id, component_name, host_id, service_name)");
+      " ADD CONSTRAINT hostcomponentstate_pkey PRIMARY KEY (cluster_id, component_name, host_id, service_name)");
     dbAccessor.executeQuery("ALTER TABLE " + HOST_COMPONENT_DESIRED_STATE_TABLE +
-        " ADD CONSTRAINT hostcomponentdesiredstate_pkey PRIMARY KEY (cluster_id, component_name, host_id, service_name)");
+      " ADD CONSTRAINT hostcomponentdesiredstate_pkey PRIMARY KEY (cluster_id, component_name, host_id, service_name)");
     dbAccessor.executeQuery("ALTER TABLE " + HOST_STATE_TABLE +
-        " ADD CONSTRAINT hoststate_pkey PRIMARY KEY (host_id)");
+      " ADD CONSTRAINT hoststate_pkey PRIMARY KEY (host_id)");
     dbAccessor.executeQuery("ALTER TABLE " + KERBEROS_PRINCIPAL_HOST_TABLE +
-        " ADD CONSTRAINT kerberos_principal_host_pkey PRIMARY KEY (principal_name, host_id)");
+      " ADD CONSTRAINT kerberos_principal_host_pkey PRIMARY KEY (principal_name, host_id)");
     dbAccessor.executeQuery("ALTER TABLE " + SERVICE_CONFIG_HOSTS_TABLE +
-        " ADD CONSTRAINT serviceconfighosts_pkey PRIMARY KEY (service_config_id, host_id)");
+      " ADD CONSTRAINT serviceconfighosts_pkey PRIMARY KEY (service_config_id, host_id)");
 
     // Finish by deleting the unnecessary host_name columns.
     dbAccessor.dropColumn(CONFIG_GROUP_HOST_MAPPING_TABLE, HOST_NAME_COL);
@@ -579,11 +588,11 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog {
     dbAccessor.createTable(STACK_TABLE, columns, "stack_id");
 
     dbAccessor.executeQuery("ALTER TABLE " + STACK_TABLE
-        + " ADD CONSTRAINT unq_stack UNIQUE (stack_name,stack_version)", false);
+      + " ADD CONSTRAINT unq_stack UNIQUE (stack_name,stack_version)", false);
 
     dbAccessor.executeQuery(
-        "INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES('stack_id_seq', 0)",
-        false);
+      "INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES('stack_id_seq', 0)",
+      false);
 
     // create the new stack ID columns NULLABLE for now since we need to insert
     // data into them later on (we'll change them to NOT NULL after that)
@@ -894,6 +903,69 @@ public class UpgradeCatalog210 extends AbstractUpgradeCatalog {
 
     addMissingConfigs();
     updateAlertDefinitions();
+    removeStormRestApiServiceComponent();
+  }
+
+  /**
+   * Delete STORM_REST_API component if HDP is upgraded past 2.2 and the
+   * Component still exists.
+   */
+  protected void removeStormRestApiServiceComponent() {
+    AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class);
+    Clusters clusters = ambariManagementController.getClusters();
+
+    if (clusters != null) {
+      Map<String, Cluster> clusterMap = clusters.getClusters();
+      for (final Cluster cluster : clusterMap.values()) {
+        StackId stackId = cluster.getCurrentStackVersion();
+        if (stackId != null && stackId.getStackName().equals("HDP") &&
+          VersionUtils.compareVersions(stackId.getStackVersion(), "2.2") >= 0) {
+
+          executeInTransaction(new Runnable() {
+            @Override
+            public void run() {
+              ServiceComponentDesiredStateDAO dao = injector.getInstance(ServiceComponentDesiredStateDAO.class);
+              ServiceComponentDesiredStateEntityPK entityPK = new ServiceComponentDesiredStateEntityPK();
+              entityPK.setClusterId(cluster.getClusterId());
+              entityPK.setServiceName("STORM");
+              entityPK.setComponentName("STORM_REST_API");
+              ServiceComponentDesiredStateEntity entity = dao.findByPK(entityPK);
+              if (entity != null) {
+                EntityManager em = getEntityManagerProvider().get();
+                CriteriaBuilder cb = em.getCriteriaBuilder();
+
+                try {
+                  LOG.info("Deleting STORM_REST_API service component.");
+                  CriteriaDelete<HostComponentStateEntity> hcsDelete = cb.createCriteriaDelete(HostComponentStateEntity.class);
+                  CriteriaDelete<HostComponentDesiredStateEntity> hcdDelete = cb.createCriteriaDelete(HostComponentDesiredStateEntity.class);
+                  CriteriaDelete<ServiceComponentDesiredStateEntity> scdDelete = cb.createCriteriaDelete(ServiceComponentDesiredStateEntity.class);
+
+                  Root<HostComponentStateEntity> hcsRoot = hcsDelete.from(HostComponentStateEntity.class);
+                  Root<HostComponentDesiredStateEntity> hcdRoot = hcdDelete.from(HostComponentDesiredStateEntity.class);
+                  Root<ServiceComponentDesiredStateEntity> scdRoot = scdDelete.from(ServiceComponentDesiredStateEntity.class);
+
+                  hcsDelete.where(cb.equal(hcsRoot.get("componentName"), "STORM_REST_API"));
+                  hcdDelete.where(cb.equal(hcdRoot.get("componentName"), "STORM_REST_API"));
+                  scdDelete.where(cb.equal(scdRoot.get("componentName"), "STORM_REST_API"));
+
+                  em.createQuery(hcsDelete).executeUpdate();
+                  em.createQuery(hcdDelete).executeUpdate();
+                  em.createQuery(scdDelete).executeUpdate();
+                } catch (Exception e) {
+                  LOG.warn("Error deleting STORM_REST_API service component. " +
+                    "This could result in issue with ambari server start. " +
+                    "Please make sure the STORM_REST_API component is deleted " +
+                    "from the database by running following commands:\n" +
+                    "delete from hostcomponentdesiredstate where component_name='STORM_REST_API';\n" +
+                    "delete from hostcomponentstate where component_name='STORM_REST_API';\n" +
+                    "delete from servicecomponentdesiredstate where component_name='STORM_REST_API';\n", e);
+                }
+              }
+            }
+          });
+        }
+      }
+    }
   }
 
   protected void updateAlertDefinitions() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/33f24d57/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
index 356fb7d..8ea45b9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
@@ -24,14 +24,29 @@ import com.google.inject.Injector;
 import com.google.inject.Module;
 import com.google.inject.Provider;
 import com.google.inject.persist.PersistService;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.ClusterDAO;
+import org.apache.ambari.server.orm.dao.ClusterStateDAO;
+import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.orm.entities.ClusterEntity;
+import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
+import org.apache.ambari.server.orm.entities.ClusterStateEntity;
+import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.HostComponentAdminState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.easymock.Capture;
@@ -71,6 +86,7 @@ public class UpgradeCatalog210Test {
   private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class);
   private EntityManager entityManager = createNiceMock(EntityManager.class);
   private UpgradeCatalogHelper upgradeCatalogHelper;
+  private StackEntity desiredStackEntity;
 
   @Before
   public void init() {
@@ -81,6 +97,11 @@ public class UpgradeCatalog210Test {
     injector.getInstance(GuiceJpaInitializer.class);
 
     upgradeCatalogHelper = injector.getInstance(UpgradeCatalogHelper.class);
+    // inject AmbariMetaInfo to ensure that stacks get populated in the DB
+    injector.getInstance(AmbariMetaInfo.class);
+    // load the stack entity
+    StackDAO stackDAO = injector.getInstance(StackDAO.class);
+    desiredStackEntity = stackDAO.find("HDP", "2.2.0");
   }
 
   @After
@@ -215,6 +236,66 @@ public class UpgradeCatalog210Test {
     verify(controller, clusters, cluster);
   }
 
+  @Test
+  public void testDeleteStormRestApiServiceComponent() throws Exception {
+    ClusterEntity clusterEntity = upgradeCatalogHelper.createCluster(injector,
+      "c1", desiredStackEntity);
+    ClusterServiceEntity clusterServiceEntity = upgradeCatalogHelper.createService(
+      injector, clusterEntity, "STORM");
+    HostEntity hostEntity = upgradeCatalogHelper.createHost(injector,
+      clusterEntity, "h1");
+
+    // Set current stack version
+    ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
+    ClusterStateDAO clusterStateDAO = injector.getInstance(ClusterStateDAO.class);
+    ClusterStateEntity clusterStateEntity = new ClusterStateEntity();
+    clusterStateEntity.setClusterId(clusterEntity.getClusterId());
+    clusterStateEntity.setClusterEntity(clusterEntity);
+    clusterStateEntity.setCurrentStack(desiredStackEntity);
+    clusterStateDAO.create(clusterStateEntity);
+    clusterEntity.setClusterStateEntity(clusterStateEntity);
+    clusterDAO.merge(clusterEntity);
+
+    ServiceComponentDesiredStateEntity componentDesiredStateEntity = new ServiceComponentDesiredStateEntity();
+    componentDesiredStateEntity.setClusterId(clusterEntity.getClusterId());
+    componentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName());
+    componentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
+    componentDesiredStateEntity.setComponentName("STORM_REST_API");
+    componentDesiredStateEntity.setDesiredStack(desiredStackEntity);
+
+    HostComponentDesiredStateDAO hostComponentDesiredStateDAO =
+      injector.getInstance(HostComponentDesiredStateDAO.class);
+
+    HostComponentDesiredStateEntity hostComponentDesiredStateEntity = new HostComponentDesiredStateEntity();
+
+    hostComponentDesiredStateEntity.setClusterId(clusterEntity.getClusterId());
+    hostComponentDesiredStateEntity.setComponentName("STORM_REST_API");
+    hostComponentDesiredStateEntity.setAdminState(HostComponentAdminState.INSERVICE);
+    hostComponentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName());
+    hostComponentDesiredStateEntity.setServiceComponentDesiredStateEntity(componentDesiredStateEntity);
+    hostComponentDesiredStateEntity.setHostEntity(hostEntity);
+    hostComponentDesiredStateEntity.setDesiredStack(desiredStackEntity);
+
+    hostComponentDesiredStateDAO.create(hostComponentDesiredStateEntity);
+
+    HostComponentDesiredStateEntity entity = hostComponentDesiredStateDAO.findAll().get(0);
+
+    Assert.assertEquals(HostComponentAdminState.INSERVICE.name(), entity.getAdminState().name());
+
+    UpgradeCatalog210 upgradeCatalog210 = injector.getInstance(UpgradeCatalog210.class);
+    upgradeCatalog210.removeStormRestApiServiceComponent();
+
+    ServiceComponentDesiredStateDAO componentDesiredStateDAO =
+      injector.getInstance(ServiceComponentDesiredStateDAO.class);
+
+    ServiceComponentDesiredStateEntityPK entityPK = new ServiceComponentDesiredStateEntityPK();
+    entityPK.setClusterId(clusterEntity.getClusterId());
+    entityPK.setServiceName("STORM");
+    entityPK.setComponentName("STORM_REST_API");
+    Assert.assertNull(componentDesiredStateDAO.findByPK(entityPK));
+  }
+
+
   /**
    * @param dbAccessor
    * @return