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 {