You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/11/09 01:36:02 UTC
svn commit: r1637614 -
/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
Author: gunther
Date: Sun Nov 9 00:36:01 2014
New Revision: 1637614
URL: http://svn.apache.org/r1637614
Log:
HIVE-8798: Some Oracle deadlocks not being caught in TxnHandler (Alan Gates via Gunther Hagleitner)
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java?rev=1637614&r1=1637613&r2=1637614&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/txn/TxnHandler.java Sun Nov 9 00:36:01 2014
@@ -911,8 +911,9 @@ public class TxnHandler {
// If you change this function, remove the @Ignore from TestTxnHandler.deadlockIsDetected()
// to test these changes.
// MySQL and MSSQL use 40001 as the state code for rollback. Postgres uses 40001 and 40P01.
- // Oracle seems to return different SQLStates each time, but the message always contains
- // "deadlock detected", so I've used that instead.
+ // Oracle seems to return different SQLStates and messages each time,
+ // so I've tried to capture the different error messages (there appear to be fewer different
+ // error messages than SQL states).
// Derby and newer MySQL driver use the new SQLTransactionRollbackException
if (dbProduct == null) {
determineDatabaseProduct(conn);
@@ -921,7 +922,8 @@ public class TxnHandler {
((dbProduct == DatabaseProduct.MYSQL || dbProduct == DatabaseProduct.POSTGRES ||
dbProduct == DatabaseProduct.SQLSERVER) && e.getSQLState().equals("40001")) ||
(dbProduct == DatabaseProduct.POSTGRES && e.getSQLState().equals("40P01")) ||
- (dbProduct == DatabaseProduct.ORACLE && (e.getMessage().contains("deadlock detected")))) {
+ (dbProduct == DatabaseProduct.ORACLE && (e.getMessage().contains("deadlock detected")
+ || e.getMessage().contains("can't serialize access for this transaction")))) {
if (deadlockCnt++ < ALLOWED_REPEATED_DEADLOCKS) {
LOG.warn("Deadlock detected in " + caller + ", trying again.");
throw new DeadlockException();