diff --git hcatalog/core/src/main/java/org/apache/hive/hcatalog/txn/HCatDbTxnManager.java hcatalog/core/src/main/java/org/apache/hive/hcatalog/txn/HCatDbTxnManager.java index 85fa4fe..2e501e6 100644 --- hcatalog/core/src/main/java/org/apache/hive/hcatalog/txn/HCatDbTxnManager.java +++ hcatalog/core/src/main/java/org/apache/hive/hcatalog/txn/HCatDbTxnManager.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hive.metastore.api.TxnInfo; import org.apache.hadoop.hive.ql.lockmgr.DbLockManager; import org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; +import org.apache.hadoop.hive.ql.lockmgr.HiveLock; import org.apache.hadoop.hive.ql.lockmgr.LockException; import org.apache.hive.hcatalog.mapreduce.InputJobInfo; import org.apache.hive.hcatalog.mapreduce.OutputJobInfo; @@ -114,7 +115,16 @@ public void acquireLocks(InputJobInfo input, OutputJobInfo output, String user) LOG.debug("Adding lock component to lock request " + component.toString()); rqstBuilder.addLockComponent(component); } - lockMgr.lock(rqstBuilder.build()); + List locks = lockMgr.lock(rqstBuilder.build()); + if(LOG.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Locks acquired: "); + for(HiveLock hl : locks) { + sb.append(hl).append(" "); + } + sb.append(" input=").append(input == null ? "no" : "yes").append(" output=").append(output == null ? "no": "yes"); + sb.append(addWaterMark()); + LOG.debug(sb.toString()); + } } @Override @@ -191,10 +201,16 @@ private void reconstructTxnInfo() throws LockException { return; } } - throw new LockException("Unable to find a transaction that matches our jobid: " + jobid); + //for read-only txns we don't do open() (as of 6/30/2014) - thus we can have locks w/o txn id + //throw new LockException("Unable to find a transaction that matches our jobid: " + jobid); } catch (TException e) { throw new LockException("Unable to communicate with metastore to find our transaction id: " + e.getMessage(), e); } } + @Override + protected String addWaterMark() throws LockException { + return super.addWaterMark() + " jobid=" + getJobid(); + } + } diff --git ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbLockManager.java ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbLockManager.java index caf361d..d509a16 100644 --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbLockManager.java +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbLockManager.java @@ -213,6 +213,9 @@ public boolean equals(Object other) { public int hashCode() { return (int)(lockId % Integer.MAX_VALUE); } + public String toString() { + return "lockId=" + lockId; + } } /** diff --git ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java index 6eaf786..dcfea3b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java @@ -21,7 +21,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.common.ValidTxnList; import org.apache.hadoop.hive.metastore.HiveMetaStoreClient; -import org.apache.hadoop.hive.metastore.IMetaStoreClient; import org.apache.hadoop.hive.metastore.LockComponentBuilder; import org.apache.hadoop.hive.metastore.LockRequestBuilder; import org.apache.hadoop.hive.metastore.api.*; @@ -212,7 +211,7 @@ public void acquireLocks(QueryPlan plan, Context ctx, String username) throws Lo public void commitTxn() throws LockException { if (txnId == 0) { throw new RuntimeException("Attempt to commit before opening a " + - "transaction"); + "transaction." + addWaterMark()); } try { lockMgr.clearLocalLockRecords(); @@ -232,11 +231,23 @@ public void commitTxn() throws LockException { } } + protected String addWaterMark() throws LockException{ + StringBuilder sb = new StringBuilder("thId=").append(Thread.currentThread().getId()); + sb.append(" txnId=").append(txnId); + if(lockMgr != null) { + List locks = lockMgr.getLocks(false, false); + sb.append(" locks: "); + for(HiveLock hl : locks) { + sb.append(hl); + } + } + return sb.toString(); + } @Override public void rollbackTxn() throws LockException { if (txnId == 0) { throw new RuntimeException("Attempt to rollback before opening a " + - "transaction"); + "transaction. " + addWaterMark()); } try { lockMgr.clearLocalLockRecords(); diff --git ql/src/java/org/apache/hadoop/hive/ql/lockmgr/TxnManagerFactory.java ql/src/java/org/apache/hadoop/hive/ql/lockmgr/TxnManagerFactory.java index 223eef9..24087d7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/TxnManagerFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/TxnManagerFactory.java @@ -37,6 +37,7 @@ static final private Log LOG = LogFactory.getLog(TxnManagerFactory.class.getName()); private static TxnManagerFactory self; + private static TxnManagerFactory hcatSelf; private boolean inHcat; /** @@ -46,12 +47,17 @@ */ public static synchronized TxnManagerFactory getTxnManagerFactory(boolean hcat) { if(hcat) { - return new TxnManagerFactory(true); + if(hcatSelf == null) { + hcatSelf = new TxnManagerFactory(true); + } + return hcatSelf; } - if (self == null) { - self = new TxnManagerFactory(hcat); + else { + if (self == null) { + self = new TxnManagerFactory(false); + } + return self; } - return self; } public static TxnManagerFactory getTxnManagerFactory() {