Repository: ambari Updated Branches: refs/heads/branch-2.2 bf0014c50 -> 2d65e6aae
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/2d65e6aa Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/2d65e6aa Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/2d65e6aa Branch: refs/heads/branch-2.2 Commit: 2d65e6aaebcec9227bd15f853de22445b09d6632 Parents: bf0014c Author: Jonathan Hurley <jhur...@hortonworks.com> Authored: Tue Mar 1 16:35:19 2016 -0500 Committer: Jonathan Hurley <jhur...@hortonworks.com> Committed: Wed Mar 2 09:52:18 2016 -0500 ---------------------------------------------------------------------- .../server/upgrade/AbstractUpgradeCatalog.java | 42 +++---- .../server/upgrade/UpgradeCatalog220.java | 114 ++++++++++++------- 2 files changed, 96 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/2d65e6aa/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 7cbdd33..7be2dfe 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,11 +17,23 @@ */ 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; @@ -48,21 +60,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 http://git-wip-us.apache.org/repos/asf/ambari/blob/2d65e6aa/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 {