AMBARI-21795. Auto fix service config mapping issue discovered during 
ambari-upgrade.(vbrodetskyi)


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

Branch: refs/heads/feature-branch-AMBARI-21307
Commit: ca5fd78778345d74d885cd547c44917cf0feb03f
Parents: 698293d
Author: Vitaly Brodetskyi <vbrodets...@hortonworks.com>
Authored: Fri Aug 25 22:54:13 2017 +0300
Committer: Vitaly Brodetskyi <vbrodets...@hortonworks.com>
Committed: Fri Aug 25 22:54:13 2017 +0300

----------------------------------------------------------------------
 .../checks/DatabaseConsistencyCheckHelper.java  |  4 +--
 .../orm/entities/ClusterConfigEntity.java       | 12 +++----
 .../apache/ambari/server/state/ServiceImpl.java |  2 +-
 .../server/upgrade/UpgradeCatalog260.java       | 38 ++++++++++++++++++++
 .../main/resources/Ambari-DDL-Derby-CREATE.sql  |  2 +-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  2 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  2 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  2 +-
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql |  2 +-
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |  2 +-
 .../server/upgrade/UpgradeCatalog260Test.java   |  9 +++++
 11 files changed, 62 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
index aae34ae..1e2dac5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java
@@ -570,7 +570,7 @@ public class DatabaseConsistencyCheckHelper {
     List<ClusterConfigEntity> notMappedClusterConfigs = 
getNotMappedClusterConfigsToService();
 
     for (ClusterConfigEntity clusterConfigEntity : notMappedClusterConfigs){
-      if (!clusterConfigEntity.isServiceDeleted()){
+      if (!clusterConfigEntity.isUnmapped()){
         continue; // skip clusterConfigs that did not leave after service 
deletion
       }
       List<String> types = new ArrayList<>();
@@ -605,7 +605,7 @@ public class DatabaseConsistencyCheckHelper {
 
     Set<String> nonMappedConfigs = new HashSet<>();
     for (ClusterConfigEntity clusterConfigEntity : notMappedClasterConfigs) {
-      if (!clusterConfigEntity.isServiceDeleted()){
+      if (!clusterConfigEntity.isUnmapped()){
         nonMappedConfigs.add(clusterConfigEntity.getType() + '-' + 
clusterConfigEntity.getTag());
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
index 3a74367..0c5276c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
@@ -132,8 +132,8 @@ public class ClusterConfigEntity {
   @ManyToMany(mappedBy = "clusterConfigEntities")
   private Collection<ServiceConfigEntity> serviceConfigEntities;
 
-  @Column(name = "service_deleted", nullable = false, insertable = true, 
updatable = true)
-  private short serviceDeleted = 0;
+  @Column(name = "unmapped", nullable = false, insertable = true, updatable = 
true)
+  private short unmapped = 0;
 
   /**
    * Unidirectional one-to-one association to {@link StackEntity}
@@ -142,12 +142,12 @@ public class ClusterConfigEntity {
   @JoinColumn(name = "stack_id", unique = false, nullable = false, insertable 
= true, updatable = true)
   private StackEntity stack;
 
-  public boolean isServiceDeleted() {
-    return serviceDeleted != 0;
+  public boolean isUnmapped() {
+    return unmapped != 0;
   }
 
-  public void setServiceDeleted(boolean serviceDeleted) {
-    this.serviceDeleted = (short)(serviceDeleted ? 1 : 0);
+  public void setUnmapped(boolean unmapped) {
+    this.unmapped  = (short)(unmapped ? 1 : 0);
   }
 
   public Long getConfigId() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index 0247774..1104d19 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@ -504,7 +504,7 @@ public class ServiceImpl implements Service {
       for (ClusterConfigEntity serviceConfigEntity : 
lastServiceConfigEntity.getClusterConfigEntities()) {
         LOG.info("Disabling configuration {}", serviceConfigEntity);
         serviceConfigEntity.setSelected(false);
-        serviceConfigEntity.setServiceDeleted(true);
+        serviceConfigEntity.setUnmapped(true);
         clusterDAO.merge(serviceConfigEntity);
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
index 9e1b55b..b4e7a02 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
@@ -21,8 +21,12 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.orm.DBAccessor;
+import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,6 +48,8 @@ public class UpgradeCatalog260 extends AbstractUpgradeCatalog 
{
 
   public static final String CLUSTER_CONFIG_TABLE = "clusterconfig";
   public static final String SELECTED_COLUMN = "selected";
+  public static final String SERVICE_DELETED_COLUMN = "service_deleted";
+  public static final String UNMAPPED_COLUMN = "unmapped";
   public static final String SELECTED_TIMESTAMP_COLUMN = "selected_timestamp";
 
   public static final String SERVICE_COMPONENT_DESIRED_STATE_TABLE = 
"servicecomponentdesiredstate";
@@ -149,6 +155,37 @@ public class UpgradeCatalog260 extends 
AbstractUpgradeCatalog {
     createUpgradeHistoryTable();
     dropStaleTables();
     updateRepositoryVersionTable();
+    renameServiceDeletedColumn();
+  }
+
+  private void renameServiceDeletedColumn() throws AmbariException, 
SQLException {
+    if (dbAccessor.tableHasColumn(CLUSTER_CONFIG_TABLE, 
SERVICE_DELETED_COLUMN)) {
+      dbAccessor.renameColumn(CLUSTER_CONFIG_TABLE, SERVICE_DELETED_COLUMN, 
new DBAccessor.DBColumnInfo(UNMAPPED_COLUMN, Short.class, null, 0, false));
+    }
+  }
+
+  /*
+  * This method, search for configs which are not linked with any service
+  * and set "unmapped" to true. We need that because in case when
+  * config is not mapped and "unmapped" flag = false, db consistency check
+  * will show warning about not mapped config. (AMBARI-21795)
+  * */
+  private void setUnmappedForOrphanedConfigs() {
+    executeInTransaction(new Runnable() {
+      @Override
+      public void run() {
+        EntityManager entityManager = getEntityManagerProvider().get();
+        Query query = 
entityManager.createNamedQuery("ClusterConfigEntity.findNotMappedClusterConfigsToService",ClusterConfigEntity.class);
+
+        List<ClusterConfigEntity> notMappedConfigs =  
(List<ClusterConfigEntity>) query.getResultList();
+        if (notMappedConfigs != null) {
+          for (ClusterConfigEntity clusterConfigEntity : notMappedConfigs) {
+            clusterConfigEntity.setUnmapped(true);
+            entityManager.merge(clusterConfigEntity);
+          }
+        }
+      }
+    });
   }
 
   private void createUpgradeHistoryTable() throws SQLException {
@@ -329,6 +366,7 @@ public class UpgradeCatalog260 extends 
AbstractUpgradeCatalog {
   @Override
   protected void executeDMLUpdates() throws AmbariException, SQLException {
     addNewConfigurationsFromXml();
+    setUnmappedForOrphanedConfigs();
     removeSupersetFromDruid();
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
index 8a55336..dc7f79a 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -76,7 +76,7 @@ CREATE TABLE clusterconfig (
   config_data VARCHAR(3000) NOT NULL,
   config_attributes VARCHAR(3000),
   create_timestamp BIGINT NOT NULL,
-  service_deleted SMALLINT NOT NULL DEFAULT 0,
+  unmapped SMALLINT NOT NULL DEFAULT 0,
   selected_timestamp BIGINT NOT NULL DEFAULT 0,
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index a0916bf..0c28012 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -96,7 +96,7 @@ CREATE TABLE clusterconfig (
   config_data LONGTEXT NOT NULL,
   config_attributes LONGTEXT,
   create_timestamp BIGINT NOT NULL,
-  service_deleted SMALLINT NOT NULL DEFAULT 0,
+  unmapped SMALLINT NOT NULL DEFAULT 0,
   selected_timestamp BIGINT NOT NULL DEFAULT 0,
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index 5204ebb..6cd330c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -76,7 +76,7 @@ CREATE TABLE clusterconfig (
   config_data CLOB NOT NULL,
   config_attributes CLOB,
   create_timestamp NUMBER(19) NOT NULL,
-  service_deleted SMALLINT DEFAULT 0 NOT NULL,
+  unmapped SMALLINT DEFAULT 0 NOT NULL,
   selected_timestamp NUMBER(19) DEFAULT 0 NOT NULL,
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index dee2f87..8c8ed5c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -76,7 +76,7 @@ CREATE TABLE clusterconfig (
   config_data TEXT NOT NULL,
   config_attributes TEXT,
   create_timestamp BIGINT NOT NULL,
-  service_deleted SMALLINT NOT NULL DEFAULT 0,
+  unmapped SMALLINT NOT NULL DEFAULT 0,
   selected_timestamp BIGINT NOT NULL DEFAULT 0,
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
index 654bac8..59abd8b 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -75,7 +75,7 @@ CREATE TABLE clusterconfig (
   config_data TEXT NOT NULL,
   config_attributes TEXT,
   create_timestamp NUMERIC(19) NOT NULL,
-  service_deleted SMALLINT NOT NULL DEFAULT 0,
+  unmapped SMALLINT NOT NULL DEFAULT 0,
   selected_timestamp NUMERIC(19) NOT NULL DEFAULT 0,
   CONSTRAINT PK_clusterconfig PRIMARY KEY (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql 
b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index 238dc1c..ea92256 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -89,7 +89,7 @@ CREATE TABLE clusterconfig (
   config_data VARCHAR(MAX) NOT NULL,
   config_attributes VARCHAR(MAX),
   create_timestamp BIGINT NOT NULL,
-  service_deleted SMALLINT NOT NULL DEFAULT 0,
+  unmapped SMALLINT NOT NULL DEFAULT 0,
   selected_timestamp BIGINT NOT NULL DEFAULT 0,
   CONSTRAINT PK_clusterconfig PRIMARY KEY CLUSTERED (config_id),
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES 
clusters (cluster_id),

http://git-wip-us.apache.org/repos/asf/ambari/blob/ca5fd787/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
index 2e38686..b6c323e 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
@@ -145,6 +145,7 @@ public class UpgradeCatalog260Test {
     expect(connection.createStatement()).andReturn(statement).anyTimes();
     
expect(statement.executeQuery(anyObject(String.class))).andReturn(resultSet).anyTimes();
     
expect(configuration.getDatabaseType()).andReturn(Configuration.DatabaseType.POSTGRES).anyTimes();
+    expect(dbAccessor.tableHasColumn(UpgradeCatalog260.CLUSTER_CONFIG_TABLE, 
UpgradeCatalog260.SERVICE_DELETED_COLUMN)).andReturn(true).anyTimes();
 
 
     Capture<String[]> scdcaptureKey = newCapture();
@@ -182,6 +183,9 @@ public class UpgradeCatalog260Test {
     Capture<DBColumnInfo> repoVersionHiddenColumnCapture = newCapture();
     expectUpdateRepositoryVersionTableTable(repoVersionHiddenColumnCapture);
 
+    Capture<DBColumnInfo> unapped = newCapture();
+    expectRenameServiceDeletedColumn(unapped);
+
     replay(dbAccessor, configuration, connection, statement, resultSet);
 
     Module module = new Module() {
@@ -218,6 +222,11 @@ public class UpgradeCatalog260Test {
     expectLastCall().once();
   }
 
+  public  void expectRenameServiceDeletedColumn(Capture<DBColumnInfo> 
unmapped) throws SQLException {
+    dbAccessor.renameColumn(eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), 
eq(UpgradeCatalog260.SERVICE_DELETED_COLUMN), capture(unmapped));
+    expectLastCall().once();
+  }
+
   public void verifyCreateUpgradeHistoryTable(Capture<List<DBColumnInfo>> 
columns) {
     List<DBColumnInfo> columnsValue = columns.getValue();
     Assert.assertEquals(columnsValue.size(), 6);

Reply via email to