[Neo-report] r2466 vincent - in /trunk/neo: storage/handlers/ tests/storage/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Nov 17 14:05:31 CET 2010
Author: vincent
Date: Wed Nov 17 14:05:31 2010
New Revision: 2466
Log:
Fix case where last replicated chunk of a partition is empty.
Modified:
trunk/neo/storage/handlers/replication.py
trunk/neo/tests/storage/testReplicationHandler.py
Modified: trunk/neo/storage/handlers/replication.py
==============================================================================
--- trunk/neo/storage/handlers/replication.py [iso-8859-1] (original)
+++ trunk/neo/storage/handlers/replication.py [iso-8859-1] Wed Nov 17 14:05:31 2010
@@ -115,10 +115,13 @@ class ReplicationHandler(EventHandler):
deleteTransaction = app.dm.deleteTransaction
for tid in extra_tid_set:
deleteTransaction(tid)
- missing_tid_set = tid_set - my_tid_set
- for tid in missing_tid_set:
- ask(Packets.AskTransactionInformation(tid), timeout=300)
- ask(self._doAskCheckTIDRange(add64(tid_list[-1], 1), RANGE_LENGTH))
+ if tid_list:
+ missing_tid_set = tid_set - my_tid_set
+ for tid in missing_tid_set:
+ ask(Packets.AskTransactionInformation(tid), timeout=300)
+ ask(self._doAskCheckTIDRange(add64(tid_list[-1], 1), RANGE_LENGTH))
+ else:
+ ask(self._doAskCheckSerialRange(ZERO_OID, ZERO_TID))
@checkConnectionIsReplicatorConnection
def answerTransactionInformation(self, conn, tid,
@@ -135,30 +138,36 @@ class ReplicationHandler(EventHandler):
deleteObject = app.dm.deleteObject
my_object_dict = app.replicator.getObjectHistoryFromResult()
object_set = set()
- max_oid = max(object_dict.iterkeys())
- max_serial = max(object_dict[max_oid])
- for oid, serial_list in object_dict.iteritems():
- for serial in serial_list:
- object_set.add((oid, serial))
+ if object_dict:
+ max_oid = max(object_dict.iterkeys())
+ max_serial = max(object_dict[max_oid])
+ for oid, serial_list in object_dict.iteritems():
+ for serial in serial_list:
+ object_set.add((oid, serial))
+ else:
+ max_oid = None
my_object_set = set()
for oid, serial_list in my_object_dict.iteritems():
- if oid > max_oid:
- continue
- elif oid == max_oid:
- filter = lambda x: x <= max_serial
- else:
- filter = lambda x: True
+ filter = lambda x: True
+ if max_oid is not None:
+ if oid > max_oid:
+ continue
+ elif oid == max_oid:
+ filter = lambda x: x <= max_serial
for serial in serial_list:
if filter(serial):
my_object_set.add((oid, serial))
extra_object_set = my_object_set - object_set
for oid, serial in extra_object_set:
deleteObject(oid, serial)
- missing_object_set = object_set - my_object_set
- for oid, serial in missing_object_set:
- ask(Packets.AskObject(oid, serial, None), timeout=300)
- ask(self._doAskCheckSerialRange(max_oid, add64(max_serial, 1),
- RANGE_LENGTH))
+ if object_dict:
+ missing_object_set = object_set - my_object_set
+ for oid, serial in missing_object_set:
+ ask(Packets.AskObject(oid, serial, None), timeout=300)
+ ask(self._doAskCheckSerialRange(max_oid, add64(max_serial, 1),
+ RANGE_LENGTH))
+ else:
+ self.app.replicator.setReplicationDone()
@checkConnectionIsReplicatorConnection
def answerObject(self, conn, oid, serial_start,
Modified: trunk/neo/tests/storage/testReplicationHandler.py
==============================================================================
--- trunk/neo/tests/storage/testReplicationHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/storage/testReplicationHandler.py [iso-8859-1] Wed Nov 17 14:05:31 2010
@@ -206,6 +206,13 @@ class StorageReplicationHandlerTests(Neo
calls = app.dm.mockGetNamedCalls('deleteTransaction')
self.assertEqual(len(calls), 1)
calls[0].checkArgs(tid_list[0])
+ # Peer has no transaction above requested min, go on with object
+ # replication after deleting local transactions
+ conn = self.getFakeConnection()
+ known_tid_list = [tid_list[0], ]
+ app = self.getApp(conn=conn, tid_result=known_tid_list)
+ ReplicationHandler(app).answerTIDsFrom(conn, [])
+ self.checkAskPacket(conn, Packets.AskCheckSerialRange)
def test_answerTransactionInformation(self):
conn = self.getFakeConnection()
@@ -268,6 +275,22 @@ class StorageReplicationHandlerTests(Neo
(oid_4, tid_list[4]),
))
self.assertEqual(actual_deletes, expected_deletes)
+ # Peer has no object above requested min, replication is over for this
+ # transaction once we deleted local content.
+ oid_dict = FakeDict(())
+ conn = self.getFakeConnection()
+ app = self.getApp(conn=conn, history_result={
+ oid_1: [tid_list[2]],
+ })
+ ReplicationHandler(app).answerObjectHistoryFrom(conn, oid_dict)
+ calls = app.dm.mockGetNamedCalls('deleteObject')
+ actual_deletes = set(((x.getParam(0), x.getParam(1)) for x in calls))
+ expected_deletes = set((
+ (oid_1, tid_list[2]),
+ ))
+ self.assertEqual(actual_deletes, expected_deletes)
+ calls = app.replicator.mockGetNamedCalls('setReplicationDone')
+ self.assertEqual(len(calls), 1)
def test_answerObject(self):
conn = self.getFakeConnection()
More information about the Neo-report
mailing list