[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