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