[Neo-report] r2320 gregory - in /trunk/neo: ./ master/ storage/database/ storage/handlers/...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Oct 1 16:11:38 CEST 2010


Author: gregory
Date: Fri Oct  1 16:11:38 2010
New Revision: 2320

Log:
Give oid_list to deleteTransaction to take advantages of indexes.

Modified:
    trunk/neo/handler.py
    trunk/neo/master/verification.py
    trunk/neo/protocol.py
    trunk/neo/storage/database/manager.py
    trunk/neo/storage/database/mysqldb.py
    trunk/neo/storage/handlers/verification.py
    trunk/neo/tests/storage/testStorageMySQLdb.py
    trunk/neo/tests/storage/testVerificationHandler.py
    trunk/neo/tests/testProtocol.py

Modified: trunk/neo/handler.py
==============================================================================
--- trunk/neo/handler.py [iso-8859-1] (original)
+++ trunk/neo/handler.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -190,7 +190,7 @@ class EventHandler(object):
     def answerObjectPresent(self, conn, oid, tid):
         raise UnexpectedPacketError
 
-    def deleteTransaction(self, conn, tid):
+    def deleteTransaction(self, conn, tid, oid_list):
         raise UnexpectedPacketError
 
     def commitTransaction(self, conn, tid):

Modified: trunk/neo/master/verification.py
==============================================================================
--- trunk/neo/master/verification.py [iso-8859-1] (original)
+++ trunk/neo/master/verification.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -134,7 +134,7 @@ class VerificationManager(BaseServiceHan
         for tid in self._tid_set:
             uuid_set = self.verifyTransaction(tid)
             if uuid_set is None:
-                packet = Packets.DeleteTransaction(tid)
+                packet = Packets.DeleteTransaction(tid, self._oid_set or [])
                 # Make sure that no node has this transaction.
                 for node in self.app.nm.getIdentifiedList():
                     if node.isStorage():

Modified: trunk/neo/protocol.py
==============================================================================
--- trunk/neo/protocol.py [iso-8859-1] (original)
+++ trunk/neo/protocol.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -697,12 +697,27 @@ class DeleteTransaction(Packet):
     """
     Delete a transaction. PM -> S.
     """
-    def _encode(self, tid):
-        return _encodeTID(tid)
+    _header_format = '!8sL'
+    _list_entry_format = '8s'
+    _list_entry_len = calcsize(_list_entry_format)
+
+    def _encode(self, tid, oid_list):
+        body = [pack(self._header_format, tid, len(oid_list))]
+        body.extend(oid_list)
+        return ''.join(body)
 
     def _decode(self, body):
-        (tid, ) = unpack('8s', body)
-        return (_decodeTID(tid), )
+        offset = self._header_len
+        (tid, n) = unpack(self._header_format, body[:offset])
+        oid_list = []
+        list_entry_format = self._list_entry_format
+        list_entry_len = self._list_entry_len
+        for _ in xrange(n):
+            next_offset = offset + list_entry_len
+            oid = unpack(list_entry_format, body[offset:next_offset])[0]
+            offset = next_offset
+            oid_list.append(oid)
+        return (tid, oid_list)
 
 class CommitTransaction(Packet):
     """

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] Fri Oct  1 16:11:38 2010
@@ -380,10 +380,9 @@ class DatabaseManager(object):
         temporarily data to a finished area."""
         raise NotImplementedError
 
-    def deleteTransaction(self, tid, all = False):
-        """Delete a transaction specified by a given ID from a temporarily
-        area. If all is true, it must be deleted even from a finished
-        area."""
+    def deleteTransaction(self, tid, oid_list):
+        """Delete a transaction and its content specified by a given ID and
+        an oid list"""
         raise NotImplementedError
 
     def deleteObject(self, oid, serial=None):

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] Fri Oct  1 16:11:38 2010
@@ -500,18 +500,27 @@ class MySQLDatabaseManager(DatabaseManag
             raise
         self.commit()
 
-    def deleteTransaction(self, tid, all = False):
+    def deleteTransaction(self, tid, oid_list):
         q = self.query
-        tid = util.u64(tid)
+        u64 = util.u64
+        tid = u64(tid)
+        getPartition = self.getPartition
         self.begin()
         try:
             q("""DELETE FROM tobj WHERE serial = %d""" % tid)
             q("""DELETE FROM ttrans WHERE tid = %d""" % tid)
-            if all:
-                # Note that this can be very slow.
-                q("""DELETE FROM obj WHERE serial = %d""" % tid)
-                q("""DELETE FROM trans WHERE partition = %d AND tid = %d""" %
-                        (self.getPartition(tid), tid))
+            q("""DELETE FROM trans WHERE partition = %d AND tid = %d""" %
+                (self.getPartition(tid), tid))
+            # delete from obj using indexes
+            for oid in oid_list:
+                oid = u64(oid)
+                partition = getPartition(oid)
+                q("DELETE FROM obj WHERE partition=%(partition)d "
+                        "AND oid = %(oid)d AND serial = %(serial)d" % {
+                    'partition': partition,
+                    'oid': oid,
+                    'serial': tid,
+                })
         except:
             self.rollback()
             raise

Modified: trunk/neo/storage/handlers/verification.py
==============================================================================
--- trunk/neo/storage/handlers/verification.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/verification.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -82,8 +82,8 @@ class VerificationHandler(BaseMasterHand
                           '%s:%s do not exist' % (dump(oid), dump(tid)))
         conn.answer(p)
 
-    def deleteTransaction(self, conn, tid):
-        self.app.dm.deleteTransaction(tid, all = True)
+    def deleteTransaction(self, conn, tid, oid_list):
+        self.app.dm.deleteTransaction(tid, oid_list)
 
     def commitTransaction(self, conn, tid):
         self.app.dm.finishTransaction(tid)

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] Fri Oct  1 16:11:38 2010
@@ -429,17 +429,11 @@ class StorageMySQSLdbTests(NeoTestBase):
         tid1, tid2 = self.getTIDs(2)
         txn1, objs1 = self.getTransaction([oid1])
         txn2, objs2 = self.getTransaction([oid2])
