[
https://issues.apache.org/jira/browse/HIVE-13959?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15319761#comment-15319761
]
Chaoyu Tang commented on HIVE-13959:
------------------------------------
[~ychena] Thanks for the review. For your analysis and questions, please see
below:
Yes -- one WriteEntity map to one List<HiveLockObj>
Yes -- These list of HiveLockObj are all created during acquireLocks related to
the query.
Yes -- In the releaseLocks code, lockObj.getObj() return HiveLockObject
The problem is here: List<HiveLock> locks = lockMgr.getLocks(lockObj.getObj(),
false, true); it returns all locks under the pathName which might not related
to this MoveTask query:
{code}
The getLocks method in ZookeeperHiveLockManager:
private static List<HiveLock> getLocks(HiveConf conf,
HiveLockObject key, String parent, boolean verifyTablePartition, boolean
fetchData)
throws LockException {
List<HiveLock> locks = new ArrayList<HiveLock>();
List<String> children;
boolean recurse = true;
String commonParent;
try {
if (key != null) {
commonParent = "/" + parent + "/" + key.getName();
children = curatorFramework.getChildren().forPath(commonParent);
/* ==> this call returns all locks under commonParent, say
db/cdhpart/LOCK-SHARE-000000, db/cdhpart/LOCK-SHARE-000001 for pathNames
db/cdhpart */
recurse = false;
}
else {
commonParent = "/" + parent;
children = curatorFramework.getChildren().forPath(commonParent);
}
} catch (Exception e) {
// no locks present
return locks;
}
{code}
For an example, if we run query1 in one session "insert overwrite table cdhpart
partition (level1= 'l1', level2='l2', level3 = 'l3', level4) select key, value,
level4 from cdhsrc;" and query2 in the other session concurrently "select *
from cdhpart where level1 = 'l1'"
query1 and query2 both have its own znode (lock) under pathNames (db/cdhpart/)
say LOCK-SHARE-000000, LOCK-SHARE-000001 respectively, the getLocks for
HiveLockObject key with its getName() value db/cdhpart/ will return both
LOCK-SHARE-000000, LOCK-SHARE-000001. But LOCK-SHARE-000001 is not in the
ctx.getHiveLocks(), the lock list for the query1, so
ctx.getHiveLocks().remove() returns false because the HiveLockObjectData.equals
always return false due to the different queryStr/queryId, therefore
lockMgr.unlock(lock) should not be called to unlock the LOCK-SHARE-000001 for
query2.
> MoveTask should only release its query associated locks
> -------------------------------------------------------
>
> Key: HIVE-13959
> URL: https://issues.apache.org/jira/browse/HIVE-13959
> Project: Hive
> Issue Type: Bug
> Components: Locking
> Reporter: Chaoyu Tang
> Assignee: Chaoyu Tang
> Attachments: HIVE-13959.patch, HIVE-13959.patch
>
>
> releaseLocks in MoveTask releases all locks under a HiveLockObject pathNames.
> But some of locks under this pathNames might be for other queries and should
> not be released.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)