diff src/org/dancres/blitz/disk/RetryingUpdate.java @ 0:3dc0c5604566

Initial checkin of blitz 2.0 fcs - no installer yet.
author Dan Creswell <dan.creswell@gmail.com>
date Sat, 21 Mar 2009 11:00:06 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/dancres/blitz/disk/RetryingUpdate.java	Sat Mar 21 11:00:06 2009 +0000
@@ -0,0 +1,66 @@
+package org.dancres.blitz.disk;
+
+import java.io.IOException;
+
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.DeadlockException;
+import com.sleepycat.je.LockNotGrantedException;
+
+import org.dancres.blitz.Logging;
+
+public class RetryingUpdate {
+    static Logger theLogger =
+        Logging.newLogger("org.dancres.blitz.disk.RetryingUpdate");
+
+    private RetryableOperation theOp;
+
+    public RetryingUpdate(RetryableOperation anOp) {
+        theOp = anOp;
+    }
+
+    public Object commit() throws IOException {
+        int myRetryCount = 0;
+
+        do {
+            DiskTxn myTxn = DiskTxn.newNonBlockingStandalone();
+
+            try {
+                Object myResult = theOp.perform(myTxn);
+
+                myTxn.commit();
+
+                if (myRetryCount != 0) {
+                    if (theLogger.isLoggable(Level.FINE))
+                        theLogger.log(Level.FINE,
+                                      "Total retries: " + myRetryCount);
+                }
+
+                return myResult;
+            } catch (DatabaseException aDbe) {
+                if ((aDbe instanceof DeadlockException) ||
+                    (aDbe instanceof LockNotGrantedException)) {
+
+                    if (theLogger.isLoggable(Level.FINEST))
+                        theLogger.log(Level.FINEST, "Got lock exception", aDbe);
+
+                    myTxn.abort();
+
+                    
+                    // System.err.println("Aborting" + theOp + " retry: " +
+                    //                    myRetryCount);
+
+                    ++myRetryCount;
+
+                    BackoffGenerator.pause();
+
+                } else {
+                    theLogger.log(Level.SEVERE, "Got Dbe", aDbe);
+                    throw new IOException("Dbe");
+                }
+            }
+        } while (true);
+    }
+}
\ No newline at end of file