[Zodb-checkins] SVN: ZODB/trunk/src/ZODB/ Removed the synch option to DB and Connection open.

Jim Fulton jim at zope.com
Sun May 6 05:48:34 EDT 2007


Log message for revision 75532:
  Removed the synch option to DB and Connection open.
  
  Removed subtransaction support.
  

Changed:
  U   ZODB/trunk/src/ZODB/Connection.py
  U   ZODB/trunk/src/ZODB/DB.py
  U   ZODB/trunk/src/ZODB/interfaces.py
  U   ZODB/trunk/src/ZODB/tests/testConnection.py
  U   ZODB/trunk/src/ZODB/tests/testConnectionSavepoint.py
  D   ZODB/trunk/src/ZODB/tests/testSubTransaction.py
  U   ZODB/trunk/src/ZODB/tests/testZODB.py

-=-
Modified: ZODB/trunk/src/ZODB/Connection.py
===================================================================
--- ZODB/trunk/src/ZODB/Connection.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/Connection.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -88,8 +88,6 @@
         # Multi-database support
         self.connections = {self._db.database_name: self}
 
-        self._synch = None
-
         self._version = version
         self._normal_storage = self._storage = db._storage
         self.new_oid = db._storage.new_oid
@@ -283,9 +281,8 @@
 
         self._debug_info = ()
 
-        if self._synch:
+        if self._opened:
             self.transaction_manager.unregisterSynch(self)
-            self._synch = None
 
         if primary:
             for connection in self.connections.values():
@@ -347,7 +344,7 @@
         if connection is None:
             new_con = self._db.databases[database_name].open(
                 transaction_manager=self.transaction_manager,
-                version=self._version, synch=self._synch,
+                version=self._version,
                 )
             self.connections.update(new_con.connections)
             new_con.connections = self.connections
@@ -452,8 +449,6 @@
     def _tpc_cleanup(self):
         """Performs cleanup operations to support tpc_finish and tpc_abort."""
         self._conflicts.clear()
-        if not self._synch:
-            self._flush_invalidations()
         self._needs_to_join = True
         self._registered_objects = []
         self._creating.clear()
@@ -648,12 +643,6 @@
         # return an exception object and expect that the Connection
         # will raise the exception.
 
-        # When commit_sub() exceutes a store, there is no need to
-        # update the _p_changed flag, because the subtransaction
-        # tpc_vote() calls already did this.  The change=1 argument
-        # exists to allow commit_sub() to avoid setting the flag
-        # again.
-
         # When conflict resolution occurs, the object state held by
         # the connection does not match what is written to the
         # database.  Invalidate the object here to guarantee that
@@ -970,7 +959,7 @@
         # return a list of [ghosts....not recently used.....recently used]
         return everything.items() + items
 
-    def open(self, transaction_manager=None, synch=True, delegate=True):
+    def open(self, transaction_manager=None, delegate=True):
         """Register odb, the DB that this Connection uses.
 
         This method is called by the DB every time a Connection
@@ -984,16 +973,10 @@
         odb: database that owns the Connection
         transaction_manager: transaction manager to use.  None means
             use the default transaction manager.
-        synch: boolean indicating whether Connection should
         register for afterCompletion() calls.
         """
-        # TODO:  Why do we go to all the trouble of setting _db and
-        # other attributes on open and clearing them on close?
-        # A Connection is only ever associated with a single DB
-        # and Storage.
 
         self._opened = time()
-        self._synch = synch
 
         if transaction_manager is None:
             transaction_manager = transaction.manager
@@ -1006,8 +989,7 @@
         else:
             self._flush_invalidations()
 
-        if synch:
-            transaction_manager.registerSynch(self)
+        transaction_manager.registerSynch(self)
 
         if self._cache is not None:
             self._cache.incrgc() # This is a good time to do some GC
@@ -1016,7 +998,7 @@
             # delegate open to secondary connections
             for connection in self.connections.values():
                 if connection is not self:
-                    connection.open(transaction_manager, synch, False)
+                    connection.open(transaction_manager, False)
 
     def _resetCache(self):
         """Creates a new cache, discarding the old one.
@@ -1111,7 +1093,7 @@
         src.reset(*state)
 
     def _commit_savepoint(self, transaction):
-        """Commit all changes made in subtransactions and begin 2-phase commit
+        """Commit all changes made in savepoints and begin 2-phase commit
         """
         src = self._savepoint_storage
         self._storage = self._normal_storage
