diff --git metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java index 6218a03..ca485fa 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java @@ -1742,6 +1742,10 @@ private void heartbeatTxn(Connection dbConn, long txnid) dbConn.rollback(); throw new NoSuchTxnException("No such txn: " + txnid); } + //update locks for this txn to the same heartbeat + s = "update HIVE_LOCKS set hl_last_heartbeat = " + now + " where hl_txnid = " + txnid; + LOG.debug("Going to execute update <" + s + ">"); + stmt.executeUpdate(s); LOG.debug("Going to commit"); dbConn.commit(); } finally { 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 39b44e8..219a54a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java @@ -293,17 +293,28 @@ public void rollbackTxn() throws LockException { @Override public void heartbeat() throws LockException { - LOG.debug("Heartbeating lock and transaction " + JavaUtils.txnIdToString(txnId)); - List locks = lockMgr.getLocks(false, false); - if (locks.size() == 0) { - if (!isTxnOpen()) { - // No locks, no txn, we outta here. - return; - } else { - // Create one dummy lock so we can go through the loop below - DbLockManager.DbHiveLock dummyLock = new DbLockManager.DbHiveLock(0L); - locks.add(dummyLock); + List locks; + if(isTxnOpen()) { + // Create one dummy lock so we can go through the loop below, though we only + //really need txnId + DbLockManager.DbHiveLock dummyLock = new DbLockManager.DbHiveLock(0L); + locks = new ArrayList<>(1); + locks.add(dummyLock); + } + else { + locks = lockMgr.getLocks(false, false); + } + if(LOG.isInfoEnabled()) { + StringBuilder sb = new StringBuilder("Sending heartbeat for ") + .append(JavaUtils.txnIdToString(txnId)).append(" and"); + for(HiveLock lock : locks) { + sb.append(" ").append(lock.toString()); } + LOG.info(sb.toString()); + } + if(!isTxnOpen() && locks.isEmpty()) { + // No locks, no txn, we outta here. + return; } for (HiveLock lock : locks) { long lockId = ((DbLockManager.DbHiveLock)lock).lockId; @@ -320,7 +331,8 @@ public void heartbeat() throws LockException { throw new LockException(e, ErrorMsg.TXN_ABORTED, JavaUtils.txnIdToString(txnId)); } catch (TException e) { throw new LockException( - ErrorMsg.METASTORE_COMMUNICATION_FAILED.getMsg(), e); + ErrorMsg.METASTORE_COMMUNICATION_FAILED.getMsg() + "(" + JavaUtils.txnIdToString(txnId) + + "," + lock.toString() + ")", e); } } }