Skip to content

Commit 73e2275

Browse files
authored
Fix purge_deleted() method in memory backend (#3520)
* Reproduce memory backend issue in a test * Fix backend implementation * Do not include timestamp in deleted tombstones count * fix test
1 parent 76f6783 commit 73e2275

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

kinto/core/storage/memory.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,13 +288,26 @@ def purge_deleted(
288288
modified_field=DEFAULT_MODIFIED_FIELD,
289289
):
290290
parent_id_match = re.compile(parent_id.replace("*", ".*"))
291-
by_parent_id = {
291+
292+
timestamps_by_parent_id = {
292293
pid: resources
293-
for pid, resources in self._cemetery.items()
294+
for pid, resources in self._timestamps.items()
294295
if parent_id_match.match(pid)
295296
}
297+
if resource_name is not None:
298+
for pid, resources in timestamps_by_parent_id.items():
299+
del self._timestamps[pid][resource_name]
300+
else:
301+
for pid, resources in timestamps_by_parent_id.items():
302+
del self._timestamps[pid]
303+
296304
num_deleted = 0
297-
for pid, resources in by_parent_id.items():
305+
tombstones_by_parent_id = {
306+
pid: resources
307+
for pid, resources in self._cemetery.items()
308+
if parent_id_match.match(pid)
309+
}
310+
for pid, resources in tombstones_by_parent_id.items():
298311
if resource_name is not None:
299312
resources = {resource_name: resources[resource_name]}
300313
for resource, resource_objects in resources.items():

kinto/core/storage/testing.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,9 @@ def test_purge_deleted_removes_timestamps_by_parent_id(self):
12961296
self.create_object(parent_id="/abc/a", resource_name="c")
12971297
self.create_object(parent_id="/efg", resource_name="c")
12981298

1299+
all_timestamps = self.storage.all_resources_timestamps(resource_name="c")
1300+
self.assertEqual(set(all_timestamps.keys()), {"/abc/a", "/efg"})
1301+
12991302
before1 = self.storage.resource_timestamp(parent_id="/abc/a", resource_name="c")
13001303
# Different parent_id with object.
13011304
before2 = self.storage.resource_timestamp(parent_id="/efg", resource_name="c")
@@ -1305,11 +1308,15 @@ def test_purge_deleted_removes_timestamps_by_parent_id(self):
13051308
self.storage.delete_all(parent_id="/abc/*", resource_name=None, with_deleted=False)
13061309
self.storage.purge_deleted(parent_id="/abc/*", resource_name=None)
13071310

1311+
all_timestamps = self.storage.all_resources_timestamps(resource_name="c")
1312+
self.assertEqual(set(all_timestamps.keys()), {"/efg", "/ijk"})
1313+
1314+
time.sleep(0.002) # make sure we don't recreate timestamps at same msec.
13081315
after1 = self.storage.resource_timestamp(parent_id="/abc/a", resource_name="c")
13091316
after2 = self.storage.resource_timestamp(parent_id="/efg", resource_name="c")
13101317
after3 = self.storage.resource_timestamp(parent_id="/ijk", resource_name="c")
13111318

1312-
self.assertNotEqual(before1, after1)
1319+
self.assertNotEqual(before1, after1) # timestamp was removed, it will differ.
13131320
self.assertEqual(before2, after2)
13141321
self.assertEqual(before3, after3)
13151322

0 commit comments

Comments
 (0)