@@ -1143,7 +1125,7 @@
         src.close()
 
     def _abort_savepoint(self):
-        """Discard all subtransaction data."""
+        """Discard all savepoint data."""
         src = self._savepoint_storage
         self._storage = self._normal_storage
         self._savepoint_storage = None

Modified: ZODB/trunk/src/ZODB/DB.py
===================================================================
--- ZODB/trunk/src/ZODB/DB.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/DB.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -554,7 +554,7 @@
     def objectCount(self):
         return len(self._storage)
 
-    def open(self, version='', transaction_manager=None, synch=True):
+    def open(self, version='', transaction_manager=None):
         """Return a database Connection for use by application code.
 
         The optional `version` argument can be used to specify that a
@@ -569,8 +569,6 @@
              in, defaults to no version.
           - `transaction_manager`: transaction manager to use.  None means
              use the default transaction manager.
-          - `synch`: boolean indicating whether Connection should
-             register for afterCompletion() calls.
         """
 
         if version:
@@ -607,7 +605,7 @@
             assert result is not None
 
             # Tell the connection it belongs to self.
-            result.open(transaction_manager, synch)
+            result.open(transaction_manager)
 
             # A good time to do some cache cleanup.
             self._connectionMap(lambda c: c.cacheGC())

Modified: ZODB/trunk/src/ZODB/interfaces.py
===================================================================
--- ZODB/trunk/src/ZODB/interfaces.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/interfaces.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -355,20 +355,13 @@
         entry.
         """)
 
-    def open(version='',
-             mvcc=True,
-             transaction_manager=None,
-             synch=True
-             ):
+    def open(version='', transaction_manager=None):
         """Return an IConnection object for use by application code.
 
         version: the "version" that all changes will be made
             in, defaults to no version.
-        mvcc: boolean indicating whether MVCC is enabled
         transaction_manager: transaction manager to use.  None means
             use the default transaction manager.
-        synch: boolean indicating whether Connection should
-            register for afterCompletion() calls.
 
         Note that the connection pool is managed as a stack, to
         increase the likelihood that the connection's stack will

Modified: ZODB/trunk/src/ZODB/tests/testConnection.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testConnection.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/tests/testConnection.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -24,12 +24,6 @@
 from ZODB.tests.warnhook import WarningsHook
 from zope.interface.verify import verifyObject
 
-# deprecated37  remove when subtransactions go away
-# Don't complain about subtxns in these tests.
-warnings.filterwarnings("ignore",
-                        ".*\nsubtransactions are deprecated",
-                        DeprecationWarning, __name__)
-
 class ConnectionDotAdd(unittest.TestCase):
 
     def setUp(self):
@@ -292,35 +286,6 @@
         10
         >>> cn.close(); cn2.close()
 
-        Bug:  We weren't catching the case where the only changes pending
-        were in a subtransaction.
-        >>> cn = db.open()
-        >>> cn.root()['a'] = 100
-        >>> transaction.commit(True)
-        >>> cn.close()  # this was succeeding
-        Traceback (most recent call last):
-          ...
-        ConnectionStateError: Cannot close a connection joined to a transaction
-
-        Again this leaves the connection as it was.
-        >>> transaction.commit()
-        >>> cn2 = db.open()
-        >>> cn2.root()['a']
-        100
-        >>> cn.close(); cn2.close()
-
-        Make sure we can still close a connection after aborting a pending
-        subtransaction.
-        >>> cn = db.open()
-        >>> cn.root()['a'] = 1000
-        >>> transaction.commit(True)
-        >>> cn.root()['a']
-        1000
-        >>> transaction.abort()
-        >>> cn.root()['a']
-        100
-        >>> cn.close()
-
         >>> db.close()
         """
 

Modified: ZODB/trunk/src/ZODB/tests/testConnectionSavepoint.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testConnectionSavepoint.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/tests/testConnectionSavepoint.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -54,11 +54,8 @@
 The problem was that we were effectively commiting the object twice --
 when commiting the current data and when committing the savepoint.
 The fix was to first make a new savepoint to move new changes to the
-savepoint storage and *then* to commit the savepoint storage. (This is
-similar to the strategy that was used for subtransactions prior to
-savepoints.)
+savepoint storage and *then* to commit the savepoint storage.
 
-
     >>> import ZODB.tests.util
     >>> db = ZODB.tests.util.DB()
     >>> connection = db.open()
@@ -90,8 +87,7 @@
     """\
 Although the interface doesn't guarantee this internal detail, making a
 savepoint should do incremental gc on connection memory caches.  Indeed,
