diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java index 43a78ca3e2..58cbf971be 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -62,6 +62,7 @@ import org.apache.hadoop.hive.metastore.ColumnType; import org.apache.hadoop.hive.metastore.HiveMetaStoreUtils; import org.apache.hadoop.hive.metastore.Warehouse; +import org.apache.hadoop.hive.metastore.api.DataOperationType; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.LockComponent; @@ -811,29 +812,33 @@ private boolean isValidTxnListState() throws LockException { } Set nonSharedLocks = new HashSet<>(); for (HiveLock lock : ctx.getHiveLocks()) { + // We only care about locks with components, e.g., DbHiveLock, as these are + // the ones created by the db txn manager if (lock.mayContainComponents()) { - // The lock may have multiple components, e.g., DbHiveLock, hence we need - // to check for each of them + // As the lock may have multiple components, we need to check for each of them for (LockComponent lckCmp : lock.getHiveLockComponents()) { + // We only consider tables + if (lckCmp.getTablename() == null) { + continue; + } // We only consider tables for which we hold either an exclusive // or a shared write lock - if ((lckCmp.getType() == LockType.EXCLUSIVE || - lckCmp.getType() == LockType.SHARED_WRITE) && - lckCmp.getTablename() != null) { - nonSharedLocks.add( - Warehouse.getQualifiedName( - lckCmp.getDbname(), lckCmp.getTablename())); + LockType lckType = lckCmp.getType(); + if (lckType != LockType.EXCLUSIVE && lckType != LockType.SHARED_WRITE) { + continue; + } + // We only consider tables for which we hold either an exclusive + // or a shared write lock and operation type is either INSERT, + // UPDATE, or DELETE + DataOperationType lockOpType = lckCmp.getOperationType(); + if (lockOpType != DataOperationType.INSERT && + lockOpType != DataOperationType.UPDATE && + lockOpType != DataOperationType.DELETE) { + continue; } - } - } else { - // The lock has a single components, e.g., SimpleHiveLock or ZooKeeperHiveLock. - // Pos 0 of lock paths array contains dbname, pos 1 contains tblname - if ((lock.getHiveLockMode() == HiveLockMode.EXCLUSIVE || - lock.getHiveLockMode() == HiveLockMode.SEMI_SHARED) && - lock.getHiveLockObject().getPaths().length == 2) { nonSharedLocks.add( Warehouse.getQualifiedName( - lock.getHiveLockObject().getPaths()[0], lock.getHiveLockObject().getPaths()[1])); + lckCmp.getDbname(), lckCmp.getTablename())); } } }