-        # delete only from temporary tables
         self.db.storeTransaction(tid1, objs1, txn1)
         self.db.storeTransaction(tid2, objs2, txn2)
         self.db.finishTransaction(tid1)
-        self.db.deleteTransaction(tid1)
-        self.db.deleteTransaction(tid2)
-        result = self.db.getTransaction(tid1, True)
-        self.assertEqual(result, ([oid1], 'user', 'desc', 'ext', False))
-        self.assertEqual(self.db.getTransaction(tid2, True), None)
-        # delete from all
-        self.db.deleteTransaction(tid1, True)
+        self.db.deleteTransaction(tid1, [oid1])
+        self.db.deleteTransaction(tid2, [oid2])
         self.assertEqual(self.db.getTransaction(tid1, True), None)
         self.assertEqual(self.db.getTransaction(tid2, True), None)
 

Modified: trunk/neo/tests/storage/testVerificationHandler.py
==============================================================================
--- trunk/neo/tests/storage/testVerificationHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testVerificationHandler.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -240,11 +240,12 @@ class StorageVerificationHandlerTests(Ne
             'deleteTransaction': None,
         })
         conn = self.getMasterConnection()
+        oid_list = [self.getOID(1), self.getOID(2)]
         tid = p64(1)
-        self.verification.deleteTransaction(conn, tid)
+        self.verification.deleteTransaction(conn, tid, oid_list)
         call_list = self.app.dm.mockGetNamedCalls('deleteTransaction')
         self.assertEqual(len(call_list), 1)
-        call_list[0].checkArgs(tid, all=True)
+        call_list[0].checkArgs(tid, oid_list)
 
     def test_17_commitTransaction(self):
         # commit a transaction

Modified: trunk/neo/tests/testProtocol.py
==============================================================================
--- trunk/neo/tests/testProtocol.py [iso-8859-1] (original)
+++ trunk/neo/tests/testProtocol.py [iso-8859-1] Fri Oct  1 16:11:38 2010
@@ -225,10 +225,10 @@ class ProtocolTests(NeoTestBase):
 
     def test_30_deleteTransaction(self):
         tid = self.getNextTID()
-        p = Packets.DeleteTransaction(tid)
+        oid_list = [self.getOID(1), self.getOID(2)]
+        p = Packets.DeleteTransaction(tid, oid_list)
         self.assertEqual(p.getType(), Packets.DeleteTransaction)
-        ptid = p.decode()[0]
-        self.assertEqual(ptid, tid)
+        self.assertEqual(p.decode(), (tid, oid_list))
 
     def test_31_commitTransaction(self):
         tid = self.getNextTID()





More information about the Neo-report mailing list