From 24d3400dd455bf78a9f54d219111e7b2d5468521 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Thu, 17 Dec 2020 22:28:42 +0100 Subject: [PATCH] borg export-tar: fix memory leak with ssh: remote repository, fixes #5568 also: added a comment how to avoid this kind of memory leak. --- src/borg/archive.py | 2 ++ src/borg/archiver.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 7c0369d6e..708d78b18 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -523,6 +523,8 @@ Utilization of max. archive size: {csize_max:.0%} return filter(item) if filter else True def iter_items(self, filter=None, partial_extract=False, preload=False, hardlink_masters=None): + # note: when calling this with preload=True, later fetch_many() must be called with + # is_preloaded=True or the RemoteRepository code will leak memory! assert not (filter and partial_extract and preload) or hardlink_masters is not None for item in self.pipeline.unpack_many(self.metadata.items, partial_extract=partial_extract, preload=preload, hardlink_masters=hardlink_masters, diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 9d2731e38..3c7d45e19 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1031,7 +1031,8 @@ class Archiver: """ Return a file-like object that reads from the chunks of *item*. """ - chunk_iterator = archive.pipeline.fetch_many([chunk_id for chunk_id, _, _ in item.chunks]) + chunk_iterator = archive.pipeline.fetch_many([chunk_id for chunk_id, _, _ in item.chunks], + is_preloaded=True) if pi: info = [remove_surrogates(item.path)] return ChunkIteratorFileWrapper(chunk_iterator,