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 3aec8eb..b970c86 100644 --- ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java +++ ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java @@ -20,6 +20,7 @@ import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.ql.io.AcidUtils; +import org.apache.hadoop.hive.ql.parse.SemanticAnalyzer; import org.apache.hive.common.util.ShutdownHookManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -156,9 +157,9 @@ LockState acquireLocks(QueryPlan plan, Context ctx, String username, boolean isB // For each source to read, get a shared lock for (ReadEntity input : plan.getInputs()) { - if (!input.needsLock() || input.isUpdateOrDelete()) { + if (!input.needsLock() || input.isUpdateOrDelete() || isTempTable(input)) { // We don't want to acquire readlocks during update or delete as we'll be acquiring write - // locks instead. + // locks instead. Also, there's no need to lock temp tables since they're session wide continue; } LockComponentBuilder compBuilder = new LockComponentBuilder(); @@ -200,8 +201,8 @@ LockState acquireLocks(QueryPlan plan, Context ctx, String username, boolean isB // need a SEMI-SHARED. for (WriteEntity output : plan.getOutputs()) { if (output.getType() == Entity.Type.DFS_DIR || output.getType() == - Entity.Type.LOCAL_DIR) { - // We don't lock files or directories. + Entity.Type.LOCAL_DIR || isTempTable(output)) { + // We don't lock files or directories. We also skip locking temp tables. continue; } LockComponentBuilder compBuilder = new LockComponentBuilder(); @@ -521,6 +522,10 @@ public int getStatementId() { return statementId; } + private boolean isTempTable(Entity entity) { + return entity.getName().contains(SemanticAnalyzer.getTmpTblPrefix().toLowerCase()); + } + public static long getHeartbeatInterval(Configuration conf) throws LockException { // Retrieve HIVE_TXN_TIMEOUT in MILLISECONDS (it's defined as SECONDS), // then divide it by 2 to give us a safety factor. diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 2983d38..86cc08f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12884,4 +12884,7 @@ private void warn(String msg) { String.format("Warning: %s", msg)); } + public static String getTmpTblPrefix() { + return VALUES_TMP_TABLE_NAME_PREFIX; + } } diff --git ql/src/test/org/apache/hadoop/hive/ql/lockmgr/TestDbTxnManager2.java ql/src/test/org/apache/hadoop/hive/ql/lockmgr/TestDbTxnManager2.java index e94af55..5039518 100644 --- ql/src/test/org/apache/hadoop/hive/ql/lockmgr/TestDbTxnManager2.java +++ ql/src/test/org/apache/hadoop/hive/ql/lockmgr/TestDbTxnManager2.java @@ -552,48 +552,40 @@ public void checkExpectedLocks() throws Exception { checkCmdOnDriver(cpr); LockState lockState = ((DbTxnManager) txnMgr).acquireLocks(driver.getPlan(), ctx, "Practical", false); List locks = getLocks(); - Assert.assertEquals("Unexpected lock count", 2, locks.size()); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "values__tmp__table__1", null, locks.get(0)); - checkLock(LockType.EXCLUSIVE, LockState.ACQUIRED, "default", "nonAcidPart", null, locks.get(1)); - List relLocks = new ArrayList(2); + Assert.assertEquals("Unexpected lock count", 1, locks.size()); + checkLock(LockType.EXCLUSIVE, LockState.ACQUIRED, "default", "nonAcidPart", null, locks.get(0)); + List relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); - relLocks.add(new DbLockManager.DbHiveLock(locks.get(1).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); cpr = driver.compileAndRespond("insert into nonAcidPart partition(p=1) values(5,6)"); checkCmdOnDriver(cpr); lockState = ((DbTxnManager) txnMgr).acquireLocks(driver.getPlan(), ctx, "Practical", false); locks = getLocks(); - Assert.assertEquals("Unexpected lock count", 2, locks.size()); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "values__tmp__table__2", null, locks.get(0)); - checkLock(LockType.EXCLUSIVE, LockState.ACQUIRED, "default", "nonAcidPart", "p=1", locks.get(1)); - relLocks = new ArrayList(2); + Assert.assertEquals("Unexpected lock count", 1, locks.size()); + checkLock(LockType.EXCLUSIVE, LockState.ACQUIRED, "default", "nonAcidPart", "p=1", locks.get(0)); + relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); - relLocks.add(new DbLockManager.DbHiveLock(locks.get(1).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); cpr = driver.compileAndRespond("insert into acidPart partition(p) values(1,2,3)"); checkCmdOnDriver(cpr); lockState = ((DbTxnManager) txnMgr).acquireLocks(driver.getPlan(), ctx, "Practical", false); locks = getLocks(); - Assert.assertEquals("Unexpected lock count", 2, locks.size()); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "values__tmp__table__3", null, locks.get(0)); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "acidPart", null, locks.get(1)); - relLocks = new ArrayList(2); + Assert.assertEquals("Unexpected lock count", 1, locks.size()); + checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "acidPart", null, locks.get(0)); + relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); - relLocks.add(new DbLockManager.DbHiveLock(locks.get(1).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); cpr = driver.compileAndRespond("insert into acidPart partition(p=1) values(5,6)"); checkCmdOnDriver(cpr); lockState = ((DbTxnManager) txnMgr).acquireLocks(driver.getPlan(), ctx, "Practical", false); locks = getLocks(); - Assert.assertEquals("Unexpected lock count", 2, locks.size()); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "values__tmp__table__4", null, locks.get(0)); - checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "acidPart", "p=1", locks.get(1)); - relLocks = new ArrayList(2); + Assert.assertEquals("Unexpected lock count", 1, locks.size()); + checkLock(LockType.SHARED_READ, LockState.ACQUIRED, "default", "acidPart", "p=1", locks.get(0)); + relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); - relLocks.add(new DbLockManager.DbHiveLock(locks.get(1).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); cpr = driver.compileAndRespond("update acidPart set b = 17 where a = 1"); @@ -602,7 +594,7 @@ public void checkExpectedLocks() throws Exception { locks = getLocks(); Assert.assertEquals("Unexpected lock count", 1, locks.size()); checkLock(LockType.SHARED_WRITE, LockState.ACQUIRED, "default", "acidPart", null, locks.get(0)); - relLocks = new ArrayList(2); + relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); @@ -612,7 +604,7 @@ public void checkExpectedLocks() throws Exception { locks = getLocks(); Assert.assertEquals("Unexpected lock count", 1, locks.size()); checkLock(LockType.SHARED_WRITE, LockState.ACQUIRED, "default", "acidPart", null, locks.get(0));//https://issues.apache.org/jira/browse/HIVE-13212 - relLocks = new ArrayList(2); + relLocks = new ArrayList(1); relLocks.add(new DbLockManager.DbHiveLock(locks.get(0).getLockid())); txnMgr.getLockManager().releaseLocks(relLocks); }