Repository: ambari
Updated Branches:
  refs/heads/branch-2.1.2 8a800741e -> 79dc49ae0


AMBARI-13459 - Hive Metastore Upgrade Retry Fails Because Of Driver Copy Issue 
(jonathanhurley)


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

Branch: refs/heads/branch-2.1.2
Commit: 79dc49ae03d7c59568e445261132ae52ace8f719
Parents: 8a80074
Author: Jonathan Hurley <jhur...@hortonworks.com>
Authored: Fri Oct 16 14:09:26 2015 -0400
Committer: Jonathan Hurley <jhur...@hortonworks.com>
Committed: Fri Oct 16 16:08:51 2015 -0400

----------------------------------------------------------------------
 .../package/scripts/hive_metastore.py           | 30 +++++++++++++-------
 .../stacks/2.1/HIVE/test_hive_metastore.py      |  8 ++++--
 2 files changed, 24 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/79dc49ae/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
 
b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
index 796ec18..8a3833b 100644
--- 
a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
+++ 
b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
@@ -33,7 +33,6 @@ from resource_management.libraries.functions.security_commons 
import get_params_
 from resource_management.libraries.functions.security_commons import 
validate_security_config_properties
 from resource_management.libraries.functions.security_commons import 
FILE_TYPE_XML
 from resource_management.core.resources.system import File
-from resource_management.core.shell import as_sudo
 
 from hive import hive
 from hive import jdbc_connector
@@ -155,7 +154,7 @@ class HiveMetastoreDefault(HiveMetastore):
     """
     Executes the schema upgrade binary.  This is its own function because it 
could
     be called as a standalone task from the upgrade pack, but is safe to run 
it for each
-    metastore instance.
+    metastore instance. The schema upgrade on an already upgraded metastore is 
a NOOP.
 
     The metastore schema upgrade requires a database driver library for most
     databases. During an upgrade, it's possible that the library is not 
present,
@@ -173,28 +172,36 @@ class HiveMetastoreDefault(HiveMetastore):
     # present, then download it first
     if params.hive_jdbc_driver in params.hive_jdbc_drivers_list and 
params.hive_use_existing_db:
       target_directory = format("/usr/hdp/{version}/hive/lib")
-      if not os.path.exists(params.target):
-        # download it
+
+      # normally, the JDBC driver would be referenced by 
/usr/hdp/current/.../foo.jar
+      # but if hdp-select is called and the restart fails, then this means 
that current pointer
+      # is now pointing to the upgraded version location; that's bad for the 
cp command
+      source_jdbc_file = format(params.target.replace("/usr/hdp/current", 
"/usr/hdp/{current_version}"))
+
+      # download it if it does not exist
+      if not os.path.exists(source_jdbc_file):
         jdbc_connector()
 
+      target_directory_and_filename = os.path.join(target_directory, 
os.path.basename(source_jdbc_file))
+
       if params.sqla_db_used:
         target_native_libs_directory = 
format("{target_directory}/native/lib64")
 
         Execute(format("yes | {sudo} cp {jars_in_hive_lib} 
{target_directory}"))
 
-        Directory(target_native_libs_directory,
-                  recursive=True)
+        Directory(target_native_libs_directory, recursive=True)
 
         Execute(format("yes | {sudo} cp {libs_in_hive_lib} 
{target_native_libs_directory}"))
 
         Execute(format("{sudo} chown -R {hive_user}:{user_group} 
{hive_lib}/*"))
       else:
-        Execute(('cp', params.target, target_directory),
-                path=["/bin", "/usr/bin/"], sudo = True)
+        # copy the JDBC driver from the older metastore location to the new 
location only
+        # if it does not already exist
+        if not os.path.exists(target_directory_and_filename):
+          Execute(('cp', source_jdbc_file, target_directory),
+            path=["/bin", "/usr/bin/"], sudo = True)
 
-      File(os.path.join(target_directory, os.path.basename(params.target)),
-        mode = 0644,
-      )
+      File(target_directory_and_filename, mode = 0644)
 
     # build the schema tool command
     binary = format("/usr/hdp/{version}/hive/bin/schematool")
@@ -215,5 +222,6 @@ class HiveMetastoreDefault(HiveMetastore):
     command = format("{binary} -dbType {hive_metastore_db_type} 
-upgradeSchema")
     Execute(command, user=params.hive_user, tries=1, environment=env_dict, 
logoutput=True)
 
+
 if __name__ == "__main__":
   HiveMetastore().execute()

http://git-wip-us.apache.org/repos/asf/ambari/blob/79dc49ae/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py 
b/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py
index 9d42b9f..8150cdb 100644
--- a/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py
+++ b/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py
@@ -539,7 +539,7 @@ class TestHiveMetastore(RMFTestCase):
     get_hdp_version_mock.return_value = '2.3.0.0-1234'
 
     def side_effect(path):
-      if path == "/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar":
+      if path == 
"/usr/hdp/2.2.7.0-1234/hive-server2/lib/mysql-connector-java.jar":
         return True
       return False
 
@@ -554,6 +554,8 @@ class TestHiveMetastore(RMFTestCase):
     version = '2.3.0.0-1234'
     json_content['commandParams']['version'] = version
     json_content['hostLevelParams']['stack_version'] = "2.3"
+    json_content['hostLevelParams']['current_version'] = "2.2.7.0-1234"
+
 
     # trigger the code to think it needs to copy the JAR
     
json_content['configurations']['hive-site']['javax.jdo.option.ConnectionDriverName']
 = "com.mysql.jdbc.Driver"
@@ -570,7 +572,7 @@ class TestHiveMetastore(RMFTestCase):
       mocks_dict = mocks_dict)
 
     self.assertResourceCalled('Execute',
-      ('cp', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', 
'/usr/hdp/2.3.0.0-1234/hive/lib'),
+      ('cp', 
'/usr/hdp/2.2.7.0-1234/hive-server2/lib/mysql-connector-java.jar', 
'/usr/hdp/2.3.0.0-1234/hive/lib'),
       path = ['/bin', '/usr/bin/'], sudo = True)
 
     self.assertResourceCalled('File', 
'/usr/hdp/2.3.0.0-1234/hive/lib/mysql-connector-java.jar',
@@ -578,7 +580,7 @@ class TestHiveMetastore(RMFTestCase):
     )
 
     self.assertResourceCalled('Execute', 
"/usr/hdp/2.3.0.0-1234/hive/bin/schematool -dbType mysql -upgradeSchema",
-     logoutput = True, environment = {'HIVE_CONF_DIR': 
'/usr/hdp/current/hive-server2/conf/conf.server'},
+     logoutput = True, environment = {'HIVE_CONF_DIR': 
'/etc/hive/conf.server'},
       tries = 1, user = 'hive')
 
     self.assertResourceCalled('Execute', ('hdp-select', 'set', 
'hive-metastore', version), sudo=True,)

Reply via email to