[Checkins] SVN: relstorage/trunk/ Stopped wrapping database disconnect exceptions. Now the code

Shane Hathaway shane at hathawaymix.org
Sat Sep 26 02:24:54 EDT 2009


Log message for revision 104564:
  Stopped wrapping database disconnect exceptions.  Now the code
  catches and handles them directly.
  

Changed:
  U   relstorage/trunk/CHANGES.txt
  U   relstorage/trunk/relstorage/adapters/connmanager.py
  U   relstorage/trunk/relstorage/adapters/interfaces.py
  U   relstorage/trunk/relstorage/adapters/mover.py
  U   relstorage/trunk/relstorage/adapters/oracle.py
  U   relstorage/trunk/relstorage/storage.py

-=-
Modified: relstorage/trunk/CHANGES.txt
===================================================================
--- relstorage/trunk/CHANGES.txt	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/CHANGES.txt	2009-09-26 06:24:52 UTC (rev 104564)
@@ -26,6 +26,10 @@
 - Changed loadSerial to load from the store connection only if the
   load connection can not provide the object requested.
 
+- Stopped wrapping database disconnect exceptions.  Now the code
+  catches and handles them directly.
+
+
 1.3.0b1 (2009-09-04)
 --------------------
 

Modified: relstorage/trunk/relstorage/adapters/connmanager.py
===================================================================
--- relstorage/trunk/relstorage/adapters/connmanager.py	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/relstorage/adapters/connmanager.py	2009-09-26 06:24:52 UTC (rev 104564)
@@ -14,7 +14,6 @@
 
 from relstorage.adapters.interfaces import IConnectionManager
 from zope.interface import implements
-from ZODB.POSException import StorageError
 
 class AbstractConnectionManager(object):
     """Abstract base class for connection management.
@@ -79,10 +78,7 @@
 
     def restart_load(self, conn, cursor):
         """Reinitialize a connection for loading objects."""
-        try:
-            conn.rollback()
-        except self.disconnected_exceptions, e:
-            raise StorageError(e)
+        conn.rollback()
 
     def open_for_store(self):
         """Open and initialize a connection for storing objects.
@@ -100,12 +96,9 @@
 
     def restart_store(self, conn, cursor):
         """Reuse a store connection."""
-        try:
-            conn.rollback()
-            if self.on_store_opened is not None:
-                self.on_store_opened(cursor, restart=True)
-        except self.disconnected_exceptions, e:
-            raise StorageError(e)
+        conn.rollback()
+        if self.on_store_opened is not None:
+            self.on_store_opened(cursor, restart=True)
 
     def open_for_pre_pack(self):
         """Open a connection to be used for the pre-pack phase.

Modified: relstorage/trunk/relstorage/adapters/interfaces.py
===================================================================
--- relstorage/trunk/relstorage/adapters/interfaces.py	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/relstorage/adapters/interfaces.py	2009-09-26 06:24:52 UTC (rev 104564)
@@ -36,6 +36,11 @@
 class IConnectionManager(Interface):
     """Open and close database connections"""
 
+    disconnected_exceptions = Attribute(
+        """The tuple of exception types that might be
+        raised when the connection to the database has been broken.
+        """)
+
     def open():
         """Open a database connection and return (conn, cursor)."""
 
@@ -63,7 +68,8 @@
 
         This gets called when polling the database, so it needs to be quick.
 
-        Raise StorageError if the database has disconnected.
+        Raise one of self.disconnected_exceptions if the database has
+        disconnected.
         """
 
     def open_for_store():
@@ -75,7 +81,8 @@
     def restart_store(conn, cursor):
         """Rollback and reuse a store connection.
 
-        Raise StorageError if the database has disconnected.
+        Raise one of self.disconnected_exceptions if the database
+        has disconnected.
         """
 
     def open_for_pre_pack():
@@ -299,6 +306,10 @@
         committed in that transaction will not be included in the list
         of changed OIDs.
 
