[Zodb-checkins] CVS: Zope3/src/zodb - db.py:1.9.2.1

Jeremy Hylton jeremy@zope.com
Sat, 1 Mar 2003 21:35:26 -0500


Update of /cvs-repository/Zope3/src/zodb
In directory cvs.zope.org:/tmp/cvs-serv19102/src/zodb

Modified Files:
      Tag: jeremy-atomic-invalidation-branch
	db.py 
Log Message:
New invalidation API.

The begin_ and finish_invalidation() methods are no longer needed.
Change invalidate() to take a set of oids instead of just one.


=== Zope3/src/zodb/db.py 1.9 => 1.9.2.1 ===
--- Zope3/src/zodb/db.py:1.9	Thu Feb 27 15:16:45 2003
+++ Zope3/src/zodb/db.py	Sat Mar  1 21:35:25 2003
@@ -55,10 +55,12 @@
 
         self.log = logging.getLogger("zodb")
 
-        # Allocate locks:
-        l=Lock()
-        self._a=l.acquire
-        self._r=l.release
+        # The lock protects access to the pool data structures.
+        # Store the lock acquire and release methods as methods
+        # of the instance.
+        l = Lock()
+        self._a = l.acquire
+        self._r = l.release
 
         # Setup connection pools and cache info
         # _pool is currently available (closed) connections
@@ -148,17 +150,7 @@
     def getPoolSize(self):
         return self._pool_size
 
-    def begin_invalidation(self):
-        # Must be called before first call to invalidate and before
-        # the storage lock is held.
-        self._a()
-
-    def finish_invalidation(self):
-        # Must be called after begin_invalidation() and after final
-        # invalidate() call.
-        self._r()
-
-    def invalidate(self, oid, connection=None, version=''):
+    def invalidate(self, oids, connection=None, version=''):
         """Invalidate references to a given oid.
 
         This is used to indicate that one of the connections has committed a
@@ -166,7 +158,6 @@
         passed in to prevent useless (but harmless) messages to the
         connection.
         """
-        assert oid is not None
         if connection is not None:
             assert version == connection._version
             version = connection._version
@@ -174,18 +165,18 @@
         # Notify connections
         for cc in self._allocated:
             if cc is not connection:
-                self.invalidateConnection(cc, oid, version)
+                self.invalidateConnection(cc, oids, version)
 
         if self._temps:
             # t accumulates all the connections that aren't closed.
             t = []
             for cc in self._temps:
                 if cc is not connection:
-                    self.invalidateConnection(cc, oid, version,
+                    self.invalidateConnection(cc, oids, version,
                                               t.append)
             self._temps = t
 
-    def invalidateConnection(self, conn, oid, version, alive=None):
+    def invalidateConnection(self, conn, oids, version, alive=None):
         """Send invalidation message to conn for oid on version.
 
         If the modification occurred on a version, an invalidation is
@@ -205,7 +196,7 @@
             if alive is not None:
                 alive(conn)
         if not version or conn.getVersion() == version:
-            conn.invalidate(oid)
+            conn.invalidate(oids)
 
     def open(self, version='', transaction=None, temporary=0, force=None,
              waitflag=1):
@@ -374,13 +365,11 @@
 
     def commit(self, txn):
         super(CommitVersion, self).commit(txn)
-        for oid in self._oids:
-            self._db.invalidate(oid, version=self._dest)
+        self._db.invalidate(self._oids, version=self._dest)
         if self._dest:
             # the code above just invalidated the dest version.
             # now we need to invalidate the source!
-            for oid in self._oids:
-                self._db.invalidate(oid, version=self._version)
+            self._db.invalidate(self._oids, version=self._version)
 
 class AbortVersion(SimpleDataManager):
     """An object that will see to version abortion."""
@@ -394,8 +383,7 @@
 
     def commit(self, txn):
         super(AbortVersion, self).commit(txn)
-        for oid in self._oids:
-            self._db.invalidate(oid, version=self._version)
+        self._db.invalidate(self._oids, version=self._version)
 
 class TransactionalUndo(SimpleDataManager):
     """An object that will see to transactional undo."""
@@ -409,5 +397,4 @@
 
     def commit(self, txn):
         super(TransactionalUndo, self).commit(txn)
-        for oid in self._oids:
-            self._db.invalidate(oid)
+        self._db.invalidate(self._oids)