1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-25 17:27:31 +00:00

Merge pull request #2988 from ThomasWaldmann/recover-segments-memory-usage

recover_segment: use mmap(), fixes #2982
This commit is contained in:
TW 2017-09-02 17:48:04 +02:00 committed by GitHub
commit 86c0b66de3

View file

@ -1,4 +1,5 @@
import errno import errno
import mmap
import os import os
import shutil import shutil
import struct import struct
@ -1309,13 +1310,15 @@ def iter_objects(self, segment, offset=0, include_data=False, read_data=True):
header = fd.read(self.header_fmt.size) header = fd.read(self.header_fmt.size)
def recover_segment(self, segment, filename): def recover_segment(self, segment, filename):
logger.info('attempting to recover ' + filename)
if segment in self.fds: if segment in self.fds:
del self.fds[segment] del self.fds[segment]
with open(filename, 'rb') as fd: backup_filename = filename + '.beforerecover'
# XXX: Rather use mmap, this loads the entire segment (up to 500 MB by default) into memory. os.rename(filename, backup_filename)
data = memoryview(fd.read()) with open(backup_filename, 'rb') as backup_fd:
os.rename(filename, filename + '.beforerecover') # note: file must not be 0 size (windows can't create 0 size mapping)
logger.info('attempting to recover ' + filename) with mmap.mmap(backup_fd.fileno(), 0, access=mmap.ACCESS_READ) as mm:
data = memoryview(mm)
with open(filename, 'wb') as fd: with open(filename, 'wb') as fd:
fd.write(MAGIC) fd.write(MAGIC)
while len(data) >= self.header_fmt.size: while len(data) >= self.header_fmt.size:
@ -1328,6 +1331,7 @@ def recover_segment(self, segment, filename):
continue continue
fd.write(data[:size]) fd.write(data[:size])
data = data[size:] data = data[size:]
data.release()
def read(self, segment, offset, id, read_data=True): def read(self, segment, offset, id, read_data=True):
""" """