From 7a569bc0377be1f823f8b0502d333e8073142649 Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Mon, 23 May 2016 00:42:31 +0200 Subject: [PATCH] Repository: avoid reading large segments for commit state check --- borg/repository.py | 4 ++-- borg/testsuite/archiver.py | 2 +- borg/testsuite/repository.py | 24 ++++++++++++------------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/borg/repository.py b/borg/repository.py index 10190e03a..c94e5decf 100644 --- a/borg/repository.py +++ b/borg/repository.py @@ -735,8 +735,8 @@ class LoggedIO: return self.segment def write_commit(self): - fd = self.get_write_fd(no_new=True) - fd.sync() + self.close_segment() + fd = self.get_write_fd() header = self.header_no_crc_fmt.pack(self.header_fmt.size, TAG_COMMIT) crc = self.crc_fmt.pack(crc32(header) & 0xffffffff) fd.write(b''.join((crc, header))) diff --git a/borg/testsuite/archiver.py b/borg/testsuite/archiver.py index 675c81deb..f37ca177e 100644 --- a/borg/testsuite/archiver.py +++ b/borg/testsuite/archiver.py @@ -927,7 +927,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): self.assert_in('borgbackup version', output) # implied output even without --info given self.assert_not_in('Starting repository check', output) # --info not given for root logger - name = sorted(os.listdir(os.path.join(self.tmpdir, 'repository', 'data', '0')), reverse=True)[0] + name = sorted(os.listdir(os.path.join(self.tmpdir, 'repository', 'data', '0')), reverse=True)[1] with open(os.path.join(self.tmpdir, 'repository', 'data', '0', name), 'r+b') as fd: fd.seek(100) fd.write(b'XXXX') diff --git a/borg/testsuite/repository.py b/borg/testsuite/repository.py index 69c946564..71743bfb0 100644 --- a/borg/testsuite/repository.py +++ b/borg/testsuite/repository.py @@ -216,18 +216,18 @@ class RepositoryAppendOnlyTestCase(RepositoryTestCaseBase): self.repository.commit() self.repository.append_only = False - assert segments_in_repository() == 1 + assert segments_in_repository() == 2 self.repository.put(b'00000000000000000000000000000000', b'foo') self.repository.commit() # normal: compact squashes the data together, only one segment - assert segments_in_repository() == 1 + assert segments_in_repository() == 4 self.repository.append_only = True - assert segments_in_repository() == 1 + assert segments_in_repository() == 4 self.repository.put(b'00000000000000000000000000000000', b'foo') self.repository.commit() # append only: does not compact, only new segments written - assert segments_in_repository() == 2 + assert segments_in_repository() == 6 class RepositoryCheckTestCase(RepositoryTestCaseBase): @@ -296,20 +296,20 @@ class RepositoryCheckTestCase(RepositoryTestCaseBase): self.add_objects([[1, 2, 3], [4, 5, 6]]) self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects()) self.check(status=True) - self.delete_segment(1) + self.delete_segment(2) self.repository.rollback() self.check(repair=True, status=True) self.assert_equal(set([1, 2, 3]), self.list_objects()) def test_repair_missing_commit_segment(self): self.add_objects([[1, 2, 3], [4, 5, 6]]) - self.delete_segment(1) + self.delete_segment(3) self.assert_raises(Repository.ObjectNotFound, lambda: self.get_objects(4)) self.assert_equal(set([1, 2, 3]), self.list_objects()) def test_repair_corrupted_commit_segment(self): self.add_objects([[1, 2, 3], [4, 5, 6]]) - with open(os.path.join(self.tmppath, 'repository', 'data', '0', '1'), 'r+b') as fd: + with open(os.path.join(self.tmppath, 'repository', 'data', '0', '3'), 'r+b') as fd: fd.seek(-1, os.SEEK_END) fd.write(b'X') self.assert_raises(Repository.ObjectNotFound, lambda: self.get_objects(4)) @@ -319,15 +319,15 @@ class RepositoryCheckTestCase(RepositoryTestCaseBase): def test_repair_no_commits(self): self.add_objects([[1, 2, 3]]) - with open(os.path.join(self.tmppath, 'repository', 'data', '0', '0'), 'r+b') as fd: + with open(os.path.join(self.tmppath, 'repository', 'data', '0', '1'), 'r+b') as fd: fd.seek(-1, os.SEEK_END) fd.write(b'X') self.assert_raises(Repository.CheckNeeded, lambda: self.get_objects(4)) self.check(status=False) self.check(status=False) - self.assert_equal(self.list_indices(), ['index.0']) - self.check(repair=True, status=True) self.assert_equal(self.list_indices(), ['index.1']) + self.check(repair=True, status=True) + self.assert_equal(self.list_indices(), ['index.3']) self.check(status=True) self.get_objects(3) self.assert_equal(set([1, 2, 3]), self.list_objects()) @@ -341,10 +341,10 @@ class RepositoryCheckTestCase(RepositoryTestCaseBase): def test_repair_index_too_new(self): self.add_objects([[1, 2, 3], [4, 5, 6]]) - self.assert_equal(self.list_indices(), ['index.1']) + self.assert_equal(self.list_indices(), ['index.3']) self.rename_index('index.100') self.check(status=True) - self.assert_equal(self.list_indices(), ['index.1']) + self.assert_equal(self.list_indices(), ['index.3']) self.get_objects(4) self.assert_equal(set([1, 2, 3, 4, 5, 6]), self.list_objects())