[Neo-report] r2632 vincent - in /trunk/neo/client: app.py mq_index.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jan 21 17:30:08 CET 2011


Author: vincent
Date: Fri Jan 21 17:30:07 2011
New Revision: 2632

Log:
Move RevisionIndex to its own file.

Added:
    trunk/neo/client/mq_index.py
Modified:
    trunk/neo/client/app.py

Modified: trunk/neo/client/app.py
==============================================================================
--- trunk/neo/client/app.py [iso-8859-1] (original)
+++ trunk/neo/client/app.py [iso-8859-1] Fri Jan 21 17:30:07 2011
@@ -43,7 +43,7 @@ from neo.client.handlers import storage,
 from neo.lib.dispatcher import Dispatcher, ForgottenPacket
 from neo.client.poll import ThreadedPoll, psThreadedPoll
 from neo.client.iterator import Iterator
-from neo.client.mq import MQ, MQIndex
+from neo.client.mq import MQ
 from neo.client.pool import ConnectionPool
 from neo.lib.util import u64, parseMasterList
 from neo.lib.profiling import profiler_decorator, PROFILING_ENABLED
@@ -119,140 +119,6 @@ class ThreadContext(object):
             'last_transaction': None,
         }
 
-class RevisionIndex(MQIndex):
-    """
-    This cache index allows accessing a specifig revision of a cached object.
-    It requires cache key to be a 2-tuple, composed of oid and revision.
-
-    Note: it is expected that rather few revisions are held in cache, with few
-    lookups for old revisions, so they are held in a simple sorted list
-    Note2: all methods here must be called with cache lock acquired.
-    """
-    def __init__(self):
-        # key: oid
-        # value: tid list, from highest to lowest
-        self._oid_dict = {}
-        # key: oid
-        # value: tid list, from lowest to highest
-        self._invalidated = {}
-
-    def clear(self):
-        self._oid_dict.clear()
-        self._invalidated.clear()
-
-    def remove(self, key):
-        oid_dict = self._oid_dict
-        oid, tid = key
-        tid_list = oid_dict[oid]
-        tid_list.remove(tid)
-        if not tid_list:
-            # No more serial known for this object, drop entirely
-            del oid_dict[oid]
-            self._invalidated.pop(oid, None)
-
-    def add(self, key):
-        oid_dict = self._oid_dict
-        oid, tid = key
-        try:
-            serial_list = oid_dict[oid]
-        except KeyError:
-            serial_list = oid_dict[oid] = []
-        else:
-            assert tid not in serial_list
-        if not(serial_list) or tid > serial_list[0]:
-            serial_list.insert(0, tid)
-        else:
-            serial_list.insert(0, tid)
-            serial_list.sort(reverse=True)
-        invalidated = self._invalidated
-        try:
-            tid_list = invalidated[oid]
-        except KeyError:
-            pass
-        else:
-            try:
-                tid_list.remove(tid)
-            except ValueError:
-                pass
-            else:
-                if not tid_list:
-                    del invalidated[oid]
-
-    def invalidate(self, oid_list, tid):
-        """
-        Mark object invalidated by given transaction.
-        Must be called with increasing TID values (which is standard for
-        ZODB).
-        """
-        invalidated = self._invalidated
-        oid_dict = self._oid_dict
-        for oid in (x for x in oid_list if x in oid_dict):
-            try:
-                tid_list = invalidated[oid]
-            except KeyError:
-                tid_list = invalidated[oid] = []
-            assert not tid_list or tid > tid_list[-1], (dump(oid), dump(tid),
-                dump(tid_list[-1]))
-            tid_list.append(tid)
-
-    def getSerialBefore(self, oid, tid):
-        """
-        Get the first tid in cache which value is lower that given tid.
-        """
-        # WARNING: return-intensive to save on indentation
-        oid_list = self._oid_dict.get(oid)
-        if oid_list is None:
-            # Unknown oid
-            return None
-        for result in oid_list:
-            if result < tid:
-                # Candidate found
-                break
-        else:
-            # No candidate in cache.
-            return None
-        # Check if there is a chance that an intermediate revision would
-        # exist, while missing from cache.
-        try:
-            inv_tid_list = self._invalidated[oid]
-        except KeyError:
-            return result
-        # Remember: inv_tid_list is sorted in ascending order.
-        for inv_tid in inv_tid_list:
-            if tid < inv_tid:
-                # We don't care about invalidations past requested TID.
-                break
-            elif result < inv_tid < tid:
-                # An invalidation was received between candidate revision,
-                # and before requested TID: there is a matching revision we
-                # don't know of, so we cannot answer.
-                return None
-        return result
-
-    def getLatestSerial(self, oid):
-        """
-        Get the latest tid for given object.
-        """
-        result = self._oid_dict.get(oid)
-        if result is not None:
-            result = result[0]
-            try:
-                tid_list = self._invalidated[oid]
-            except KeyError:
-                pass
-            else:
-                if result < tid_list[-1]:
-                    # An invalidation happened from a transaction later than
-                    # our most recent view of this object, so we cannot answer.
-                    result = None
-        return result
-
-    def getSerialList(self, oid):
-        """
-        Get the list of all serials cache knows about for given object.
-        """
-        return self._oid_dict.get(oid, [])[:]
-
 class Application(object):
     """The client node application."""
 