-one traditional use for savepoints (started by the older, related
-"subtransaction commit" idea) is simply to free memory space midstream
+one traditional use for savepoints is simply to free memory space midstream
 during a long transaction.  Before ZODB 3.4.2, making a savepoint failed
 to trigger cache gc, and this test verifies that it now does.
 

Deleted: ZODB/trunk/src/ZODB/tests/testSubTransaction.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testSubTransaction.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/tests/testSubTransaction.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -1,179 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-ZODB subtransaction tests
-=========================
-
-Subtransactions are deprecated.  First we install a hook, to verify that
-deprecation warnings are generated.
-
->>> hook = WarningsHook()
->>> hook.install()
-
-Subtransactions are provided by a generic transaction interface, but
-only supported by ZODB.  These tests verify that some of the important
-cases work as expected.
-
->>> import transaction
->>> from ZODB import DB
->>> from ZODB.tests.test_storage import MinimalMemoryStorage
->>> from ZODB.tests.MinPO import MinPO
-
-First create a few objects in the database root with a normal commit.
-We're going to make a series of modifications to these objects.
-
->>> db = DB(MinimalMemoryStorage())
->>> cn = db.open()
->>> rt = cn.root()
->>> def init():
-...     global a, b, c
-...     a = rt["a"] = MinPO("a0")
-...     b = rt["b"] = MinPO("b0")
-...     c = rt["c"] = MinPO("c0")
-...     transaction.commit()
->>> init()
-
-We'll also open a second database connection and use it to verify that
-the intermediate results of subtransactions are not visible to other
-connections.
-
->>> cn2 = db.open(synch=False)
->>> rt2 = cn2.root()
->>> shadow_a = rt2["a"]
->>> shadow_b = rt2["b"]
->>> shadow_c = rt2["c"]
-
-Subtransaction commit
----------------------
-
-We'll make a series of modifications in subtransactions.
-
->>> a.value = "a1"
->>> b.value = "b1"
->>> transaction.commit(1)
->>> a.value, b.value
-('a1', 'b1')
->>> shadow_a.value, shadow_b.value
-('a0', 'b0')
-
-The subtransaction commit should have generated a deprecation wng:
-
->>> len(hook.warnings)
-1
->>> message, category, filename, lineno = hook.warnings[0]
->>> print message
-This will be removed in ZODB 3.7:
-subtransactions are deprecated; use transaction.savepoint() instead of \
-transaction.commit(1)
->>> category.__name__
-'DeprecationWarning'
->>> hook.clear()
-
->>> a.value = "a2"
->>> c.value = "c1"
->>> transaction.commit(1)
->>> a.value, c.value
-('a2', 'c1')
->>> shadow_a.value, shadow_c.value
-('a0', 'c0')
-
->>> a.value = "a3"
->>> transaction.commit(1)
->>> a.value
-'a3'
->>> shadow_a.value
-'a0'
-
->>> transaction.commit()
-
->>> a.value, b.value, c.value
-('a3', 'b1', 'c1')
-
-Subtransaction with nested abort
---------------------------------
-
->>> init()
->>> a.value = "a1"
->>> transaction.commit(1)
-
->>> b.value = "b1"
->>> transaction.commit(1)
-
-A sub-transaction abort will undo current changes, reverting to the
-database state as of the last sub-transaction commit.  There is
-(apparently) no way to abort an already-committed subtransaction.
-
->>> c.value = "c1"
->>> transaction.abort(1)
->>> a.value, b.value, c.value
-('a1', 'b1', 'c0')
-
-The subtxn abort should also have generated a deprecation warning:
-
->>> len(hook.warnings)
-1
->>> message, category, filename, lineno = hook.warnings[0]
->>> print message
-This will be removed in ZODB 3.7:
-subtransactions are deprecated; use sp.rollback() instead of \
-transaction.abort(1), where `sp` is the corresponding savepoint \
-captured earlier
->>> category.__name__
-'DeprecationWarning'
->>> hook.clear()
-
-
-Multiple aborts have no extra effect.
-
->>> transaction.abort(1)
->>> a.value, b.value, c.value
-('a1', 'b1', 'c0')
-
->>> transaction.commit()
->>> a.value, b.value, c.value
-('a1', 'b1', 'c0')
-
-Subtransaction with top-level abort
------------------------------------
-
->>> init()
->>> a.value = "a1"
->>> transaction.commit(1)
-
->>> b.value = "b1"
->>> transaction.commit(1)
-
-A sub-transaction abort will undo current changes, reverting to the
-database state as of the last sub-transaction commit.  There is
-(apparently) no way to abort an already-committed subtransaction.
-
->>> c.value = "c1"
->>> transaction.abort(1)
-
->>> transaction.abort()
->>> a.value, b.value, c.value
-('a0', 'b0', 'c0')
-
-We have to uninstall the hook so that other warnings don't get lost.
-
->>> len(hook.warnings)  # we don't expect we captured other warnings
-0
->>> hook.uninstall()
-"""
-
-from ZODB.tests.warnhook import WarningsHook
-from zope.testing import doctest
-
-def test_suite():
-    return doctest.DocTestSuite()

Modified: ZODB/trunk/src/ZODB/tests/testZODB.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testZODB.py	2007-05-06 09:48:28 UTC (rev 75531)
+++ ZODB/trunk/src/ZODB/tests/testZODB.py	2007-05-06 09:48:32 UTC (rev 75532)
@@ -25,12 +25,8 @@
 from persistent.mapping import PersistentMapping
 import transaction
 
-# deprecated37  remove when subtransactions go away
-# Don't complain about subtxns in these tests.
+# deprecated39  remove when versions go away
 warnings.filterwarnings("ignore",
-                        ".*\nsubtransactions are deprecated",
-                        DeprecationWarning, __name__)
-warnings.filterwarnings("ignore",
                         "Versions are deprecated",
                         DeprecationWarning, __name__)
 
@@ -217,70 +213,6 @@
             conn1.close()
             conn2.close()
 
-    def checkSubtxnCommitDoesntGetInvalidations(self):
-        # Prior to ZODB 3.2.9 and 3.4, Connection.tpc_finish() processed
-        # invalidations even for a subtxn commit.  This could make
-        # inconsistent state visible after a subtxn commit.  There was a
-        # suspicion that POSKeyError was possible as a result, but I wasn't
-        # able to construct a case where that happened.
-
-        # Set up the database, to hold
-        # root --> "p" -> value = 1
-        #      --> "q" -> value = 2
-        tm1 = transaction.TransactionManager()
-        conn = self._db.open(transaction_manager=tm1)
-        r1 = conn.root()
-        p = P()
-        p.value = 1
-        r1["p"] = p
-        q = P()
-        q.value = 2
-        r1["q"] = q
-        tm1.commit()
-
-        # Now txn T1 changes p.value to 3 locally (subtxn commit).
-        p.value = 3
-        tm1.commit(True)
-
-        # Start new txn T2 with a new connection.
-        tm2 = transaction.TransactionManager()
-        cn2 = self._db.open(transaction_manager=tm2)
-        r2 = cn2.root()
-        p2 = r2["p"]
-        self.assertEqual(p._p_oid, p2._p_oid)
-        # T2 shouldn't see T1's change of p.value to 3, because T1 didn't
-        # commit yet.
-        self.assertEqual(p2.value, 1)
-        # Change p.value to 4, and q.value to 5.  Neither should be visible
-        # to T1, because T1 is still in progress.
-        p2.value = 4
-        q2 = r2["q"]
-        self.assertEqual(q._p_oid, q2._p_oid)
-        self.assertEqual(q2.value, 2)
-        q2.value = 5
-        tm2.commit()
-
-        # Back to T1.  p and q still have the expected values.
-        rt = conn.root()
-        self.assertEqual(rt["p"].value, 3)
-        self.assertEqual(rt["q"].value, 2)
-
-        # Now do another subtxn commit in T1.  This shouldn't change what
-        # T1 sees for p and q.
-        rt["r"] = P()
-        tm1.commit(True)
-
-        # Doing that subtxn commit in T1 should not process invalidations
-        # from T2's commit.  p.value should still be 3 here (because that's
-        # what T1 subtxn-committed earlier), and q.value should still be 2.
-        # Prior to ZODB 3.2.9 and 3.4, q.value was 5 here.
-        rt = conn.root()
-        try:
-            self.assertEqual(rt["p"].value, 3)
-            self.assertEqual(rt["q"].value, 2)
-        finally:
-            tm1.abort()
-
     def checkSavepointDoesntGetInvalidations(self):
         # Prior to ZODB 3.2.9 and 3.4, Connection.tpc_finish() processed
         # invalidations even for a subtxn commit.  This could make
@@ -357,23 +289,14 @@
         rt = cn.root()
         self.assertRaises(KeyError, rt.__getitem__, 'a')
 
-        # A longstanding bug:  this didn't work if changes were only in
-        # subtransactions.
         transaction.begin()
         rt = cn.root()
-        rt['a'] = 2
-        transaction.commit(1)
-
-        transaction.begin()
-        rt = cn.root()
         self.assertRaises(KeyError, rt.__getitem__, 'a')
 
-        # One more time, mixing "top level" and subtransaction changes.
+        # One more time.
         transaction.begin()
         rt = cn.root()
         rt['a'] = 3
-        transaction.commit(1)
-        rt['b'] = 4
 
         transaction.begin()
         rt = cn.root()
@@ -389,7 +312,6 @@
         # rest of this test was tossed.
 
     def checkFailingCommitSticks(self):
-        # See also checkFailingSubtransactionCommitSticks.
         # See also checkFailingSavepointSticks.
         cn = self._db.open()
         rt = cn.root()
@@ -435,93 +357,6 @@
 
         cn.close()
 
-    def checkFailingSubtransactionCommitSticks(self):
-        cn = self._db.open()
-        rt = cn.root()
-        rt['a'] = 1
-        transaction.commit(True)
-        self.assertEqual(rt['a'], 1)
-
-        rt['b'] = 2
-
-        # Make a jar that raises PoisonedError when a subtxn commit is done.
-        poisoned = PoisonedJar(break_savepoint=True)
-        transaction.get().join(poisoned)
-        # We're using try/except here instead of assertRaises so that this
-        # module's attempt to suppress subtransaction deprecation wngs
-        # works.
-        try:
-            transaction.commit(True)
-        except PoisonedError:
-            pass
-        else:
-            self.fail("expected PoisonedError")
-        # Trying to subtxn-commit again fails too.
-        try:
-            transaction.commit(True)
-        except TransactionFailedError:
-            pass
-        else:
-            self.fail("expected TransactionFailedError")
-        try:
-            transaction.commit(True)
-        except TransactionFailedError:
-            pass
-        else:
-            self.fail("expected TransactionFailedError")
-        # Top-level commit also fails.
-        self.assertRaises(TransactionFailedError, transaction.commit)
-
-        # The changes to rt['a'] and rt['b'] are lost.
-        self.assertRaises(KeyError, rt.__getitem__, 'a')
-        self.assertRaises(KeyError, rt.__getitem__, 'b')
-
-        # Trying to modify an object also fails, because Transaction.join()
-        # also raises TransactionFailedError.
-        self.assertRaises(TransactionFailedError, rt.__setitem__, 'b', 2)
-
-        # Clean up via abort(), and try again.
-        transaction.abort()
-        rt['a'] = 1
-        transaction.commit()
-        self.assertEqual(rt['a'], 1)
-
-        # Cleaning up via begin() should also work.
-        rt['a'] = 2
-        transaction.get().join(poisoned)
-        try:
-            transaction.commit(True)
-        except PoisonedError:
-            pass
-        else:
-            self.fail("expected PoisonedError")
-        # Trying to subtxn-commit again fails too.
-        try:
-            transaction.commit(True)
-        except TransactionFailedError:
-            pass
-        else:
-            self.fail("expected TransactionFailedError")
-
-        # The change to rt['a'] is lost.
-        self.assertEqual(rt['a'], 1)
-        # Trying to modify an object also fails.
-        self.assertRaises(TransactionFailedError, rt.__setitem__, 'b', 2)
-
-        # Clean up via begin(), and try again.
-        transaction.begin()
-        rt['a'] = 2
-        transaction.commit(True)
-        self.assertEqual(rt['a'], 2)
-        transaction.get().commit()
-
-        cn2 = self._db.open()
-        rt = cn.root()
-        self.assertEqual(rt['a'], 2)
-
-        cn.close()
-        cn2.close()
-
     def checkFailingSavepointSticks(self):
         cn = self._db.open()
         rt = cn.root()
@@ -786,8 +621,6 @@
     def sortKey(self):
         return str(id(self))
 
-    # A way that used to poison a subtransaction commit.  With the current
-    # implementation of subtxns, pass break_savepoint=True instead.
     def tpc_begin(self, *args):
         if self.break_tpc_begin:
             raise PoisonedError("tpc_begin fails")



More information about the Zodb-checkins mailing list