From 5f32b5666af961f5256221660a7356d467f66605 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Mon, 18 Jan 2021 21:03:22 +0100 Subject: [PATCH 1/2] deduplicate code of put and delete, no functional change --- src/borg/repository.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/borg/repository.py b/src/borg/repository.py index 091f2852c..62d7ccff0 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -1191,13 +1191,9 @@ class Repository: except KeyError: pass else: - self.segments[segment] -= 1 - size = self.io.read(segment, offset, id, read_data=False) - self.storage_quota_use -= size - self.compact[segment] += size - segment, size = self.io.write_delete(id) - self.compact[segment] += size - self.segments.setdefault(segment, 0) + # note: doing a delete first will do some bookkeeping, + # like updating the shadow_index, quota, ... + self._delete(id, segment, offset) segment, offset = self.io.write_put(id, data) self.storage_quota_use += len(data) + self.io.put_header_fmt.size self.segments.setdefault(segment, 0) @@ -1221,6 +1217,10 @@ class Repository: except KeyError: raise self.ObjectNotFound(id, self.path) from None self.shadow_index.setdefault(id, []).append(segment) + self._delete(id, segment, offset) + + def _delete(self, id, segment, offset): + # common code used by put and delete self.segments[segment] -= 1 size = self.io.read(segment, offset, id, read_data=False) self.storage_quota_use -= size From f079a83fed91c1221951303f758187987be0ac47 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Mon, 18 Jan 2021 21:26:01 +0100 Subject: [PATCH 2/2] fix updating shadow_index also in put The shadow_index should be in same state after both of these sequences (let's assume that A is not in repo yet for simplicity, but it does not matter): a) explicit delete: put(A), delete(A), put(A), resulting in: PUT A, DEL A, PUT A repo contents b) implicit delete: put(A), put(A), resulting in: PUT A, DEL A, PUT A repo contents --- src/borg/repository.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/borg/repository.py b/src/borg/repository.py index 62d7ccff0..a1af3c2bc 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -1216,11 +1216,11 @@ class Repository: segment, offset = self.index.pop(id) except KeyError: raise self.ObjectNotFound(id, self.path) from None - self.shadow_index.setdefault(id, []).append(segment) self._delete(id, segment, offset) def _delete(self, id, segment, offset): # common code used by put and delete + self.shadow_index.setdefault(id, []).append(segment) self.segments[segment] -= 1 size = self.io.read(segment, offset, id, read_data=False) self.storage_quota_use -= size