diff --git a/borg/helpers.py b/borg/helpers.py index 813d22770..df6f1163b 100644 --- a/borg/helpers.py +++ b/borg/helpers.py @@ -697,19 +697,6 @@ def location_validator(archive=None): return validator -def read_msgpack(filename): - with open(filename, 'rb') as fd: - return msgpack.unpack(fd) - - -def write_msgpack(filename, d): - with open(filename + '.tmp', 'wb') as fd: - msgpack.pack(d, fd) - fd.flush() - os.fsync(fd.fileno()) - os.rename(filename + '.tmp', filename) - - def decode_dict(d, keys, encoding='utf-8', errors='surrogateescape'): for key in keys: if isinstance(d.get(key), bytes): diff --git a/borg/repository.py b/borg/repository.py index 49e3ac23d..80c8ed789 100644 --- a/borg/repository.py +++ b/borg/repository.py @@ -10,8 +10,8 @@ import shutil import struct from zlib import crc32 -from .helpers import Error, ErrorWithTraceback, IntegrityError, read_msgpack, write_msgpack, \ - unhexlify, ProgressIndicatorPercent +import msgpack +from .helpers import Error, ErrorWithTraceback, IntegrityError, unhexlify, ProgressIndicatorPercent from .hashindex import NSIndex from .locking import UpgradableLock, LockError, LockErrorT from .lrucache import LRUCache @@ -189,7 +189,8 @@ class Repository: else: if do_cleanup: self.io.cleanup(transaction_id) - hints = read_msgpack(os.path.join(self.path, 'hints.%d' % transaction_id)) + with open(os.path.join(self.path, 'hints.%d' % transaction_id), 'rb') as fd: + hints = msgpack.unpack(fd) if hints[b'version'] != 1: raise ValueError('Unknown hints file version: %d' % hints['version']) self.segments = hints[b'segments'] @@ -200,7 +201,12 @@ class Repository: b'segments': self.segments, b'compact': list(self.compact)} transaction_id = self.io.get_segments_transaction_id() - write_msgpack(os.path.join(self.path, 'hints.%d' % transaction_id), hints) + hints_file = os.path.join(self.path, 'hints.%d' % transaction_id) + with open(hints_file + '.tmp', 'wb') as fd: + msgpack.pack(hints, fd) + fd.flush() + os.fsync(fd.fileno()) + os.rename(hints_file + '.tmp', hints_file) self.index.write(os.path.join(self.path, 'index.tmp')) os.rename(os.path.join(self.path, 'index.tmp'), os.path.join(self.path, 'index.%d' % transaction_id))