[ 
https://issues.apache.org/jira/browse/HIVE-1681?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ning Zhang updated HIVE-1681:
-----------------------------

    Resolution: Fixed
        Status: Resolved  (was: Patch Available)

Committed to both trunk and branch 0.6. Thanks Carl!

> ObjectStore.commitTransaction() does not properly handle transactions that 
> have already been rolled back
> --------------------------------------------------------------------------------------------------------
>
>                 Key: HIVE-1681
>                 URL: https://issues.apache.org/jira/browse/HIVE-1681
>             Project: Hadoop Hive
>          Issue Type: Bug
>          Components: Metastore
>    Affects Versions: 0.5.0, 0.6.0, 0.7.0
>            Reporter: Carl Steinbach
>            Assignee: Carl Steinbach
>             Fix For: 0.6.0, 0.7.0
>
>         Attachments: HIVE-1681-backport06.1.patch.txt, 
> HIVE-1681-backport06.2.patch.txt, HIVE-1681.1.patch.txt
>
>
> Here's the code for ObjectStore.commitTransaction() and 
> ObjectStore.rollbackTransaction():
> {code}
>   public boolean commitTransaction() {
>     assert (openTrasactionCalls >= 1);
>     if (!currentTransaction.isActive()) {
>       throw new RuntimeException(
>           "Commit is called, but transaction is not active. Either there are"
>               + " mismatching open and close calls or rollback was called in 
> the same trasaction");
>     }
>     openTrasactionCalls--;
>     if ((openTrasactionCalls == 0) && currentTransaction.isActive()) {
>       transactionStatus = TXN_STATUS.COMMITED;
>       currentTransaction.commit();
>     }
>     return true;
>   }
>   public void rollbackTransaction() {
>     if (openTrasactionCalls < 1) {
>       return;
>     }
>     openTrasactionCalls = 0;
>     if (currentTransaction.isActive()
>         && transactionStatus != TXN_STATUS.ROLLBACK) {
>       transactionStatus = TXN_STATUS.ROLLBACK;
>       // could already be rolled back
>       currentTransaction.rollback();
>     }
>   }
> {code}
> Now suppose a nested transaction throws an exception which results
> in the nested pseudo-transaction calling rollbackTransaction(). This causes
> rollbackTransaction() to rollback the actual transaction, as well as to set 
> openTransactionCalls=0 and transactionStatus = TXN_STATUS.ROLLBACK.
> Suppose also that this nested transaction squelches the original exception.
> In this case the stack will unwind and the caller will eventually try to 
> commit the
> transaction by calling commitTransaction() which will see that 
> currentTransaction.isActive() returns
> FALSE and will throw a RuntimeException. The fix for this problem is
> that commitTransaction() needs to first check transactionStatus and return 
> immediately
> if transactionStatus==TXN_STATUS.ROLLBACK.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to