commit 5aa017cfa520c887fb5778ffde80a87b04e60cc5 Author: Alice Fan Date: Thu Jan 16 19:42:16 2020 -0800 HIVE-22739: Schematool should check if upgradeFrom version is identical to current DB schema version diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/schematool/SchemaToolTaskUpgrade.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/schematool/SchemaToolTaskUpgrade.java index 0588342243..8f615b3fea 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/schematool/SchemaToolTaskUpgrade.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/tools/schematool/SchemaToolTaskUpgrade.java @@ -24,10 +24,13 @@ import org.apache.hadoop.hive.metastore.HiveMetaException; import org.apache.hadoop.hive.metastore.tools.schematool.HiveSchemaHelper.MetaStoreConnectionInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Perform metastore schema upgrade. */ class SchemaToolTaskUpgrade extends SchemaToolTask { + private static final Logger LOG = LoggerFactory.getLogger(SchemaToolTaskUpgrade.class); private String fromVersion; @Override @@ -38,14 +41,28 @@ void setCommandLineArguments(SchemaToolCommandLine cl) { } private void ensureFromVersion() throws HiveMetaException { + MetaStoreConnectionInfo connectionInfo = schemaTool.getConnectionInfo(false); + String dbVersion = null; + try { + dbVersion = schemaTool.getMetaStoreSchemaInfo().getMetaStoreSchemaVersion(connectionInfo); + } catch (HiveMetaException e) { + LOG.info("Exception getting db version:" + e.getMessage()); + LOG.info("Try to initialize db schema"); + } + if (fromVersion != null) { + if (dbVersion != null && !fromVersion.equals(dbVersion)) { + throw new RuntimeException("The upgradeSchemaFrom version " + fromVersion + " and Metastore schema version " + + dbVersion + " are different."); + } + System.out.println("Upgrading from the user input version " + fromVersion); return; } - - // If null, then read from the metastore - MetaStoreConnectionInfo connectionInfo = schemaTool.getConnectionInfo(false); - fromVersion = schemaTool.getMetaStoreSchemaInfo().getMetaStoreSchemaVersion(connectionInfo); - if (fromVersion == null || fromVersion.isEmpty()) { + // fromVersion is null + if (dbVersion != null) { + fromVersion = dbVersion; + } else { + // both fromVersion and dbVersion are null throw new HiveMetaException("Schema version not stored in the metastore. " + "Metastore schema is too old or corrupt. Try specifying the version manually"); }