[Neo-report] r2436 vincent - in /trunk/neo: storage/ storage/handlers/ tests/storage/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Nov 8 16:09:15 CET 2010


Author: vincent
Date: Mon Nov  8 16:09:14 2010
New Revision: 2436

Log:
Turn critical_tid_dict into a list.

This requires explicitly collecting garbage if we get disconnected from
primary master.

Modified:
    trunk/neo/storage/app.py
    trunk/neo/storage/handlers/master.py
    trunk/neo/storage/replicator.py
    trunk/neo/tests/storage/testMasterHandler.py
    trunk/neo/tests/storage/testReplicator.py

Modified: trunk/neo/storage/app.py
==============================================================================
--- trunk/neo/storage/app.py [iso-8859-1] (original)
+++ trunk/neo/storage/app.py [iso-8859-1] Mon Nov  8 16:09:14 2010
@@ -201,6 +201,7 @@ class Application(object):
             except OperationFailure, msg:
                 neo.logging.error('operation stopped: %s', msg)
             except PrimaryFailure, msg:
+                self.replicator.masterLost()
                 neo.logging.error('primary master is down: %s', msg)
                 self.master_node = None
 

Modified: trunk/neo/storage/handlers/master.py
==============================================================================
--- trunk/neo/storage/handlers/master.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/master.py [iso-8859-1] Mon Nov  8 16:09:14 2010
@@ -25,7 +25,7 @@ class MasterOperationHandler(BaseMasterH
     """ This handler is used for the primary master """
 
     def answerLastIDs(self, conn, loid, ltid, lptid):
-        self.app.replicator.setCriticalTID(conn.getUUID(), ltid)
+        self.app.replicator.setCriticalTID(ltid)
 
     def answerUnfinishedTransactions(self, conn, tid_list):
         self.app.replicator.setUnfinishedTIDList(tid_list)

Modified: trunk/neo/storage/replicator.py
==============================================================================
--- trunk/neo/storage/replicator.py [iso-8859-1] (original)
+++ trunk/neo/storage/replicator.py [iso-8859-1] Mon Nov  8 16:09:14 2010
@@ -120,7 +120,7 @@ class Replicator(object):
     # new_partition_dict
     #   outdated partitions for which no critical tid was asked to primary
     #   master yet
-    # critical_tid_dict
+    # critical_tid_list
     #   outdated partitions for which a critical tid was asked to primary
     #   master, but not answered so far
     # partition_dict
@@ -149,11 +149,19 @@ class Replicator(object):
     def __init__(self, app):
         self.app = app
         self.new_partition_dict = {}
-        self.critical_tid_dict = {}
+        self.critical_tid_list = []
         self.partition_dict = {}
         self.task_list = []
         self.task_dict = {}
 
+    def masterLost(self):
+        """
+        When connection to primary master is lost, stop waiting for unfinished
+        transactions.
+        """
+        self.critical_tid_list = []
+        self.waiting_for_unfinished_tids = False
+
     def populate(self):
         """
         Populate partitions to replicate. Must be called when partition
@@ -161,7 +169,6 @@ class Replicator(object):
         Implies a reset.
         """
         self.new_partition_dict = self._getOutdatedPartitionList()
-        self.critical_tid_dict = {}
         self.partition_dict = {}
         self.reset()
 
@@ -171,7 +178,6 @@ class Replicator(object):
         self.task_dict = {}
         self.current_partition = None
         self.current_connection = None
-        self.waiting_for_unfinished_tids = False
         self.unfinished_tid_list = None
         self.replication_done = True
 
@@ -203,24 +209,17 @@ class Replicator(object):
     def isCurrentConnection(self, conn):
         return self.current_connection is conn
 
-    def setCriticalTID(self, uuid, tid):
+    def setCriticalTID(self, tid):
         """This is a callback from MasterOperationHandler."""
-        try:
-            partition_list = self.critical_tid_dict.pop(uuid)
-        except KeyError:
-            neo.logging.debug("setCriticalTID raised KeyError for %s" %
-                    (dump(uuid), ))
-        else:
-            neo.logging.debug('setting critical TID %s to %s', dump(tid),
-                         ', '.join([str(p.getRID()) for p in partition_list]))
-            for partition in partition_list:
-                partition.setCriticalTID(tid)
+        neo.logging.debug('setting critical TID %s to %s', dump(tid),
+            ', '.join([str(p.getRID()) for p in self.critical_tid_list]))
+        for partition in self.critical_tid_list:
+            partition.setCriticalTID(tid)
+        self.critical_tid_list = []
 
     def _askCriticalTID(self):
-        conn = self.app.master_conn
-        conn.ask(Packets.AskLastIDs())
-        uuid = conn.getUUID()
-        self.critical_tid_dict[uuid] = self.new_partition_dict.values()
+        self.app.master_conn.ask(Packets.AskLastIDs())
+        self.critical_tid_list.extend(self.new_partition_dict.values())
         self.partition_dict.update(self.new_partition_dict)
         self.new_partition_dict = {}
 

Modified: trunk/neo/tests/storage/testMasterHandler.py
==============================================================================
--- trunk/neo/tests/storage/testMasterHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testMasterHandler.py [iso-8859-1] Mon Nov  8 16:09:14 2010
@@ -180,7 +180,7 @@ class StorageMasterHandlerTests(NeoUnitT
         )
         calls = self.app.replicator.mockGetNamedCalls('setCriticalTID')
         self.assertEquals(len(calls), 1)
-        calls[0].checkArgs(conn.getUUID(), INVALID_TID)
+        calls[0].checkArgs(INVALID_TID)
 
     def test_31_answerUnfinishedTransactions(self):
         # set unfinished TID on replicator

Modified: trunk/neo/tests/storage/testReplicator.py
==============================================================================
--- trunk/neo/tests/storage/testReplicator.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testReplicator.py [iso-8859-1] Mon Nov  8 16:09:14 2010
@@ -73,14 +73,13 @@ class StorageReplicatorTests(NeoUnitTest
 
     def test_setCriticalTID(self):
         replicator = Replicator(None)
-        master_uuid = self.getNewUUID()
         partition_list = [Partition(0), Partition(5)]
-        replicator.critical_tid_dict = {master_uuid: partition_list}
+        replicator.critical_tid_list = partition_list[:]
         critical_tid = self.getNextTID()
         for partition in partition_list:
             self.assertEqual(partition.getCriticalTID(), None)
-        replicator.setCriticalTID(master_uuid, critical_tid)
-        self.assertEqual(replicator.critical_tid_dict, {})
+        replicator.setCriticalTID(critical_tid)
+        self.assertEqual(replicator.critical_tid_list, [])
         for partition in partition_list:
             self.assertEqual(partition.getCriticalTID(), critical_tid)
 
@@ -154,7 +153,7 @@ class StorageReplicatorTests(NeoUnitTest
         self.checkNoPacketSent(app.master_conn)
         self.assertTrue(replicator.waiting_for_unfinished_tids)
         # Send answers (garanteed to happen in this order)
-        replicator.setCriticalTID(master_uuid, critical_tid)
+        replicator.setCriticalTID(critical_tid)
         act()
         self.checkNoPacketSent(app.master_conn)
         self.assertTrue(replicator.waiting_for_unfinished_tids)





More information about the Neo-report mailing list