+        If the database has disconnected, this method should raise one
+        of the exceptions listed in the disconnected_exceptions
+        attribute of the associated IConnectionManager.
+
         Returns (changed_oids, new_polled_tid).
         """
 

Modified: relstorage/trunk/relstorage/adapters/mover.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mover.py	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/relstorage/adapters/mover.py	2009-09-26 06:24:52 UTC (rev 104564)
@@ -17,7 +17,6 @@
 from base64 import decodestring
 from base64 import encodestring
 from relstorage.adapters.interfaces import IObjectMover
-from ZODB.POSException import StorageError
 from zope.interface import implements
 
 try:

Modified: relstorage/trunk/relstorage/adapters/oracle.py
===================================================================
--- relstorage/trunk/relstorage/adapters/oracle.py	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/relstorage/adapters/oracle.py	2009-09-26 06:24:52 UTC (rev 104564)
@@ -15,7 +15,6 @@
 
 import logging
 import cx_Oracle
-from ZODB.POSException import StorageError
 from zope.interface import implements
 
 from relstorage.adapters.connmanager import AbstractConnectionManager
@@ -241,11 +240,8 @@
 
     def restart_load(self, conn, cursor):
         """Reinitialize a connection for loading objects."""
-        try:
-            conn.rollback()
-            cursor.execute("SET TRANSACTION READ ONLY")
-        except self.disconnected_exceptions, e:
-            raise StorageError(e)
+        conn.rollback()
+        cursor.execute("SET TRANSACTION READ ONLY")
 
     def _set_xid(self, conn, cursor):
         """Set up a distributed transaction"""
@@ -277,12 +273,9 @@
 
     def restart_store(self, conn, cursor):
         """Reuse a store connection."""
-        try:
-            conn.rollback()
-            if self._twophase:
-                self._set_xid(conn, cursor)
-            if self.on_store_opened is not None:
-                self.on_store_opened(cursor, restart=True)
-        except self.disconnected_exceptions, e:
-            raise StorageError(e)
+        conn.rollback()
+        if self._twophase:
+            self._set_xid(conn, cursor)
+        if self.on_store_opened is not None:
+            self.on_store_opened(cursor, restart=True)
 

Modified: relstorage/trunk/relstorage/storage.py
===================================================================
--- relstorage/trunk/relstorage/storage.py	2009-09-26 03:58:53 UTC (rev 104563)
+++ relstorage/trunk/relstorage/storage.py	2009-09-26 06:24:52 UTC (rev 104564)
@@ -198,7 +198,7 @@
             try:
                 self._adapter.connmanager.restart_load(
                     self._load_conn, self._load_cursor)
-            except POSException.StorageError, e:
+            except self._adapter.connmanager.disconnected_exceptions, e:
                 log.warning("Reconnecting load_conn: %s", e)
                 self._drop_load_connection()
                 try:
@@ -231,7 +231,7 @@
             try:
                 self._adapter.connmanager.restart_store(
                     self._store_conn, self._store_cursor)
-            except POSException.StorageError, e:
+            except self._adapter.connmanager.disconnected_exceptions, e:
                 log.warning("Reconnecting store_conn: %s", e)
                 self._drop_store_connection()
                 try:
@@ -1113,8 +1113,6 @@
                 self._poll_at = time.time() + self._options.poll_interval
 
             self._restart_load()
-            conn = self._load_conn
-            cursor = self._load_cursor
 
             # Ignore changes made by the last transaction committed
             # by this connection.
@@ -1124,8 +1122,24 @@
                 ignore_tid = None
 
             # get a list of changed OIDs and the most recent tid
-            oid_ints, new_polled_tid = self._adapter.poller.poll_invalidations(
-                conn, cursor, self._prev_polled_tid, ignore_tid)
+            poll = self._adapter.poller.poll_invalidations
+            try:
+                oid_ints, new_polled_tid = poll(
+                    self._load_conn, self._load_cursor,
+                    self._prev_polled_tid, ignore_tid)
+            except self._adapter.connmanager.disconnected_exceptions, e:
+                log.warning("Reconnecting load_conn: %s", e)
+                self._drop_load_connection()
+                try:
+                    self._open_load_connection()
+                except:
+                    log.exception("Reconnect failed.")
+                    raise
+                log.info("Reconnected.")
+                oid_ints, new_polled_tid = poll(
+                    self._load_conn, self._load_cursor,
+                    self._prev_polled_tid, ignore_tid)
+
             self._prev_polled_tid = new_polled_tid
 
             if oid_ints is None:



More information about the checkins mailing list