[Neo-report] r1860 vincent - in /trunk/neo: storage/database/ storage/handlers/ tests/stor...

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Feb 25 15:08:36 CET 2010


Author: vincent
Date: Thu Feb 25 15:08:36 2010
New Revision: 1860

Log:
Split methods listing transaction history for client and storage.

This fixes undo support in client without changing the way replication is
implemented.

Modified:
    trunk/neo/storage/database/manager.py
    trunk/neo/storage/database/mysqldb.py
    trunk/neo/storage/handlers/__init__.py
    trunk/neo/storage/handlers/client.py
    trunk/neo/storage/handlers/storage.py
    trunk/neo/tests/storage/testStorageHandler.py
    trunk/neo/tests/storage/testStorageMySQLdb.py

Modified: trunk/neo/storage/database/manager.py
==============================================================================
--- trunk/neo/storage/database/manager.py [iso-8859-1] (original)
+++ trunk/neo/storage/database/manager.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -269,6 +269,13 @@
         raise NotImplementedError
 
     def getTIDList(self, offset, length, num_partitions, partition_list):
+        """Return a list of TIDs in ascending order from an offset,
+        at most the specified length. The list of partitions are passed
+        to filter out non-applicable TIDs."""
+        raise NotImplementedError
+
+    def getReplicationTIDList(self, offset, length, num_partitions,
+        partition_list):
         """Return a list of TIDs in descending order from an offset,
         at most the specified length. The list of partitions are passed
         to filter out non-applicable TIDs."""

