[Neo-report] r2440 vincent - in /trunk/neo: storage/handlers/ tests/storage/
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Nov 9 14:16:48 CET 2010
Author: vincent
Date: Tue Nov 9 14:16:47 2010
New Revision: 2440
Log:
Make replication support whole-object deletion.
This can happen if object creation was transactionally undone, and database
was packed.
Update test.
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] Tue Nov 9 14:16:47 2010
@@ -132,32 +132,31 @@ class ReplicationHandler(EventHandler):
def answerObjectHistoryFrom(self, conn, object_dict):
app = self.app
ask = conn.ask
- my_object_dict = app.replicator.getObjectHistoryFromResult()
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():
- # Check if I have objects, request those which I don't have.
- if oid in my_object_dict:
- # We must ignore extra serials we might have locally found for
- # last received oid, as they can just be present in our list
- # because we lacked some records (hence, we would have fetched
- # rows further than other node for the same number of rows).
- if oid == max_oid:
- my_serial_list = (x for x in my_object_dict[oid]
- if x <= max_serial)
- else:
- my_serial_list = my_object_dict[oid]
- my_serial_set = frozenset(my_serial_list)
- serial_set = frozenset(serial_list)
- extra_serial_set = my_serial_set - serial_set
- for serial in extra_serial_set:
- deleteObject(oid, serial)
- missing_serial_set = serial_set - my_serial_set
+ for serial in serial_list:
+ object_set.add((oid, serial))
+ 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:
- missing_serial_set = serial_list
- for serial in missing_serial_set:
- ask(Packets.AskObject(oid, serial, None), timeout=300)
+ filter = lambda x: True
+ 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))
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] Tue Nov 9 14:16:47 2010
@@ -223,11 +223,12 @@ class StorageReplicationHandlerTests(Neo
oid_2 = self.getOID(2)
oid_3 = self.getOID(3)
oid_4 = self.getOID(4)
+ oid_5 = self.getOID(5)
tid_list = [self.getOID(x) for x in xrange(7)]
oid_dict = FakeDict((
(oid_1, [tid_list[0], tid_list[1]]),
- (oid_2, [tid_list[3]]),
- (oid_3, [tid_list[5]]),
+ (oid_2, [tid_list[2], tid_list[3]]),
+ (oid_4, [tid_list[5]]),
))
flat_oid_list = []
for oid, serial_list in oid_dict.iteritems():
@@ -236,7 +237,7 @@ class StorageReplicationHandlerTests(Neo
app = self.getApp(conn=conn, history_result={})
# With no known OID/Serial
ReplicationHandler(app).answerObjectHistoryFrom(conn, oid_dict)
- self._checkPacketSerialList(conn, flat_oid_list, oid_3, tid_list[5],
+ self._checkPacketSerialList(conn, flat_oid_list, oid_4, tid_list[5],
app)
# With some known OID/Serials
# For test to be realist, history_result should contain the same
@@ -245,17 +246,23 @@ class StorageReplicationHandlerTests(Neo
conn = self.getFakeConnection()
app = self.getApp(conn=conn, history_result={
oid_1: [oid_dict[oid_1][0], ],
- oid_3: [tid_list[4], oid_dict[oid_3][0], tid_list[6]],
- oid_4: [tid_list[2], ],
+ oid_3: [tid_list[2]],
+ oid_4: [tid_list[4], oid_dict[oid_4][0], tid_list[6]],
+ oid_5: [tid_list[6]],
})
ReplicationHandler(app).answerObjectHistoryFrom(conn, oid_dict)
self._checkPacketSerialList(conn, (
(oid_1, oid_dict[oid_1][1]),
(oid_2, oid_dict[oid_2][0]),
- ), oid_3, tid_list[5], app)
+ (oid_2, oid_dict[oid_2][1]),
+ ), oid_4, tid_list[5], app)
calls = app.dm.mockGetNamedCalls('deleteObject')
- self.assertEqual(len(calls), 1)
- calls[0].checkArgs(oid_3, tid_list[4])
+ actual_deletes = set(((x.getParam(0), x.getParam(1)) for x in calls))
+ expected_deletes = set((
+ (oid_3, tid_list[2]),
+ (oid_4, tid_list[4]),
+ ))
+ self.assertEqual(actual_deletes, expected_deletes)
def test_answerObject(self):
conn = self.getFakeConnection()
More information about the Neo-report
mailing list