From 5b31a2cd61eeea6714061d9ef58bb97c7fb3d574 Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Fri, 11 Nov 2016 16:17:51 +0100 Subject: [PATCH 1/2] borg init: fix free space check crashing if disk is full --- src/borg/repository.py | 8 +++++++- src/borg/testsuite/repository.py | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/borg/repository.py b/src/borg/repository.py index 89374d6f7..fce6d0687 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -120,6 +120,7 @@ class Repository: self.lock_wait = lock_wait self.do_lock = lock self.do_create = create + self.created = False self.exclusive = exclusive self.append_only = append_only self.hostname_is_unique = yes(env_var_override='BORG_HOSTNAME_IS_UNIQUE', env_msg=None, prompt=False) @@ -138,6 +139,7 @@ class Repository: if self.do_create: self.do_create = False self.create(self.path) + self.created = True self.open(self.path, bool(self.exclusive), lock_wait=self.lock_wait, lock=self.do_lock) return self @@ -437,7 +439,11 @@ class Repository: free_space = st_vfs.f_bavail * st_vfs.f_bsize logger.debug('check_free_space: required bytes {}, free bytes {}'.format(required_free_space, free_space)) if free_space < required_free_space: - self._rollback(cleanup=True) + if self.created: + logger.error('Not enough free space to initialize repository at this location.') + self.destroy() + else: + self._rollback(cleanup=True) formatted_required = format_file_size(required_free_space) formatted_free = format_file_size(free_space) raise self.InsufficientFreeSpaceError(formatted_required, formatted_free) diff --git a/src/borg/testsuite/repository.py b/src/borg/testsuite/repository.py index a4683a629..58472371e 100644 --- a/src/borg/testsuite/repository.py +++ b/src/borg/testsuite/repository.py @@ -407,6 +407,12 @@ class RepositoryFreeSpaceTestCase(RepositoryTestCaseBase): with pytest.raises(Repository.InsufficientFreeSpaceError): self.repository.commit() + def test_create_free_space(self): + self.repository.additional_free_space = 1e20 + with pytest.raises(Repository.InsufficientFreeSpaceError): + self.add_keys() + assert not os.path.exists(self.repository.path) + class NonceReservation(RepositoryTestCaseBase): def test_get_free_nonce_asserts(self): From 6c955579a83c8cec6962c8e5344dd45677fe654d Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Fri, 11 Nov 2016 16:39:11 +0100 Subject: [PATCH 2/2] repository: test_additional_free_space, assert it still exists --- src/borg/testsuite/repository.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/borg/testsuite/repository.py b/src/borg/testsuite/repository.py index 58472371e..6d6f00a71 100644 --- a/src/borg/testsuite/repository.py +++ b/src/borg/testsuite/repository.py @@ -406,6 +406,7 @@ class RepositoryFreeSpaceTestCase(RepositoryTestCaseBase): self.repository.put(H(0), b'foobar') with pytest.raises(Repository.InsufficientFreeSpaceError): self.repository.commit() + assert os.path.exists(self.repository.path) def test_create_free_space(self): self.repository.additional_free_space = 1e20