Added: trunk/neo/client/mq_index.py
==============================================================================
--- trunk/neo/client/mq_index.py (added)
+++ trunk/neo/client/mq_index.py [iso-8859-1] Fri Jan 21 17:30:07 2011
@@ -0,0 +1,152 @@
+#
+# Copyright (C) 2010-2011  Nexedi SA
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+from neo.client.mq import MQIndex
+
+class RevisionIndex(MQIndex):
+    """
+    This cache index allows accessing a specifig revision of a cached object.
+    It requires cache key to be a 2-tuple, composed of oid and revision.
+
+    Note: it is expected that rather few revisions are held in cache, with few
+    lookups for old revisions, so they are held in a simple sorted list
+    Note2: all methods here must be called with cache lock acquired.
+    """
+    def __init__(self):
+        # key: oid
+        # value: tid list, from highest to lowest
+        self._oid_dict = {}
+        # key: oid
+        # value: tid list, from lowest to highest
+        self._invalidated = {}
+
+    def clear(self):
+        self._oid_dict.clear()
+        self._invalidated.clear()
+
+    def remove(self, key):
+        oid_dict = self._oid_dict
+        oid, tid = key
+        tid_list = oid_dict[oid]
+        tid_list.remove(tid)
+        if not tid_list:
+            # No more serial known for this object, drop entirely
+            del oid_dict[oid]
+            self._invalidated.pop(oid, None)
+
+    def add(self, key):
+        oid_dict = self._oid_dict
+        oid, tid = key
+        try:
+            serial_list = oid_dict[oid]
+        except KeyError:
+            serial_list = oid_dict[oid] = []
+        else:
+            assert tid not in serial_list
+        if not(serial_list) or tid > serial_list[0]:
+            serial_list.insert(0, tid)
+        else:
+            serial_list.insert(0, tid)
+            serial_list.sort(reverse=True)
+        invalidated = self._invalidated
+        try:
+            tid_list = invalidated[oid]
+        except KeyError:
+            pass
+        else:
+            try:
+                tid_list.remove(tid)
+            except ValueError:
+                pass
+            else:
+                if not tid_list:
+                    del invalidated[oid]
+
+    def invalidate(self, oid_list, tid):
+        """
+        Mark object invalidated by given transaction.
+        Must be called with increasing TID values (which is standard for
+        ZODB).
+        """
+        invalidated = self._invalidated
+        oid_dict = self._oid_dict
+        for oid in (x for x in oid_list if x in oid_dict):
+            try:
+                tid_list = invalidated[oid]
+            except KeyError:
+                tid_list = invalidated[oid] = []
+            assert not tid_list or tid > tid_list[-1], (dump(oid), dump(tid),
+                dump(tid_list[-1]))
+            tid_list.append(tid)
+
+    def getSerialBefore(self, oid, tid):
+        """
+        Get the first tid in cache which value is lower that given tid.
+        """
+        # WARNING: return-intensive to save on indentation
+        oid_list = self._oid_dict.get(oid)
+        if oid_list is None:
+            # Unknown oid
+            return None
+        for result in oid_list:
+            if result < tid:
+                # Candidate found
+                break
+        else:
+            # No candidate in cache.
+            return None
+        # Check if there is a chance that an intermediate revision would
+        # exist, while missing from cache.
+        try:
+            inv_tid_list = self._invalidated[oid]
+        except KeyError:
+            return result
+        # Remember: inv_tid_list is sorted in ascending order.
+        for inv_tid in inv_tid_list:
+            if tid < inv_tid:
+                # We don't care about invalidations past requested TID.
+                break
+            elif result < inv_tid < tid:
+                # An invalidation was received between candidate revision,
+                # and before requested TID: there is a matching revision we
+                # don't know of, so we cannot answer.
+                return None
+        return result
+
+    def getLatestSerial(self, oid):
+        """
+        Get the latest tid for given object.
+        """
+        result = self._oid_dict.get(oid)
+        if result is not None:
+            result = result[0]
+            try:
+                tid_list = self._invalidated[oid]
+            except KeyError:
+                pass
+            else:
+                if result < tid_list[-1]:
+                    # An invalidation happened from a transaction later than
+                    # our most recent view of this object, so we cannot answer.
+                    result = None
+        return result
+
+    def getSerialList(self, oid):
+        """
+        Get the list of all serials cache knows about for given object.
+        """
+        return self._oid_dict.get(oid, [])[:]
+




More information about the Neo-report mailing list