[jira] Commented: (HIVE-1760) Mismatched open/commit transaction calls in case of connection retry
[ https://issues.apache.org/jira/browse/HIVE-1760?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12926502#action_12926502 ] Paul Yang commented on HIVE-1760: - Explanation of the patch - by eliminating cases where executeWithRetry() is nested, this will produce the correct rollback behavior. > Mismatched open/commit transaction calls in case of connection retry > > > Key: HIVE-1760 > URL: https://issues.apache.org/jira/browse/HIVE-1760 > Project: Hive > Issue Type: Bug > Components: Metastore >Affects Versions: 0.7.0 >Reporter: Paul Yang >Assignee: Paul Yang > Attachments: HIVE-1760.1.patch > > > Consider the create table function (parts removed for simplicity): > {code} > private void create_table_core(final RawStore ms, final Table tbl) > throws AlreadyExistsException, MetaException, InvalidObjectException { > Path tblPath = null; > boolean success = false, madeDir = false; > try { > ms.openTransaction(); > // get_table checks whether database exists, it should be moved here > if (is_table_exists(tbl.getDbName(), tbl.getTableName())) { > throw new AlreadyExistsException("Table " + tbl.getTableName() > + " already exists"); > } > ms.createTable(tbl); > success = ms.commitTransaction(); > } finally { > if (!success) { > ms.rollbackTransaction(); > if (madeDir) { > wh.deleteDir(tblPath, true); > } > } > } > } > {code} > A potential openTransaction() / commitTransaction() mismatch can occur if the > is_table_exits() method call experiences a connection failure. > Since get_table() in is_table_exists() uses executeWithRetry(), the > transaction will be rolled back and get_table() will be called again if the > is a connection problem. However, this rollback and retry will reset the > global openTransactionCalls counter back to 0, effectively canceling out the > openTransaction() call. > Then later in the method when commitTransaction() is called, Hive will throw > an error similar to the following: > Caused by: java.lang.RuntimeException: commitTransaction was called but > openTransactionCalls = 0. This probably indicates that there are unbalanced > calls to openTransaction/commitTransaction > A similar problem exists with create_type_core() -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.
[jira] Commented: (HIVE-1760) Mismatched open/commit transaction calls in case of connection retry
[ https://issues.apache.org/jira/browse/HIVE-1760?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12926500#action_12926500 ] Namit Jain commented on HIVE-1760: -- +1 running tests now > Mismatched open/commit transaction calls in case of connection retry > > > Key: HIVE-1760 > URL: https://issues.apache.org/jira/browse/HIVE-1760 > Project: Hive > Issue Type: Bug > Components: Metastore >Affects Versions: 0.7.0 >Reporter: Paul Yang >Assignee: Paul Yang > Attachments: HIVE-1760.1.patch > > > Consider the create table function (parts removed for simplicity): > {code} > private void create_table_core(final RawStore ms, final Table tbl) > throws AlreadyExistsException, MetaException, InvalidObjectException { > Path tblPath = null; > boolean success = false, madeDir = false; > try { > ms.openTransaction(); > // get_table checks whether database exists, it should be moved here > if (is_table_exists(tbl.getDbName(), tbl.getTableName())) { > throw new AlreadyExistsException("Table " + tbl.getTableName() > + " already exists"); > } > ms.createTable(tbl); > success = ms.commitTransaction(); > } finally { > if (!success) { > ms.rollbackTransaction(); > if (madeDir) { > wh.deleteDir(tblPath, true); > } > } > } > } > {code} > A potential openTransaction() / commitTransaction() mismatch can occur if the > is_table_exits() method call experiences a connection failure. > Since get_table() in is_table_exists() uses executeWithRetry(), the > transaction will be rolled back and get_table() will be called again if the > is a connection problem. However, this rollback and retry will reset the > global openTransactionCalls counter back to 0, effectively canceling out the > openTransaction() call. > Then later in the method when commitTransaction() is called, Hive will throw > an error similar to the following: > Caused by: java.lang.RuntimeException: commitTransaction was called but > openTransactionCalls = 0. This probably indicates that there are unbalanced > calls to openTransaction/commitTransaction > A similar problem exists with create_type_core() -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.