Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -1347,7 +1347,7 @@ List locks = null; if (showLocks.getTableName() == null) { - locks = lockMgr.getLocks(); + locks = lockMgr.getLocks(isExt); } else { locks = lockMgr.getLocks(getHiveObject(showLocks.getTableName(), Index: ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockManager.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockManager.java (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockManager.java (working copy) @@ -35,7 +35,7 @@ boolean keepAlive, int numRetries, int sleepTime) throws LockException; public void unlock(HiveLock hiveLock) throws LockException; - public List getLocks() throws LockException; + public List getLocks(boolean verifyTablePartitions) throws LockException; public List getLocks(HiveLockObject key) throws LockException; public void close() throws LockException; } Index: ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java (working copy) @@ -22,60 +22,45 @@ import org.apache.hadoop.hive.ql.metadata.Table; public class HiveLockObject { - /** - * The table. - */ - private Table t; - - /** - * The partition. This is null for a non partitioned table. - */ - private Partition p; + + String [] pathNames = null; /* user supplied data for that object */ private String data; public HiveLockObject() { - this.t = null; - this.p = null; this.data = null; } - - public HiveLockObject(Table t, String data) { - this.t = t; - this.p = null; - this.data = data; + + public HiveLockObject(String[] paths, String lockData) { + this.pathNames = paths; + this.data = lockData; } - - public HiveLockObject(Partition p, String data) { - this.t = null; - this.p = p; - this.data = data; + + public HiveLockObject(Table tbl, String lockData) { + this(new String[] {tbl.getDbName(), tbl.getTableName()}, lockData); } - public Table getTable() { - return t; - } - - public void setTable (Table t) { - this.t = t; - } - - public Partition getPartition() { - return p; - } - - public void setPartition (Partition p) { - this.p = p; + public HiveLockObject(Partition par, String lockData) { + this(new String[] { par.getTable().getDbName(), + par.getTable().getTableName(), par.getName() }, lockData); } public String getName() { - if (t != null) { - return t.getCompleteName(); + if (this.pathNames == null) { + return null; } - else { - return p.getCompleteName(); + String ret = ""; + boolean first = true; + for (int i = 0; i < pathNames.length; i++) { + if (!first) { + ret = ret + "@"; + } else { + first = false; + } + ret = ret + pathNames[i]; } + return ret; } public String getData() { Index: ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java (working copy) @@ -242,7 +242,7 @@ String quorumServers = getQuorumServers(conf); ZooKeeper zkpClient = new ZooKeeper(quorumServers, sessionTimeout, new DummyWatcher()); String parent = conf.getVar(HiveConf.ConfVars.HIVE_ZOOKEEPER_NAMESPACE); - List locks = getLocks(conf, zkpClient, null, parent); + List locks = getLocks(conf, zkpClient, null, parent, false); if (locks != null) { for (HiveLock lock : locks) { @@ -259,13 +259,13 @@ } /* Get all locks */ - public List getLocks() throws LockException { - return getLocks(ctx.getConf(), zooKeeper, null, parent); + public List getLocks(boolean verifyTablePartition) throws LockException { + return getLocks(ctx.getConf(), zooKeeper, null, parent, verifyTablePartition); } /* Get all locks for a particular object */ public List getLocks(HiveLockObject key) throws LockException { - return getLocks(ctx.getConf(), zooKeeper, key, parent); + return getLocks(ctx.getConf(), zooKeeper, key, parent, false); } /** @@ -274,7 +274,8 @@ * @param key The object to be compared against - if key is null, then get all locks **/ private static List getLocks(HiveConf conf, ZooKeeper zkpClient, - HiveLockObject key, String parent) throws LockException { + HiveLockObject key, String parent, boolean verifyTablePartition) + throws LockException { List locks = new ArrayList(); List children; @@ -284,7 +285,7 @@ // no locks present return locks; } - + for (String child : children) { String data = "NULL"; child = "/" + parent + "/" + child; @@ -301,7 +302,7 @@ continue; } - HiveLockObject obj = getLockObject(conf, child, mode, data); + HiveLockObject obj = getLockObject(conf, child, mode, data, verifyTablePartition); if (obj == null) { continue; } @@ -345,9 +346,11 @@ * The object may correspond to a table, a partition or a parent to a partition. * For eg: if Table T is partitioned by ds, hr and ds=1/hr=1 is a valid partition, * the lock may also correspond to T@ds=1, which is not a valid object + * @param verifyTablePartition **/ private static HiveLockObject getLockObject(HiveConf conf, String path, - HiveLockMode mode, String data) throws LockException { + HiveLockMode mode, String data, boolean verifyTablePartition) + throws LockException { try { Hive db = Hive.get(conf); int indx = path.lastIndexOf(mode.toString()); @@ -357,8 +360,18 @@ if (names.length < 2) { return null; } - - Table tab = db.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, + + if (!verifyTablePartition) { + if (names.length == 2) { + return new HiveLockObject(names, data); + } else { + return new HiveLockObject(objName.split("/")[1].replaceAll( + conf.getVar(HiveConf.ConfVars.DEFAULT_ZOOKEEPER_PARTITION_NAME), + "/").split("@"), data); + } + } + + Table tab = db.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, //need to change to names[0] names[1], false); // do not throw exception if table does not exist if (tab == null) { return null; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (working copy) @@ -965,17 +965,19 @@ if (ast.getChildCount() >= 1) { // table for which show locks is being executed - ASTNode tableTypeExpr = (ASTNode) ast.getChild(0); - tableName = getFullyQualifiedName((ASTNode)tableTypeExpr.getChild(0)); - - // get partition metadata if partition specified - if (tableTypeExpr.getChildCount() == 2) { - ASTNode partspec = (ASTNode) tableTypeExpr.getChild(1); - partSpec = getPartSpec(partspec); - } - - if (ast.getChildCount() >= 2) { - isExtended = (ast.getChild(1).getType() == HiveParser.KW_EXTENDED); + for (int i = 0; i < ast.getChildCount(); i++) { + ASTNode child = (ASTNode) ast.getChild(i); + if (child.getType() == HiveParser.TOK_TABTYPE) { + ASTNode tableTypeExpr = (ASTNode) child; + tableName = getFullyQualifiedName((ASTNode) tableTypeExpr.getChild(0)); + // get partition metadata if partition specified + if (tableTypeExpr.getChildCount() == 2) { + ASTNode partspec = (ASTNode) tableTypeExpr.getChild(1); + partSpec = getPartSpec(partspec); + } + } else if (child.getType() == HiveParser.KW_EXTENDED) { + isExtended = true; + } } } Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1041963) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -678,8 +678,7 @@ | KW_SHOW KW_PARTITIONS Identifier partitionSpec? -> ^(TOK_SHOWPARTITIONS Identifier partitionSpec?) | KW_SHOW KW_TABLE KW_EXTENDED ((KW_FROM|KW_IN) db_name=Identifier)? KW_LIKE showStmtIdentifier partitionSpec? -> ^(TOK_SHOW_TABLESTATUS showStmtIdentifier $db_name? partitionSpec?) - | KW_SHOW KW_LOCKS -> ^(TOK_SHOWLOCKS) - | KW_SHOW KW_LOCKS (parttype=partTypeExpr) (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype $isExtended?) + | KW_SHOW KW_LOCKS (parttype=partTypeExpr)? (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype? $isExtended?) | KW_SHOW (showOptions=KW_FORMATTED)? (KW_INDEX|KW_INDEXES) KW_ON showStmtIdentifier ((KW_FROM|KW_IN) db_name=Identifier)? -> ^(TOK_SHOWINDEXES showStmtIdentifier $showOptions? $db_name?) ; Index: ql/src/test/queries/clientpositive/lock1.q =================================================================== --- ql/src/test/queries/clientpositive/lock1.q (revision 1041963) +++ ql/src/test/queries/clientpositive/lock1.q (working copy) @@ -12,14 +12,18 @@ UNLOCK TABLE tstsrc; SHOW LOCKS; +SHOW LOCKS extended; SHOW LOCKS tstsrc; lock TABLE tstsrc SHARED; SHOW LOCKS; +SHOW LOCKS extended; SHOW LOCKS tstsrc; LOCK TABLE tstsrc SHARED; SHOW LOCKS; +SHOW LOCKS extended; SHOW LOCKS tstsrc; UNLOCK TABLE tstsrc; SHOW LOCKS; +SHOW LOCKS extended; SHOW LOCKS tstsrc; drop table tstsrc; Index: ql/src/test/results/clientpositive/lock1.q.out =================================================================== --- ql/src/test/results/clientpositive/lock1.q.out (revision 1041963) +++ ql/src/test/results/clientpositive/lock1.q.out (working copy) @@ -56,7 +56,7 @@ POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] default@tstsrc SHARED -QUERYID_LOCK:njain_20101116183333_f1267a1d-8cc2-4077-ab5d-380708a0494b TIME : 1289961194566 +QUERYID_LOCK:heyongqiang_20101203190404_a00af404-b094-4552-8ecc-0004930a878a TIME : 1291431894235 PREHOOK: query: UNLOCK TABLE tstsrc PREHOOK: type: UNLOCKTABLE POSTHOOK: query: UNLOCK TABLE tstsrc @@ -69,6 +69,12 @@ POSTHOOK: type: SHOWLOCKS POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: SHOW LOCKS extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS extended +POSTHOOK: type: SHOWLOCKS +POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] PREHOOK: query: SHOW LOCKS tstsrc PREHOOK: type: SHOWLOCKS POSTHOOK: query: SHOW LOCKS tstsrc @@ -88,6 +94,14 @@ POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] default@tstsrc SHARED +PREHOOK: query: SHOW LOCKS extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS extended +POSTHOOK: type: SHOWLOCKS +POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +default@tstsrc SHARED +QUERYID_LOCK:heyongqiang_20101203190404_feadd884-14ab-4305-8078-605128a33c42 TIME : 1291431894956 PREHOOK: query: SHOW LOCKS tstsrc PREHOOK: type: SHOWLOCKS POSTHOOK: query: SHOW LOCKS tstsrc @@ -109,6 +123,16 @@ POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] default@tstsrc SHARED default@tstsrc SHARED +PREHOOK: query: SHOW LOCKS extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS extended +POSTHOOK: type: SHOWLOCKS +POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +default@tstsrc SHARED +QUERYID_LOCK:heyongqiang_20101203190404_53022be2-f951-4b33-895a-d373a5791d16 TIME : 1291431895381 +default@tstsrc SHARED +QUERYID_LOCK:heyongqiang_20101203190404_feadd884-14ab-4305-8078-605128a33c42 TIME : 1291431894956 PREHOOK: query: SHOW LOCKS tstsrc PREHOOK: type: SHOWLOCKS POSTHOOK: query: SHOW LOCKS tstsrc @@ -129,6 +153,12 @@ POSTHOOK: type: SHOWLOCKS POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] +PREHOOK: query: SHOW LOCKS extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS extended +POSTHOOK: type: SHOWLOCKS +POSTHOOK: Lineage: tstsrc.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: tstsrc.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ] PREHOOK: query: SHOW LOCKS tstsrc PREHOOK: type: SHOWLOCKS POSTHOOK: query: SHOW LOCKS tstsrc