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();
     }
   }
 


Reply via email to