Index: ql/src/test/results/clientpositive/lock1.q.out =================================================================== --- ql/src/test/results/clientpositive/lock1.q.out (revision 1031685) +++ ql/src/test/results/clientpositive/lock1.q.out (working copy) @@ -49,6 +49,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 tstsrc extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS tstsrc 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:njain_20101104183131_7ee0480d-77f6-4bc2-8cec-26b808b026df PREHOOK: query: UNLOCK TABLE tstsrc PREHOOK: type: UNLOCKTABLE POSTHOOK: query: UNLOCK TABLE tstsrc Index: ql/src/test/results/clientpositive/lock2.q.out =================================================================== --- ql/src/test/results/clientpositive/lock2.q.out (revision 1031685) +++ ql/src/test/results/clientpositive/lock2.q.out (working copy) @@ -97,6 +97,16 @@ POSTHOOK: Lineage: tstsrcpart PARTITION(ds=2008-04-08,hr=11).key SIMPLE [(srcpart)srcpart.FieldSchema(name:key, type:string, comment:default), ] POSTHOOK: Lineage: tstsrcpart PARTITION(ds=2008-04-08,hr=11).value SIMPLE [(srcpart)srcpart.FieldSchema(name:value, type:string, comment:default), ] default@tstsrcpart@ds=2008-04-08/hr=11 EXCLUSIVE +PREHOOK: query: SHOW LOCKS tstsrcpart PARTITION(ds='2008-04-08', hr='11') extended +PREHOOK: type: SHOWLOCKS +POSTHOOK: query: SHOW LOCKS tstsrcpart PARTITION(ds='2008-04-08', hr='11') 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), ] +POSTHOOK: Lineage: tstsrcpart PARTITION(ds=2008-04-08,hr=11).key SIMPLE [(srcpart)srcpart.FieldSchema(name:key, type:string, comment:default), ] +POSTHOOK: Lineage: tstsrcpart PARTITION(ds=2008-04-08,hr=11).value SIMPLE [(srcpart)srcpart.FieldSchema(name:value, type:string, comment:default), ] +default@tstsrcpart@ds=2008-04-08/hr=11 EXCLUSIVE +QUERYID_LOCK:njain_20101105120303_b0e12da7-8ccf-4c7a-822f-166d35c6b6d4 PREHOOK: query: UNLOCK TABLE tstsrc PREHOOK: type: UNLOCKTABLE POSTHOOK: query: UNLOCK TABLE tstsrc Index: ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java (revision 1031685) +++ ql/src/test/org/apache/hadoop/hive/ql/QTestUtil.java (working copy) @@ -897,6 +897,7 @@ "-I", "at java", "-I", "at junit", "-I", "Caused by:", + "-I", "QUERYID_LOCK:", "-I", "[.][.][.] [0-9]* more", (new File(logDir, tname + ".out")).getPath(), outFileName }; Index: ql/src/test/queries/clientpositive/lock1.q =================================================================== --- ql/src/test/queries/clientpositive/lock1.q (revision 1031685) +++ ql/src/test/queries/clientpositive/lock1.q (working copy) @@ -8,6 +8,8 @@ LOCK TABLE tstsrc shared; SHOW LOCKS; SHOW LOCKS tstsrc; +SHOW LOCKS tstsrc extended; + UNLOCK TABLE tstsrc; SHOW LOCKS; SHOW LOCKS tstsrc; Index: ql/src/test/queries/clientpositive/lock2.q =================================================================== --- ql/src/test/queries/clientpositive/lock2.q (revision 1031685) +++ ql/src/test/queries/clientpositive/lock2.q (working copy) @@ -14,6 +14,7 @@ SHOW LOCKS; SHOW LOCKS tstsrcpart; SHOW LOCKS tstsrcpart PARTITION(ds='2008-04-08', hr='11'); +SHOW LOCKS tstsrcpart PARTITION(ds='2008-04-08', hr='11') extended; UNLOCK TABLE tstsrc; SHOW LOCKS; Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -1233,6 +1233,7 @@ private int showLocks(ShowLocksDesc showLocks) throws HiveException { Context ctx = driverContext.getCtx(); HiveLockManager lockMgr = ctx.getHiveLockMgr(); + boolean isExt = showLocks.isExt(); if (lockMgr == null) { throw new HiveException("show Locks LockManager not specified"); } @@ -1279,6 +1280,10 @@ outStream.writeBytes(lock.getHiveLockObject().getName()); outStream.write(separator); outStream.writeBytes(lock.getHiveLockMode().toString()); + if (isExt) { + outStream.write(terminator); + outStream.writeBytes("QUERYID_LOCK:"+ lock.getHiveLockObject().getData()); + } outStream.write(terminator); } ((FSDataOutputStream) outStream).close(); @@ -1319,7 +1324,7 @@ Map partSpec = lockTbl.getPartSpec(); if (partSpec == null) { - HiveLock lck = lockMgr.lock(new HiveLockObject(tbl), mode, true); + HiveLock lck = lockMgr.lock(new HiveLockObject(tbl, lockTbl.getQueryId()), mode, true); if (lck == null) { return 1; } @@ -1330,7 +1335,7 @@ if (par == null) { throw new HiveException("Partition " + partSpec + " for table " + tabName + " does not exist"); } - HiveLock lck = lockMgr.lock(new HiveLockObject(par), mode, true); + HiveLock lck = lockMgr.lock(new HiveLockObject(par, lockTbl.getQueryId()), mode, true); if (lck == null) { return 1; } @@ -1347,14 +1352,14 @@ HiveLockObject obj = null; if (partSpec == null) { - obj = new HiveLockObject(tbl); + obj = new HiveLockObject(tbl, null); } else { Partition par = db.getPartition(tbl, partSpec, false); if (par == null) { throw new HiveException("Partition " + partSpec + " for table " + tabName + " does not exist"); } - obj = new HiveLockObject(par); + obj = new HiveLockObject(par, null); } return obj; } Index: ql/src/java/org/apache/hadoop/hive/ql/plan/ShowLocksDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/ShowLocksDesc.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ShowLocksDesc.java (working copy) @@ -33,6 +33,7 @@ String resFile; String tableName; HashMap partSpec; + boolean isExt; /** * table name for the result of show locks. @@ -58,10 +59,11 @@ * @param resFile */ public ShowLocksDesc(Path resFile, String tableName, - HashMap partSpec) { - this.resFile = resFile.toString(); - this.partSpec = partSpec; + HashMap partSpec, boolean isExt) { + this.resFile = resFile.toString(); + this.partSpec = partSpec; this.tableName = tableName; + this.isExt = isExt; } /** @@ -111,4 +113,19 @@ public void setResFile(String resFile) { this.resFile = resFile; } + + /** + * @return the isExt + */ + public boolean isExt() { + return isExt; + } + + /** + * @param isExt + * the isExt to set + */ + public void setExt(boolean isExt) { + this.isExt = isExt; + } } Index: ql/src/java/org/apache/hadoop/hive/ql/plan/LockTableDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/LockTableDesc.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/LockTableDesc.java (working copy) @@ -34,14 +34,16 @@ private String tableName; private String mode; private Map partSpec; + private String queryId; public LockTableDesc() { } - public LockTableDesc(String tableName, String mode, Map partSpec) { + public LockTableDesc(String tableName, String mode, Map partSpec, String queryId) { this.tableName = tableName; this.mode = mode; this.partSpec = partSpec; + this.queryId = queryId; } public String getTableName() { @@ -67,4 +69,12 @@ public void setPartSpec(Map partSpec) { this.partSpec = partSpec; } + + public String getQueryId() { + return queryId; + } + + public void setQueryId(String queryId) { + this.queryId = queryId; + } } 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 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/zookeeper/ZooKeeperHiveLockManager.java (working copy) @@ -130,10 +130,10 @@ try { if (keepAlive) { - res = zooKeeper.create(name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); + res = zooKeeper.create(name, key.getData().getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); } else { - res = zooKeeper.create(name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); + res = zooKeeper.create(name, key.getData().getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } int seqNo = getSequenceNumber(res, name); @@ -241,14 +241,22 @@ } for (String child : children) { + String data = "NULL"; child = "/" + parent + "/" + child; - HiveLockMode mode = getLockMode(conf, child); + try { + data = new String(zkpClient.getData(child, new DummyWatcher(), null)); + } catch (Exception e) { + LOG.error("Error in getting data for " + child + " " + e); + // ignore error + } + + HiveLockMode mode = getLockMode(conf, child); if (mode == null) { continue; } - HiveLockObject obj = getLockObject(conf, child, mode); + HiveLockObject obj = getLockObject(conf, child, mode, data); if ((key == null) || (obj.getName().equals(key.getName()))) { HiveLock lck = (HiveLock)(new ZooKeeperHiveLock(child, obj, mode)); @@ -290,7 +298,8 @@ * 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 **/ - private static HiveLockObject getLockObject(HiveConf conf, String path, HiveLockMode mode) throws LockException { + private static HiveLockObject getLockObject(HiveConf conf, String path, + HiveLockMode mode, String data) throws LockException { try { Hive db = Hive.get(conf); int indx = path.lastIndexOf(mode.toString()); @@ -302,7 +311,7 @@ assert (tab != null); if (names.length == 2) { - return new HiveLockObject(tab); + return new HiveLockObject(tab, data); } String[] parts = names[2].split(conf.getVar(HiveConf.ConfVars.DEFAULT_ZOOKEEPER_PARTITION_NAME)); @@ -322,10 +331,11 @@ if (partn == null) { return new HiveLockObject(new DummyPartition( - objName.split("/")[1].replaceAll(conf.getVar(HiveConf.ConfVars.DEFAULT_ZOOKEEPER_PARTITION_NAME), "/"))); + objName.split("/")[1].replaceAll(conf.getVar(HiveConf.ConfVars.DEFAULT_ZOOKEEPER_PARTITION_NAME), "/")), + data); } - return new HiveLockObject(partn); + return new HiveLockObject(partn, data); } catch (Exception e) { LOG.error("Failed to create ZooKeeper object: " + e); throw new LockException(e); Index: ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/HiveLockObject.java (working copy) @@ -32,19 +32,25 @@ */ private Partition p; + /* user supplied data for that object */ + private String data; + public HiveLockObject() { this.t = null; this.p = null; + this.data = null; } - public HiveLockObject(Table t) { + public HiveLockObject(Table t, String data) { this.t = t; this.p = null; + this.data = data; } - public HiveLockObject(Partition p) { + public HiveLockObject(Partition p, String data) { this.t = null; this.p = p; + this.data = data; } public Table getTable() { @@ -71,4 +77,13 @@ return p.getCompleteName(); } } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + } Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -660,7 +660,7 @@ | 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) -> ^(TOK_SHOWLOCKS $parttype) + | KW_SHOW KW_LOCKS (parttype=partTypeExpr) (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype $isExtended?) ; lockStatement Index: ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (working copy) @@ -921,8 +921,9 @@ private void analyzeShowLocks(ASTNode ast) throws SemanticException { String tableName = null; HashMap partSpec = null; + boolean isExtended = false; - if (ast.getChildCount() == 1) { + if (ast.getChildCount() >= 1) { // table for which show locks is being executed ASTNode tableTypeExpr = (ASTNode) ast.getChild(0); tableName = getFullyQualifiedName((ASTNode)tableTypeExpr.getChild(0)); @@ -932,10 +933,14 @@ ASTNode partspec = (ASTNode) tableTypeExpr.getChild(1); partSpec = getPartSpec(partspec); } + + if (ast.getChildCount() >= 2) { + isExtended = (ast.getChild(1).getType() == HiveParser.KW_EXTENDED); + } } ShowLocksDesc showLocksDesc = new ShowLocksDesc(ctx.getResFile(), tableName, - partSpec); + partSpec, isExtended); rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), showLocksDesc), conf)); setFetchTask(createFetchTask(showLocksDesc.getSchema())); @@ -966,7 +971,8 @@ partSpec = partSpecs.get(0); } - LockTableDesc lockTblDesc = new LockTableDesc(tableName, mode, partSpec); + LockTableDesc lockTblDesc = new LockTableDesc(tableName, mode, partSpec, + HiveConf.getVar(conf, ConfVars.HIVEQUERYID)); rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), lockTblDesc), conf)); Index: ql/src/java/org/apache/hadoop/hive/ql/Driver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/Driver.java (revision 1031685) +++ ql/src/java/org/apache/hadoop/hive/ql/Driver.java (working copy) @@ -434,12 +434,12 @@ List locks = new LinkedList(); if (t != null) { - locks.add(new LockObject(new HiveLockObject(t), mode)); + locks.add(new LockObject(new HiveLockObject(t, plan.getQueryId()), mode)); return locks; } if (p != null) { - locks.add(new LockObject(new HiveLockObject(p), mode)); + locks.add(new LockObject(new HiveLockObject(p, plan.getQueryId()), mode)); // All the parents are locked in shared mode mode = HiveLockMode.SHARED; @@ -450,11 +450,13 @@ for (int idx = 0; idx < partns.length -1; idx++) { String partn = partns[idx]; partialName += partialName + partn; - locks.add(new LockObject(new HiveLockObject(new DummyPartition(p.getTable().getDbName() + "@" + p.getTable().getTableName() + "@" + partialName)), mode)); + locks.add(new LockObject(new HiveLockObject( + new DummyPartition(p.getTable().getDbName() + "@" + p.getTable().getTableName() + "@" + partialName), + plan.getQueryId()), mode)); partialName += "/"; } - locks.add(new LockObject(new HiveLockObject(p.getTable()), mode)); + locks.add(new LockObject(new HiveLockObject(p.getTable(), plan.getQueryId()), mode)); } return locks; }