Modified: trunk/neo/storage/database/mysqldb.py
==============================================================================
--- trunk/neo/storage/database/mysqldb.py [iso-8859-1] (original)
+++ trunk/neo/storage/database/mysqldb.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -454,6 +454,15 @@
     def getTIDList(self, offset, length, num_partitions, partition_list):
         q = self.query
         r = q("""SELECT tid FROM trans WHERE MOD(tid, %d) in (%s)
+                    ORDER BY tid DESC LIMIT %d,%d""" \
+                % (num_partitions,
+                   ','.join([str(p) for p in partition_list]),
+                   offset, length))
+        return [util.p64(t[0]) for t in r]
+
+    def getReplicationTIDList(self, offset, length, num_partitions, partition_list):
+        q = self.query
+        r = q("""SELECT tid FROM trans WHERE MOD(tid, %d) in (%s)
                     ORDER BY tid ASC LIMIT %d,%d""" \
                 % (num_partitions,
                    ','.join([str(p) for p in partition_list]),

Modified: trunk/neo/storage/handlers/__init__.py
==============================================================================
--- trunk/neo/storage/handlers/__init__.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/__init__.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -62,22 +62,6 @@
 class BaseClientAndStorageOperationHandler(EventHandler):
     """ Accept requests common to client and storage nodes """
 
-    def askTIDs(self, conn, first, last, partition):
-        # This method is complicated, because I must return TIDs only
-        # about usable partitions assigned to me.
-        if first >= last:
-            raise protocol.ProtocolError('invalid offsets')
-
-        app = self.app
-        if partition == protocol.INVALID_PARTITION:
-            partition_list = app.pt.getAssignedPartitionList(app.uuid)
-        else:
-            partition_list = [partition]
-
-        tid_list = app.dm.getTIDList(first, last - first,
-                             app.pt.getPartitions(), partition_list)
-        conn.answer(Packets.AnswerTIDs(tid_list))
-
     def askObjectHistory(self, conn, oid, first, last):
         if first >= last:
             raise protocol.ProtocolError( 'invalid offsets')

Modified: trunk/neo/storage/handlers/client.py
==============================================================================
--- trunk/neo/storage/handlers/client.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/client.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -15,6 +15,7 @@
 # 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 import protocol
 from neo.protocol import Packets
 from neo.storage.handlers import BaseClientAndStorageOperationHandler
 from neo.storage.transactions import ConflictError, DelayedError
@@ -59,3 +60,19 @@
             self.app.queueEvent(self.askStoreObject, conn, oid, serial,
                     compression, checksum, data, tid)
 
+    def askTIDs(self, conn, first, last, partition):
+        # This method is complicated, because I must return TIDs only
+        # about usable partitions assigned to me.
+        if first >= last:
+            raise protocol.ProtocolError('invalid offsets')
+
+        app = self.app
+        if partition == protocol.INVALID_PARTITION:
+            partition_list = app.pt.getAssignedPartitionList(app.uuid)
+        else:
+            partition_list = [partition]
+
+        tid_list = app.dm.getTIDList(first, last - first,
+                             app.pt.getPartitions(), partition_list)
+        conn.answer(Packets.AnswerTIDs(tid_list))
+

Modified: trunk/neo/storage/handlers/storage.py
==============================================================================
--- trunk/neo/storage/handlers/storage.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/storage.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -44,3 +44,19 @@
                                      app.pt.getPartitions(), partition_list)
         conn.answer(Packets.AnswerOIDs(oid_list))
 
+    def askTIDs(self, conn, first, last, partition):
+        # This method is complicated, because I must return TIDs only
+        # about usable partitions assigned to me.
+        if first >= last:
+            raise protocol.ProtocolError('invalid offsets')
+
+        app = self.app
+        if partition == protocol.INVALID_PARTITION:
+            partition_list = app.pt.getAssignedPartitionList(app.uuid)
+        else:
+            partition_list = [partition]
+
+        tid_list = app.dm.getReplicationTIDList(first, last - first,
+                             app.pt.getPartitions(), partition_list)
+        conn.answer(Packets.AnswerTIDs(tid_list))
+

Modified: trunk/neo/tests/storage/testStorageHandler.py
==============================================================================
--- trunk/neo/tests/storage/testStorageHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testStorageHandler.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -114,15 +114,15 @@
         conn = Mock({})
         self.checkProtocolErrorRaised(self.operation.askTIDs, conn, 1, 1, None)
         self.assertEquals(len(app.pt.mockGetNamedCalls('getCellList')), 0)
-        self.assertEquals(len(app.dm.mockGetNamedCalls('getTIDList')), 0)
+        self.assertEquals(len(app.dm.mockGetNamedCalls('getReplicationTIDList')), 0)
 
     def test_25_askTIDs2(self):
         # well case => answer
         conn = Mock({})
-        self.app.dm = Mock({'getTIDList': (INVALID_TID, )})
+        self.app.dm = Mock({'getReplicationTIDList': (INVALID_TID, )})
         self.app.pt = Mock({'getPartitions': 1})
         self.operation.askTIDs(conn, 1, 2, 1)
-        calls = self.app.dm.mockGetNamedCalls('getTIDList')
+        calls = self.app.dm.mockGetNamedCalls('getReplicationTIDList')
         self.assertEquals(len(calls), 1)
         calls[0].checkArgs(1, 1, 1, [1, ])
         self.checkAnswerTids(conn)
@@ -131,7 +131,7 @@
         # invalid partition => answer usable partitions
         conn = Mock({})
         cell = Mock({'getUUID':self.app.uuid})
-        self.app.dm = Mock({'getTIDList': (INVALID_TID, )})
+        self.app.dm = Mock({'getReplicationTIDList': (INVALID_TID, )})
         self.app.pt = Mock({
             'getCellList': (cell, ), 
             'getPartitions': 1,
@@ -139,7 +139,7 @@
         })
         self.operation.askTIDs(conn, 1, 2, INVALID_PARTITION)
         self.assertEquals(len(self.app.pt.mockGetNamedCalls('getAssignedPartitionList')), 1)
-        calls = self.app.dm.mockGetNamedCalls('getTIDList')
+        calls = self.app.dm.mockGetNamedCalls('getReplicationTIDList')
         self.assertEquals(len(calls), 1)
         calls[0].checkArgs(1, 1, 1, [0, ])
         self.checkAnswerTids(conn)

Modified: trunk/neo/tests/storage/testStorageMySQLdb.py
==============================================================================
--- trunk/neo/tests/storage/testStorageMySQLdb.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testStorageMySQLdb.py [iso-8859-1] Thu Feb 25 15:08:36 2010
@@ -620,16 +620,16 @@
                 False)""" % (u64(tid)))
         # get all tids for all partitions
         result = self.db.getTIDList(0, 4, 2, (0, 1))
-        self.assertEquals(result, [tid1, tid2, tid3, tid4])
+        self.assertEquals(result, [tid4, tid3, tid2, tid1])
         # get all tids but from the second with a limit a two
         result = self.db.getTIDList(1, 2, 2, (0, 1))
-        self.assertEquals(result, [tid2, tid3])
+        self.assertEquals(result, [tid3, tid2])
         # get all tids for the first partition
         result = self.db.getTIDList(0, 2, 2, (0, ))
-        self.assertEquals(result, [tid1, tid3])
+        self.assertEquals(result, [tid3, tid1])
         # get all tids for the second partition with a limit of one
         result = self.db.getTIDList(0, 1, 2, (1, ))
-        self.assertEquals(result, [tid2])
+        self.assertEquals(result, [tid4])
         # get all tids for the second partition with an offset of 3 > nothing
         result = self.db.getTIDList(3, 2, 2, (1, ))
         self.assertEquals(result, [])





More information about the Neo-report mailing list