summaryrefslogtreecommitdiff
path: root/obnamlib/repo_interface.py
diff options
context:
space:
mode:
authorCarlo Teubner <carlo.teubner@gmail.com>2014-02-02 14:19:11 +0000
committerLars Wirzenius <liw@liw.fi>2014-06-04 13:57:43 +0100
commit7f235c2fdc94647587514b5f1ae7778b2e20aa5a (patch)
tree1a8512cd97df6c5c050bf6124cb80ead6c6268a2 /obnamlib/repo_interface.py
parent348af822d830d3c9f34438dae3ea3cd9d7e38bda (diff)
downloadobnam-7f235c2fdc94647587514b5f1ae7778b2e20aa5a.tar.gz
fsck: optionally remove unused chunks
Remove unused chunks if either --fsck-fix or --fsck-rm-unused is given. The second option is introduced because --fsck-fix may cause fsck to fail in the case where we're out of disk space.
Diffstat (limited to 'obnamlib/repo_interface.py')
-rw-r--r--obnamlib/repo_interface.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/obnamlib/repo_interface.py b/obnamlib/repo_interface.py
index 1782b41d..614c1c5d 100644
--- a/obnamlib/repo_interface.py
+++ b/obnamlib/repo_interface.py
@@ -747,6 +747,10 @@ class RepositoryInterface(object):
'''Removes a chunk from indexes, given its id, for a given client.'''
raise NotImplementedError()
+ def remove_chunk_from_indexes_for_all_clients(self, chunk_id):
+ '''Removes a chunk from indexes, given its id, for all clients.'''
+ raise NotImplementedError()
+
def find_chunk_ids_by_content(self, data):
'''Finds chunk ids that probably match a given content.
@@ -1077,6 +1081,12 @@ class RepositoryInterfaceTests(unittest.TestCase): # pragma: no cover
self.repo.add_client('fooclient')
self.repo.commit_client_list()
+ def setup_two_clients(self):
+ self.repo.lock_client_list()
+ self.repo.add_client('fooclient')
+ self.repo.add_client('barclient')
+ self.repo.commit_client_list()
+
def test_have_not_got_client_lock_initially(self):
self.setup_client()
self.assertFalse(self.repo.got_client_lock('fooclient'))
@@ -1897,6 +1907,18 @@ class RepositoryInterfaceTests(unittest.TestCase): # pragma: no cover
obnamlib.RepositoryChunkContentNotInIndexes,
self.repo.find_chunk_ids_by_content, 'foochunk')
+ def test_removes_chunk_from_indexes_for_all_clients(self):
+ self.setup_two_clients()
+ self.repo.lock_chunk_indexes()
+ chunk_id = self.repo.put_chunk_content('foochunk')
+ token = self.repo.prepare_chunk_for_indexes('foochunk')
+ self.repo.put_chunk_into_indexes(chunk_id, token, 'fooclient')
+ self.repo.put_chunk_into_indexes(chunk_id, token, 'barclient')
+ self.repo.remove_chunk_from_indexes_for_all_clients(chunk_id)
+ self.assertRaises(
+ obnamlib.RepositoryChunkContentNotInIndexes,
+ self.repo.find_chunk_ids_by_content, 'foochunk')
+
def test_putting_chunk_to_indexes_without_locking_them_fails(self):
chunk_id = self.repo.put_chunk_content('foochunk')
token = self.repo.prepare_chunk_for_indexes('foochunk')
@@ -1916,6 +1938,17 @@ class RepositoryInterfaceTests(unittest.TestCase): # pragma: no cover
obnamlib.RepositoryChunkIndexesNotLocked,
self.repo.remove_chunk_from_indexes, chunk_id, 'fooclient')
+ def test_removing_chunk_from_indexes_for_all_clients_without_locking_them_fails(self):
+ self.setup_client()
+ chunk_id = self.repo.put_chunk_content('foochunk')
+ self.repo.lock_chunk_indexes()
+ token = self.repo.prepare_chunk_for_indexes('foochunk')
+ self.repo.put_chunk_into_indexes(chunk_id, token, 'fooclient')
+ self.repo.commit_chunk_indexes()
+ self.assertRaises(
+ obnamlib.RepositoryChunkIndexesNotLocked,
+ self.repo.remove_chunk_from_indexes_for_all_clients, chunk_id)
+
def test_unlocking_chunk_indexes_forgets_changes(self):
self.setup_client()
chunk_id = self.repo.put_chunk_content('foochunk')