Return-Path: X-Original-To: apmail-hive-commits-archive@www.apache.org Delivered-To: apmail-hive-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B8EA818D38 for ; Mon, 26 Oct 2015 06:26:47 +0000 (UTC) Received: (qmail 79289 invoked by uid 500); 26 Oct 2015 06:26:47 -0000 Delivered-To: apmail-hive-commits-archive@hive.apache.org Received: (qmail 79239 invoked by uid 500); 26 Oct 2015 06:26:47 -0000 Mailing-List: contact commits-help@hive.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hive-dev@hive.apache.org Delivered-To: mailing list commits@hive.apache.org Received: (qmail 79228 invoked by uid 99); 26 Oct 2015 06:26:47 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 26 Oct 2015 06:26:47 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 6C5B5DFC92; Mon, 26 Oct 2015 06:26:47 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: thejas@apache.org To: commits@hive.apache.org Message-Id: <159fd17ab45548c3b60e3f308f92807a@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: hive git commit: HIVE-12261 : schematool version info exit status should depend on compatibility, not equality (Thejas Nair, reviewed by Sushanth Sowmyan) Date: Mon, 26 Oct 2015 06:26:47 +0000 (UTC) Repository: hive Updated Branches: refs/heads/branch-1 234972142 -> d33e90ccb HIVE-12261 : schematool version info exit status should depend on compatibility, not equality (Thejas Nair, reviewed by Sushanth Sowmyan) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/d33e90cc Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/d33e90cc Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/d33e90cc Branch: refs/heads/branch-1 Commit: d33e90ccb0b6a42490a68600c50679c4acd42f85 Parents: 2349721 Author: Thejas Nair Authored: Sun Oct 25 23:26:17 2015 -0700 Committer: Thejas Nair Committed: Sun Oct 25 23:26:43 2015 -0700 ---------------------------------------------------------------------- .../org/apache/hive/beeline/HiveSchemaTool.java | 14 +++--- .../hive/metastore/MetaStoreSchemaInfo.java | 44 ++++++++++++++++++ .../hive/metastore/TestMetaStoreSchemaInfo.java | 49 ++++++++++++++++++++ 3 files changed, 100 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/d33e90cc/beeline/src/java/org/apache/hive/beeline/HiveSchemaTool.java ---------------------------------------------------------------------- diff --git a/beeline/src/java/org/apache/hive/beeline/HiveSchemaTool.java b/beeline/src/java/org/apache/hive/beeline/HiveSchemaTool.java index ed58fe0..79ecad3 100644 --- a/beeline/src/java/org/apache/hive/beeline/HiveSchemaTool.java +++ b/beeline/src/java/org/apache/hive/beeline/HiveSchemaTool.java @@ -129,7 +129,7 @@ public class HiveSchemaTool { String dbVersion = getMetaStoreSchemaVersion(metastoreConn); System.out.println("Hive distribution version:\t " + hiveVersion); System.out.println("Metastore schema version:\t " + dbVersion); - assertSameVersion(hiveVersion, dbVersion); + assertCompatibleVersion(hiveVersion, dbVersion); } @@ -179,15 +179,15 @@ public class HiveSchemaTool { String newSchemaVersion = getMetaStoreSchemaVersion( getConnectionToMetastore(false)); // verify that the new version is added to schema - assertSameVersion(MetaStoreSchemaInfo.getHiveSchemaVersion(), newSchemaVersion); + assertCompatibleVersion(MetaStoreSchemaInfo.getHiveSchemaVersion(), newSchemaVersion); } - private void assertSameVersion(String hiveSchemaVersion, String dbSchemaVersion) + private void assertCompatibleVersion(String hiveSchemaVersion, String dbSchemaVersion) throws HiveMetaException { - if (!hiveSchemaVersion.equalsIgnoreCase(dbSchemaVersion)) { - throw new HiveMetaException("Expected schema version " + hiveSchemaVersion - + ", found version " + dbSchemaVersion); - } + if (!MetaStoreSchemaInfo.isVersionCompatible(hiveSchemaVersion, dbSchemaVersion)) { + throw new HiveMetaException("Metastore schema version is not compatible. Hive Version: " + + hiveSchemaVersion + ", Database Schema Version: " + dbSchemaVersion); + } } /** http://git-wip-us.apache.org/repos/asf/hive/blob/d33e90cc/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreSchemaInfo.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreSchemaInfo.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreSchemaInfo.java index d72267d..98798e8 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreSchemaInfo.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreSchemaInfo.java @@ -151,6 +151,10 @@ public class MetaStoreSchemaInfo { public static String getHiveSchemaVersion() { String hiveVersion = HiveVersionInfo.getShortVersion(); + return getEquivalentVersion(hiveVersion); + } + + private static String getEquivalentVersion(String hiveVersion) { // if there is an equivalent version, return that, else return this version String equivalentVersion = EQUIVALENT_VERSIONS.get(hiveVersion); if (equivalentVersion != null) { @@ -160,4 +164,44 @@ public class MetaStoreSchemaInfo { } } + /** + * A dbVersion is compatible with hive version if it is greater or equal to + * the hive version. This is result of the db schema upgrade design principles + * followed in hive project. + * + * @param hiveVersion + * version of hive software + * @param dbVersion + * version of metastore rdbms schema + * @return true if versions are compatible + */ + public static boolean isVersionCompatible(String hiveVersion, String dbVersion) { + hiveVersion = getEquivalentVersion(hiveVersion); + dbVersion = getEquivalentVersion(dbVersion); + if (hiveVersion.equals(dbVersion)) { + return true; + } + String[] hiveVerParts = hiveVersion.split("\\."); + String[] dbVerParts = dbVersion.split("\\."); + if (hiveVerParts.length != 3 || dbVerParts.length != 3) { + // these are non standard version numbers. can't perform the + // comparison on these, so assume that they are incompatible + return false; + } + + for (int i = 0; i < dbVerParts.length; i++) { + Integer dbVerPart = Integer.valueOf(dbVerParts[i]); + Integer hiveVerPart = Integer.valueOf(hiveVerParts[i]); + if (dbVerPart > hiveVerPart) { + return true; + } else if (dbVerPart < hiveVerPart) { + return false; + } else { + continue; // compare next part + } + } + + return true; + } + } http://git-wip-us.apache.org/repos/asf/hive/blob/d33e90cc/metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreSchemaInfo.java ---------------------------------------------------------------------- diff --git a/metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreSchemaInfo.java b/metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreSchemaInfo.java new file mode 100644 index 0000000..7142001 --- /dev/null +++ b/metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreSchemaInfo.java @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.metastore; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Test MetaStoreSchemaInfo + */ +public class TestMetaStoreSchemaInfo { + + @Test + public void testIsVersionCompatible() throws Exception { + // first argument is hiveVersion, it is compatible if 2nd argument - dbVersion is + // greater than or equal to it + // check the compatible case + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("0.0.1", "0.0.1")); + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("0.0.1", "0.0.2")); + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("1.0.2", "2.0.1")); + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("0.0.9", "9.0.0")); + + // check equivalent versions, should be compatible + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("0.13.0", "0.13.1")); + Assert.assertTrue(MetaStoreSchemaInfo.isVersionCompatible("0.13.1", "0.13.0")); + + // check incompatible versions + Assert.assertFalse(MetaStoreSchemaInfo.isVersionCompatible("0.1.1", "0.1.0")); + Assert.assertFalse(MetaStoreSchemaInfo.isVersionCompatible("4.0.1", "0.1.0")); + + } + +}