diff options
Diffstat (limited to 'larch/refcountstore.py')
-rw-r--r-- | larch/refcountstore.py | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/larch/refcountstore.py b/larch/refcountstore.py index 18fb9e7..6a9411f 100644 --- a/larch/refcountstore.py +++ b/larch/refcountstore.py @@ -24,12 +24,10 @@ import tracing import larch -def encode_refcounts(refcounts, start_id, how_many): +def encode_refcounts(refcounts, start_id, how_many, keys): fmt = '!QH' + 'H' * how_many args = [start_id, how_many] + ([0] * how_many) - keys = set(refcounts.keys()) - wanted = set(range(start_id, start_id + how_many)) - for key in wanted.intersection(keys): + for key in keys: args[2 + key - start_id] = refcounts[key] return struct.pack(fmt, *args) @@ -91,13 +89,19 @@ class RefcountStore(object): if not self.node_store.journal.exists(dirname): self.node_store.journal.makedirs(dirname) ids = sorted(self.dirty) + all_ids_in_memory = set(self.refcounts.keys()) for start_id in range(self._start_id(ids[0]), self._start_id(ids[-1]) + 1, self.per_group): - encoded = encode_refcounts(self.refcounts, start_id, - self.per_group) - filename = self._group_filename(start_id) - self.node_store.journal.overwrite_file(filename, encoded) + + all_ids_in_group = set( + range(start_id, start_id + self.per_group)) + keys = all_ids_in_group.intersection(all_ids_in_memory) + if keys: + encoded = encode_refcounts( + self.refcounts, start_id, self.per_group, keys) + filename = self._group_filename(start_id) + self.node_store.journal.overwrite_file(filename, encoded) # We re-initialize these so that they don't grow indefinitely. self.refcounts = dict() @@ -115,4 +119,3 @@ class RefcountStore(object): def _start_id(self, node_id): return (node_id / self.per_group) * self.per_group - |