Author: khorgath Date: Tue Dec 9 01:10:26 2014 New Revision: 1643966 URL: http://svn.apache.org/r1643966 Log: HIVE-8850 : ObjectStore:: rollbackTransaction() needs to be looked into further (Hari Sankar Sivarama Subramaniyan, reviewed by Sushanth Sowmyan, Chaoyu Tang)
Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java?rev=1643966&r1=1643965&r2=1643966&view=diff ============================================================================== --- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (original) +++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java Tue Dec 9 01:10:26 2014 @@ -394,9 +394,12 @@ public class ObjectStore implements RawS currentTransaction.begin(); transactionStatus = TXN_STATUS.OPEN; } else { - // something is wrong since openTransactionCalls is greater than 1 but - // currentTransaction is not active - assert ((currentTransaction != null) && (currentTransaction.isActive())); + // openTransactionCalls > 1 means this is an interior transaction + // We should already have a transaction created that is active. + if ((currentTransaction == null) || (!currentTransaction.isActive())){ + throw new RuntimeException("openTransaction called in an interior" + + " transaction scope, but currentTransaction is not active."); + } } boolean result = currentTransaction.isActive(); @@ -462,20 +465,19 @@ public class ObjectStore implements RawS debugLog("rolling back transaction: no open transactions: " + openTrasactionCalls); return; } - openTrasactionCalls = 0; debugLog("Rollback transaction, isActive: " + currentTransaction.isActive()); - if (currentTransaction.isActive() - && transactionStatus != TXN_STATUS.ROLLBACK) { - transactionStatus = TXN_STATUS.ROLLBACK; - try { - // could already be rolled back + try { + if (currentTransaction.isActive() + && transactionStatus != TXN_STATUS.ROLLBACK) { currentTransaction.rollback(); - } finally { - // remove all detached objects from the cache, since the transaction is - // being rolled back they are no longer relevant, and this prevents them - // from reattaching in future transactions - pm.evictAll(); } + } finally { + openTrasactionCalls = 0; + transactionStatus = TXN_STATUS.ROLLBACK; + // remove all detached objects from the cache, since the transaction is + // being rolled back they are no longer relevant, and this prevents them + // from reattaching in future transactions + pm.evictAll(); } }