You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2016/03/02 15:43:09 UTC

ambari git commit: AMBARI-15253 - Ambari upgrade fails if there is incorrect version in upgrade table (jonathanhurley)

Repository: ambari
Updated Branches:
  refs/heads/trunk c3c723e7a -> 43d3a27c5


AMBARI-15253 - Ambari upgrade fails if there is incorrect version in upgrade table (jonathanhurley)


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

Branch: refs/heads/trunk
Commit: 43d3a27c5541af661108677658040550dae3e1e4
Parents: c3c723e
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Tue Mar 1 16:35:19 2016 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Wed Mar 2 09:42:59 2016 -0500

----------------------------------------------------------------------
 .../server/upgrade/AbstractUpgradeCatalog.java  |  51 +++++----
 .../server/upgrade/UpgradeCatalog220.java       | 114 ++++++++++++-------
 2 files changed, 102 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/43d3a27c/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
index 8489486..f0fc245 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
@@ -17,16 +17,27 @@
  */
 package org.apache.ambari.server.upgrade;
 
-import com.google.common.collect.Maps;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.persist.Transactional;
+import java.io.StringReader;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.configuration.Configuration.DatabaseType;
 import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.dao.ArtifactDAO;
 import org.apache.ambari.server.orm.dao.MetainfoDAO;
@@ -48,21 +59,11 @@ import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 
-import javax.persistence.EntityManager;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.StringReader;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.persist.Transactional;
 
 public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
   @Inject
@@ -462,10 +463,14 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog {
           LOG.info("Applying configuration with tag '{}' to " +
             "cluster '{}'", newTag, cluster.getClusterName());
 
-          Map<String, Map<String, String>> propertiesAttributes;
+          Map<String, Map<String, String>> propertiesAttributes = null;
           if (oldConfig != null) {
             propertiesAttributes = oldConfig.getPropertiesAttributes();
-          } else {
+          }
+
+          // the contract of creating a configuration requires non-null
+          // collections for attributes
+          if (null == propertiesAttributes) {
             propertiesAttributes = Collections.emptyMap();
           }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/43d3a27c/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
index 2330a21..ac6b3c5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
@@ -18,15 +18,31 @@
 
 package org.apache.ambari.server.upgrade;
 
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.persist.Transactional;
+import java.io.StringWriter;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.regex.Matcher;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -47,23 +63,23 @@ import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
-import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.orm.entities.UpgradeEntity;
-
-
+import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.alert.SourceType;
+import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
-import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory;
-import org.apache.ambari.server.state.kerberos.KerberosComponentDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
+import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
 import org.apache.ambari.server.state.stack.upgrade.Direction;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
@@ -76,28 +92,11 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.StringWriter;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.regex.Matcher;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.persist.Transactional;
 
 /**
  * Upgrade catalog for version 2.2.0.
@@ -598,11 +597,32 @@ public class UpgradeCatalog220 extends AbstractUpgradeCatalog {
   }
 
   /**
-   * Find the single Repo Version for the given stack and version, and return its upgrade_package column.
-   * Because the upgrade_package column is going to be removed from this entity, must use raw SQL
-   * instead of the entity class.
-   * @param stack Stack
-   * @param version Stack version
+   * Find the single Repo Version for the given stack and version, and return
+   * its upgrade_package column. Because the upgrade_package column is going to
+   * be removed from this entity, must use raw SQL instead of the entity class.
+   * <p/>
+   * It's possible that there is an invalid version listed in the upgrade table.
+   * For example:
+   *
+   * <pre>
+   * upgrade
+   * 1 2 1295  2.2.0.0-2041  2.2.4.2-2     UPGRADE
+   * 2 2 1296  2.2.0.0-2041  2.2.0.0-2041  DOWNGRADE
+   * 3 2 1299  2.2.0.0-2041  2.2.4.2       UPGRADE
+   *
+   * repo_version
+   * 1  2.2.0.0-2041  HDP-2.2.0.0-2041  upgrade-2.2
+   * 2  2.2.4.2-2     HDP-2.2.4.2-2     upgrade-2.2
+   * </pre>
+   *
+   * Notice that it's possible for the {@code upgrade} table to include entries
+   * for a repo version which does not exist; {@code 2.2.4.2}. In these cases,
+   * this method will attempt a "best match".
+   *
+   * @param stack
+   *          Stack
+   * @param version
+   *          Stack version
    * @return The value of the upgrade_package column, or null if not found.
    */
 
@@ -612,6 +632,20 @@ public class UpgradeCatalog220 extends AbstractUpgradeCatalog {
     if (null != version && null != stack) {
       RepositoryVersionEntity repoVersion = repositoryVersionDAO.findByStackNameAndVersion(stack.getStackName(), version);
 
+      // a null repoVersion means there's mismatch between the upgrade and repo_version table;
+      // use a best-guess approach based on the Stack
+      if( null == repoVersion ){
+        List<RepositoryVersionEntity> bestMatches = repositoryVersionDAO.findByStack(new StackId(stack));
+        if (!bestMatches.isEmpty()) {
+          repoVersion = bestMatches.get(0);
+        }
+      }
+
+      // our efforts have failed; we have no idea what to use; return null as per the contract of the method
+      if( null == repoVersion ) {
+        return null;
+      }
+
       Statement statement = null;
       ResultSet rs = null;
       try {