This is an automated email from the ASF dual-hosted git repository.

abstractdog pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new e570856  HIVE-25331: Create database query doesn't create 
MANAGEDLOCATION directory (#2478) (Robbie Zhang reviewed by Laszlo Bodor and 
Pravin Kumar Sinha)
e570856 is described below

commit e5708566884611dcbacc8d369982da3e4eeb809e
Author: Robbie Zhang <[email protected]>
AuthorDate: Mon Sep 27 22:00:11 2021 +1000

    HIVE-25331: Create database query doesn't create MANAGEDLOCATION directory 
(#2478) (Robbie Zhang reviewed by Laszlo Bodor and Pravin Kumar Sinha)
---
 .../TestReplicationScenariosExclusiveReplica.java      |  8 ++++----
 .../security/TestMetastoreAuthorizationProvider.java   |  4 ++++
 .../ddl/database/create/CreateDatabaseOperation.java   |  9 ++++++++-
 ql/src/test/queries/clientpositive/create_database.q   |  4 ++++
 .../clientpositive/llap/alter_change_db_location.q.out |  2 +-
 .../results/clientpositive/llap/create_database.q.out  | 18 ++++++++++++++++++
 .../clientpositive/llap/database_location.q.out        |  2 +-
 .../results/clientpositive/tez/explainanalyze_3.q.out  |  2 +-
 .../results/clientpositive/tez/explainuser_3.q.out     |  2 +-
 .../org/apache/hadoop/hive/metastore/HMSHandler.java   |  2 +-
 10 files changed, 43 insertions(+), 10 deletions(-)

diff --git 
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/parse/TestReplicationScenariosExclusiveReplica.java
 
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/parse/TestReplicationScenariosExclusiveReplica.java
index 3506088..4e6a77f 100644
--- 
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/parse/TestReplicationScenariosExclusiveReplica.java
+++ 
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/parse/TestReplicationScenariosExclusiveReplica.java
@@ -700,18 +700,18 @@ public class TestReplicationScenariosExclusiveReplica 
extends BaseReplicationAcr
   private void verifyCustomDBLocations(String srcDb, List<String> 
listOfTables, String managedCustLocOnSrc,
                                        String externalCustLocOnSrc, boolean 
replaceCustPath) throws Exception {
     Database replDatabase  = replica.getDatabase(replicatedDbName);
+    String managedCustLocOnTgt = new 
Path(replDatabase.getManagedLocationUri()).toUri().getPath();
+    String externalCustLocOnTgt = new 
Path(replDatabase.getLocationUri()).toUri().getPath();
     if (replaceCustPath ) {
-      String managedCustLocOnTgt = new 
Path(replDatabase.getManagedLocationUri()).toUri().getPath();
       Assert.assertEquals(managedCustLocOnSrc,  managedCustLocOnTgt);
       Assert.assertNotEquals(managedCustLocOnTgt,  
replica.warehouseRoot.toUri().getPath());
-      String externalCustLocOnTgt = new 
Path(replDatabase.getLocationUri()).toUri().getPath();
       Assert.assertEquals(externalCustLocOnSrc,  externalCustLocOnTgt);
       Assert.assertNotEquals(externalCustLocOnTgt,  new 
Path(replica.externalTableWarehouseRoot,
               replicatedDbName.toLowerCase()  + ".db").toUri().getPath());
     } else {
       Assert.assertNotEquals(managedCustLocOnSrc,  null);
-      Assert.assertEquals(replDatabase.getManagedLocationUri(),  null);
-      String externalCustLocOnTgt = new 
Path(replDatabase.getLocationUri()).toUri().getPath();
+      Assert.assertEquals(managedCustLocOnTgt, new Path(replica.warehouseRoot,
+              replicatedDbName.toLowerCase() + ".db").toUri().getPath());
       Assert.assertNotEquals(externalCustLocOnSrc,  externalCustLocOnTgt);
       Assert.assertEquals(externalCustLocOnTgt,  new 
Path(replica.externalTableWarehouseRoot,
               replicatedDbName.toLowerCase()  + ".db").toUri().getPath());
diff --git 
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/TestMetastoreAuthorizationProvider.java
 
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/TestMetastoreAuthorizationProvider.java
index ef9ea73..3fa1d0d 100644
--- 
a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/TestMetastoreAuthorizationProvider.java
+++ 
b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/ql/security/TestMetastoreAuthorizationProvider.java
@@ -333,6 +333,10 @@ public class TestMetastoreAuthorizationProvider {
     db = msc.getDatabase(dbName);
     dbLocn = db.getLocationUri();
     allowCreateInDb(dbName, userName, dbLocn);
+    dbLocn = db.getManagedLocationUri();
+     if (dbLocn != null) {
+       allowCreateInDb(dbName, userName, dbLocn);
+     }
     tbl.setTableType("EXTERNAL_TABLE");
     msc.createTable(tbl);
 
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
index c4961b2..221d2e7 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
@@ -93,9 +93,16 @@ public class CreateDatabaseOperation extends 
DDLOperation<CreateDatabaseDesc> {
     }
 
     if (database.isSetManagedLocationUri()) {
-      // TODO should we enforce a location check here?
       
database.setManagedLocationUri(Utilities.getQualifiedPath(context.getConf(),
           new Path(database.getManagedLocationUri())));
+    } else {
+      // ManagedLocation is not set we utilize WAREHOUSE together with 
database name 
+      String rootDir = MetastoreConf.getVar(context.getConf(), 
MetastoreConf.ConfVars.WAREHOUSE);
+      Path path = new Path(rootDir, database.getName().toLowerCase() + 
DATABASE_PATH_SUFFIX);
+      String qualifiedPath = Utilities.getQualifiedPath(context.getConf(), 
path);
+      if (!qualifiedPath.equals(database.getLocationUri())) {
+        database.setManagedLocationUri(qualifiedPath);
+      }
     }
   }
 }
diff --git a/ql/src/test/queries/clientpositive/create_database.q 
b/ql/src/test/queries/clientpositive/create_database.q
new file mode 100644
index 0000000..d5fe869
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/create_database.q
@@ -0,0 +1,4 @@
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+create database testdb location '/tmp/testdb.db';
+create table testdb.test as select 1;
diff --git 
a/ql/src/test/results/clientpositive/llap/alter_change_db_location.q.out 
b/ql/src/test/results/clientpositive/llap/alter_change_db_location.q.out
index d07eaa6..d47b388 100644
--- a/ql/src/test/results/clientpositive/llap/alter_change_db_location.q.out
+++ b/ql/src/test/results/clientpositive/llap/alter_change_db_location.q.out
@@ -11,7 +11,7 @@ PREHOOK: Input: database:newdb
 POSTHOOK: query: describe database extended newDB
 POSTHOOK: type: DESCDATABASE
 POSTHOOK: Input: database:newdb
-newdb          location/in/test                hive_test_user  USER            
        
+#### A masked pattern was here ####
 PREHOOK: query: use newDB
 PREHOOK: type: SWITCHDATABASE
 PREHOOK: Input: database:newdb
diff --git a/ql/src/test/results/clientpositive/llap/create_database.q.out 
b/ql/src/test/results/clientpositive/llap/create_database.q.out
new file mode 100644
index 0000000..459a506
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/create_database.q.out
@@ -0,0 +1,18 @@
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:testdb
+#### A masked pattern was here ####
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:testdb
+#### A masked pattern was here ####
+PREHOOK: query: create table testdb.test as select 1
+PREHOOK: type: CREATETABLE_AS_SELECT
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: database:testdb
+PREHOOK: Output: testdb@test
+POSTHOOK: query: create table testdb.test as select 1
+POSTHOOK: type: CREATETABLE_AS_SELECT
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: database:testdb
+POSTHOOK: Output: testdb@test
+POSTHOOK: Lineage: test._c0 SIMPLE []
diff --git a/ql/src/test/results/clientpositive/llap/database_location.q.out 
b/ql/src/test/results/clientpositive/llap/database_location.q.out
index 1cb5127..d0bd47f 100644
--- a/ql/src/test/results/clientpositive/llap/database_location.q.out
+++ b/ql/src/test/results/clientpositive/llap/database_location.q.out
@@ -85,7 +85,7 @@ PREHOOK: Input: database:db2
 POSTHOOK: query: DESCRIBE DATABASE EXTENDED db2
 POSTHOOK: type: DESCDATABASE
 POSTHOOK: Input: database:db2
-db2    database 2      location/in/test                hive_test_user  USER    
                
+#### A masked pattern was here ####
 PREHOOK: query: USE db2
 PREHOOK: type: SWITCHDATABASE
 PREHOOK: Input: database:db2
diff --git a/ql/src/test/results/clientpositive/tez/explainanalyze_3.q.out 
b/ql/src/test/results/clientpositive/tez/explainanalyze_3.q.out
index 9add485..ad2550b 100644
--- a/ql/src/test/results/clientpositive/tez/explainanalyze_3.q.out
+++ b/ql/src/test/results/clientpositive/tez/explainanalyze_3.q.out
@@ -127,7 +127,7 @@ PREHOOK: Input: database:newdb
 POSTHOOK: query: describe database extended newDB
 POSTHOOK: type: DESCDATABASE
 POSTHOOK: Input: database:newdb
-newdb          location/in/test                hive_test_user  USER            
        
+newdb          location/in/test        hdfs://### HDFS PATH ###        
hive_test_user  USER                    
 PREHOOK: query: use newDB
 PREHOOK: type: SWITCHDATABASE
 PREHOOK: Input: database:newdb
diff --git a/ql/src/test/results/clientpositive/tez/explainuser_3.q.out 
b/ql/src/test/results/clientpositive/tez/explainuser_3.q.out
index 990d1bd..a3e9ea1 100644
--- a/ql/src/test/results/clientpositive/tez/explainuser_3.q.out
+++ b/ql/src/test/results/clientpositive/tez/explainuser_3.q.out
@@ -145,7 +145,7 @@ PREHOOK: Input: database:newdb
 POSTHOOK: query: describe database extended newDB
 POSTHOOK: type: DESCDATABASE
 POSTHOOK: Input: database:newdb
-newdb          location/in/test                hive_test_user  USER            
        
+newdb          location/in/test        hdfs://### HDFS PATH ###        
hive_test_user  USER                    
 PREHOOK: query: explain use newDB
 PREHOOK: type: SWITCHDATABASE
 PREHOOK: Input: database:newdb
diff --git 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
index 1cca7bf..7c46857 100644
--- 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
+++ 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
@@ -1362,7 +1362,7 @@ public class HMSHandler extends FacebookBase implements 
IHMSHandler {
             });
             if (madeManagedDir) {
               LOG.info("Created database path in managed directory " + 
dbMgdPath);
-            } else {
+            } else if (!isInTest || !isDbReplicationTarget(db)) { // Hive 
replication tests doesn't drop the db after each test
               throw new MetaException(
                   "Unable to create database managed directory " + dbMgdPath + 
", failed to create database " + db.getName());
             }

Reply via email to