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

zhangbutao 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 6c221cbb721 HIVE-29355: Fix database locks (#6222)
6c221cbb721 is described below

commit 6c221cbb721e76440c409af43937886bfc4ebd7d
Author: Butao Zhang <[email protected]>
AuthorDate: Sun Dec 7 10:06:05 2025 +0800

    HIVE-29355: Fix database locks (#6222)
---
 .../ddl/table/lock/show/ShowDbLocksAnalyzer.java   |  2 +-
 .../ql/ddl/table/lock/show/ShowLocksAnalyzer.java  |  2 +-
 .../hive/ql/ddl/table/lock/show/ShowLocksDesc.java | 12 ++++++++-
 .../ql/ddl/table/lock/show/ShowLocksOperation.java |  5 ++--
 .../hadoop/hive/ql/lockmgr/HiveLockObject.java     | 31 +++++++++++-----------
 .../hadoop/hive/ql/lockmgr/HiveTxnManagerImpl.java |  2 +-
 .../zookeeper/ZooKeeperHiveLockManager.java        |  2 +-
 .../lockneg_query_tbl_in_locked_db.q               |  1 +
 .../lockneg_query_tbl_in_locked_db.q.out           | 25 ++++++++++++++++-
 .../lockneg_try_drop_locked_db.q.out               |  1 +
 .../lockneg_try_lock_db_in_use.q.out               |  1 +
 11 files changed, 61 insertions(+), 23 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowDbLocksAnalyzer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowDbLocksAnalyzer.java
index d4be520dd47..ea04ce2230f 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowDbLocksAnalyzer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowDbLocksAnalyzer.java
@@ -50,7 +50,7 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
     rootTasks.add(task);
 
     task.setFetchSource(true);
-    setFetchTask(createFetchTask(desc.getSchema()));
+    setFetchTask(createFetchTask(desc.getDbSchema()));
 
     // Need to initialize the lock manager
     ctx.setNeedLockMgr(true);
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksAnalyzer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksAnalyzer.java
index 96f52bff06f..89bfeb04b47 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksAnalyzer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksAnalyzer.java
@@ -71,7 +71,7 @@ public void analyzeInternal(ASTNode root) throws 
SemanticException {
     rootTasks.add(task);
 
     task.setFetchSource(true);
-    setFetchTask(createFetchTask(desc.getSchema()));
+    setFetchTask(createFetchTask(desc.getTableName() != null ? 
desc.getTblSchema() : desc.getSchema()));
 
     // Need to initialize the lock manager
     ctx.setNeedLockMgr(true);
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksDesc.java 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksDesc.java
index 898d3b8be61..af55181bdd8 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksDesc.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksDesc.java
@@ -33,7 +33,9 @@
 public class ShowLocksDesc implements DDLDesc, Serializable {
   private static final long serialVersionUID = 1L;
 
-  private static final String OLD_FORMAT_SCHEMA = 
"tab_name,mode#string:string";
+  private static final String OLD_FORMAT_SCHEMA = "name,mode#string:string";
+  private static final String OLD_TBL_FORMAT_SCHEMA = 
"tab_name,mode#string:string";
+  private static final String OLD_DB_FORMAT_SCHEMA = 
"db_name,mode#string:string";
   private static final String NEW_FORMAT_SCHEMA = 
"lockid,database,table,partition,lock_state," +
       
"blocked_by,lock_type,transaction_id,last_heartbeat,acquired_at,user,hostname,agent_info#"
 +
       
"string:string:string:string:string:string:string:string:string:string:string:string:string";
@@ -95,4 +97,12 @@ public boolean isNewFormat() {
   public String getSchema() {
     return isNewFormat ? NEW_FORMAT_SCHEMA : OLD_FORMAT_SCHEMA;
   }
+
+  public String getTblSchema() {
+    return isNewFormat ? NEW_FORMAT_SCHEMA : OLD_TBL_FORMAT_SCHEMA;
+  }
+
+  public String getDbSchema() {
+    return isNewFormat ? NEW_FORMAT_SCHEMA : OLD_DB_FORMAT_SCHEMA;
+  }
 }
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksOperation.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksOperation.java
index d7e71858a0a..dc8fc48b2cd 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksOperation.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/lock/show/ShowLocksOperation.java
@@ -89,11 +89,12 @@ private int showLocksOldFormat(HiveLockManager lockMgr) 
throws HiveException {
 
   private List<HiveLock> getLocksForOldFormat(HiveLockManager lockMgr) throws 
LockException, HiveException {
     List<HiveLock> locks = null;
-    if (desc.getTableName() == null) {
+    if (desc.getTableName() == null && desc.getDbName() == null) {
       // TODO should be doing security check here. Users should not be able to 
see each other's locks.
       locks = lockMgr.getLocks(false, desc.isExt());
     } else {
-      HiveLockObject lockObject = HiveLockObject.createFrom(context.getDb(), 
desc.getTableName(), desc.getPartSpec());
+      HiveLockObject lockObject = HiveLockObject.createFrom(context.getDb(), 
desc.getDbName(), 
+              desc.getTableName(), desc.getPartSpec());
       locks = lockMgr.getLocks(lockObject, true, desc.isExt());
     }
     Collections.sort(locks, new Comparator<HiveLock>() {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java 
b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java
index 197196e0085..3f274fa23cf 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java
@@ -212,7 +212,7 @@ public HiveLockObject(DummyPartition par, 
HiveLockObjectData lockData) {
   }
 
   /**
-   * Creates a locking object for a table (when partition spec is not provided)
+   * Creates a locking object for a database or table (when partition spec is 
not provided)
    * or a table partition
    * @param hiveDB    an object to communicate with the metastore
    * @param tableName the table to create the locking object on
@@ -220,27 +220,28 @@ public HiveLockObject(DummyPartition par, 
HiveLockObjectData lockData) {
    * @return  the locking object
    * @throws HiveException
    */
-  public static HiveLockObject createFrom(Hive hiveDB, String tableName,
+  public static HiveLockObject createFrom(Hive hiveDB, String dbName, String 
tableName,
       Map<String, String> partSpec) throws HiveException {
-    Table  tbl = hiveDB.getTable(tableName);
-    if (tbl == null) {
-      throw new HiveException("Table " + tableName + " does not exist ");
-    }
+    if (tableName != null) {
+      Table tbl = hiveDB.getTable(tableName);
+      if (tbl == null) {
+        throw new HiveException("Table " + tableName + " does not exist");
+      }
 
-    HiveLockObject obj = null;
+      if (partSpec == null) {
+        return new HiveLockObject(tbl, null);
+      }
 
-    if  (partSpec == null) {
-      obj = new HiveLockObject(tbl, null);
-    }
-    else {
       Partition par = hiveDB.getPartition(tbl, partSpec, false);
       if (par == null) {
-        throw new HiveException("Partition " + partSpec + " for table " +
-            tableName + " does not exist");
+        throw new HiveException("Partition " + partSpec + " for table " + 
tableName + " does not exist");
       }
-      obj = new HiveLockObject(par, null);
+      return new HiveLockObject(par, null);
+    } else if (dbName != null) {
+      return new HiveLockObject(dbName, null);
     }
-    return obj;
+
+    return null;
   }
 
   public String[] getPaths() {
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveTxnManagerImpl.java 
b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveTxnManagerImpl.java
index 9897795db9c..b4c1345b45c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveTxnManagerImpl.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveTxnManagerImpl.java
@@ -129,7 +129,7 @@ public int unlockTable(Hive hiveDB, UnlockTableDesc 
unlockTbl) throws HiveExcept
     HiveLockManager lockMgr = getAndCheckLockManager();
 
     String tabName = unlockTbl.getTableName();
-    HiveLockObject obj = HiveLockObject.createFrom(hiveDB, tabName,
+    HiveLockObject obj = HiveLockObject.createFrom(hiveDB, null, tabName,
         unlockTbl.getPartSpec());
 
     List<HiveLock> locks = lockMgr.getLocks(obj, false, false);
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java
index bf8a6f8a5ba..fe7d32b14b3 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java
@@ -766,7 +766,7 @@ private static HiveLockObject getLockObject(HiveConf conf, 
String path,
       String[] names = objName.split("/");
 
       if (names.length < 2) {
-        return null;
+        return new HiveLockObject(names[0], data);
       }
 
       if (!verifyTablePartition) {
diff --git 
a/ql/src/test/queries/clientnegative/lockneg_query_tbl_in_locked_db.q 
b/ql/src/test/queries/clientnegative/lockneg_query_tbl_in_locked_db.q
index 979f981a678..f55b93b1938 100644
--- a/ql/src/test/queries/clientnegative/lockneg_query_tbl_in_locked_db.q
+++ b/ql/src/test/queries/clientnegative/lockneg_query_tbl_in_locked_db.q
@@ -1,5 +1,6 @@
 --! qt:dataset:srcpart
 set hive.compute.query.using.stats=false;
+set hive.lock.numretries=0;
 set hive.support.concurrency=true;
 create database lockneg1;
 use lockneg1;
diff --git 
a/ql/src/test/results/clientnegative/lockneg_query_tbl_in_locked_db.q.out 
b/ql/src/test/results/clientnegative/lockneg_query_tbl_in_locked_db.q.out
index 3e62801756a..6aa8154fc59 100644
--- a/ql/src/test/results/clientnegative/lockneg_query_tbl_in_locked_db.q.out
+++ b/ql/src/test/results/clientnegative/lockneg_query_tbl_in_locked_db.q.out
@@ -44,6 +44,7 @@ PREHOOK: query: show locks database lockneg1
 PREHOOK: type: SHOWLOCKS
 POSTHOOK: query: show locks database lockneg1
 POSTHOOK: type: SHOWLOCKS
+lockneg1       SHARED
 PREHOOK: query: select count(1) from tstsrcpart where ds='2008-04-08' and 
hr='11'
 PREHOOK: type: QUERY
 PREHOOK: Input: lockneg1@tstsrcpart
@@ -59,4 +60,26 @@ PREHOOK: query: unlock database lockneg1
 PREHOOK: type: UNLOCKDATABASE
 PREHOOK: Input: database:lockneg1
 PREHOOK: Output: database:lockneg1
-FAILED: Execution Error, return code 40000 from 
org.apache.hadoop.hive.ql.ddl.DDLTask. Database lockneg1 is not locked 
+POSTHOOK: query: unlock database lockneg1
+POSTHOOK: type: UNLOCKDATABASE
+POSTHOOK: Input: database:lockneg1
+POSTHOOK: Output: database:lockneg1
+PREHOOK: query: show locks database lockneg1
+PREHOOK: type: SHOWLOCKS
+POSTHOOK: query: show locks database lockneg1
+POSTHOOK: type: SHOWLOCKS
+PREHOOK: query: lock database lockneg1 exclusive
+PREHOOK: type: LOCKDATABASE
+PREHOOK: Input: database:lockneg1
+PREHOOK: Output: database:lockneg1
+POSTHOOK: query: lock database lockneg1 exclusive
+POSTHOOK: type: LOCKDATABASE
+POSTHOOK: Input: database:lockneg1
+POSTHOOK: Output: database:lockneg1
+PREHOOK: query: show locks database lockneg1
+PREHOOK: type: SHOWLOCKS
+POSTHOOK: query: show locks database lockneg1
+POSTHOOK: type: SHOWLOCKS
+lockneg1       EXCLUSIVE
+Unable to acquire IMPLICIT, SHARED lock lockneg1 after 1 attempts.
+FAILED: Error in acquiring locks: Locks on the underlying objects cannot be 
acquired, retry after some time.
diff --git 
a/ql/src/test/results/clientnegative/lockneg_try_drop_locked_db.q.out 
b/ql/src/test/results/clientnegative/lockneg_try_drop_locked_db.q.out
index 964b7760049..be258726b63 100644
--- a/ql/src/test/results/clientnegative/lockneg_try_drop_locked_db.q.out
+++ b/ql/src/test/results/clientnegative/lockneg_try_drop_locked_db.q.out
@@ -16,5 +16,6 @@ PREHOOK: query: show locks database lockneg9
 PREHOOK: type: SHOWLOCKS
 POSTHOOK: query: show locks database lockneg9
 POSTHOOK: type: SHOWLOCKS
+lockneg9       SHARED
 Unable to acquire IMPLICIT, EXCLUSIVE lock lockneg9 after 1 attempts.
 FAILED: Error in acquiring locks: Locks on the underlying objects cannot be 
acquired, retry after some time.
diff --git 
a/ql/src/test/results/clientnegative/lockneg_try_lock_db_in_use.q.out 
b/ql/src/test/results/clientnegative/lockneg_try_lock_db_in_use.q.out
index 00d231a48b2..fdf48e97aa2 100644
--- a/ql/src/test/results/clientnegative/lockneg_try_lock_db_in_use.q.out
+++ b/ql/src/test/results/clientnegative/lockneg_try_lock_db_in_use.q.out
@@ -44,6 +44,7 @@ PREHOOK: query: show locks
 PREHOOK: type: SHOWLOCKS
 POSTHOOK: query: show locks
 POSTHOOK: type: SHOWLOCKS
+lockneg2       SHARED
 PREHOOK: query: lock database lockneg2 exclusive
 PREHOOK: type: LOCKDATABASE
 PREHOOK: Input: database:lockneg2

Reply via email to