You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2011/08/30 17:25:32 UTC

svn commit: r1163260 - in /incubator/lcf/trunk: CHANGES.txt framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java

Author: kwright
Date: Tue Aug 30 15:25:32 2011
New Revision: 1163260

URL: http://svn.apache.org/viewvc?rev=1163260&view=rev
Log:
Fix for CONNECTORS-244. Catch a deadlock condition that occurs on a query outside of a transaction on Derby (!).

Modified:
    incubator/lcf/trunk/CHANGES.txt
    incubator/lcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java

Modified: incubator/lcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/CHANGES.txt?rev=1163260&r1=1163259&r2=1163260&view=diff
==============================================================================
--- incubator/lcf/trunk/CHANGES.txt (original)
+++ incubator/lcf/trunk/CHANGES.txt Tue Aug 30 15:25:32 2011
@@ -3,6 +3,9 @@ $Id$
 
 ======================= 0.3-dev =========================
 
+CONNECTORS-244: Add a fix to recover for another Derby deadlock situation.
+(Karl Wright)
+
 CONNECTORS-243: Include most response headers in the metadata for
 each web connector document.
 (Jan Høydahl, Karl Wright)

Modified: incubator/lcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java
URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java?rev=1163260&r1=1163259&r2=1163260&view=diff
==============================================================================
--- incubator/lcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java (original)
+++ incubator/lcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/IncrementalIngester.java Tue Aug 30 15:25:32 2011
@@ -381,22 +381,49 @@ public class IncrementalIngester extends
     if (documentURI != null)
       documentURIHash = ManifoldCF.hash(documentURI);
 
+    String oldURI = null;
+    String oldURIHash = null;
+    String oldOutputVersion = null;
+
     // See what uri was used before for this doc, if any
     ArrayList list = new ArrayList();
     list.add(docKey);
     list.add(connection.getName());
-    IResultSet set = performQuery("SELECT "+docURIField+","+uriHashField+","+lastOutputVersionField+" FROM "+getTableName()+
-      " WHERE "+docKeyField+"=? AND "+outputConnNameField+"=?",list,null,null);
-
-    String oldURI = null;
-    String oldURIHash = null;
-    String oldOutputVersion = null;
-    if (set.getRowCount() > 0)
+    
+    while (true)
     {
-      IResultRow row = set.getRow(0);
-      oldURI = (String)row.getValue(docURIField);
-      oldURIHash = (String)row.getValue(uriHashField);
-      oldOutputVersion = (String)row.getValue(lastOutputVersionField);
+      long sleepAmt = 0L;
+      try
+      {
+        IResultSet set = performQuery("SELECT "+docURIField+","+uriHashField+","+lastOutputVersionField+" FROM "+getTableName()+
+          " WHERE "+docKeyField+"=? AND "+outputConnNameField+"=?",list,null,null);
+
+        if (set.getRowCount() > 0)
+        {
+          IResultRow row = set.getRow(0);
+          oldURI = (String)row.getValue(docURIField);
+          oldURIHash = (String)row.getValue(uriHashField);
+          oldOutputVersion = (String)row.getValue(lastOutputVersionField);
+        }
+        
+        break;
+      }
+      catch (ManifoldCFException e)
+      {
+        // Look for deadlock and retry if so
+        if (e.getErrorCode() == e.DATABASE_TRANSACTION_ABORT)
+        {
+          if (Logging.perf.isDebugEnabled())
+            Logging.perf.debug("Aborted select looking for status: "+e.getMessage());
+          sleepAmt = getSleepAmt();
+          continue;
+        }
+        throw e;
+      }
+      finally
+      {
+        sleepFor(sleepAmt);
+      }
     }
 
     // If uri hashes collide, then we must be sure to eliminate only the *correct* records from the table, or we will leave