1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-02-23 14:41:43 +00:00

Introduce a separate exception for missing repository objects

This commit is contained in:
Jonas Borgström 2014-10-09 20:41:47 +02:00
parent 21e03af56b
commit 5a69f58823
3 changed files with 12 additions and 7 deletions

View file

@ -155,6 +155,8 @@ def fetch_from_cache(args):
raise IntegrityError(res)
elif error == b'PathNotAllowed':
raise PathNotAllowed(*res)
if error == b'ObjectNotFound':
raise Repository.ObjectNotFound(res[0], self.location.orig)
raise self.RPCError(error)
else:
yield res

View file

@ -44,6 +44,9 @@ class InvalidRepository(Error):
class CheckNeeded(Error):
'''Inconsistency detected. Please run "attic check {}"'''
class ObjectNotFound(Error):
"""Object with key {} not found in repository {}"""
def __init__(self, path, create=False, exclusive=False):
self.path = path
self.io = None
@ -334,7 +337,7 @@ def get(self, id_):
segment, offset = self.index[id_]
return self.io.read(segment, offset, id_)
except KeyError:
raise self.DoesNotExist(self.path)
raise self.ObjectNotFound(id_, self.path)
def get_many(self, ids, is_preloaded=False):
for id_ in ids:
@ -363,7 +366,7 @@ def delete(self, id, wait=True):
try:
segment, offset = self.index.pop(id)
except KeyError:
raise self.DoesNotExist(self.path)
raise self.ObjectNotFound(id, self.path)
self.segments[segment] -= 1
self.compact.add(segment)
segment = self.io.write_delete(id)

View file

@ -36,11 +36,11 @@ def test1(self):
key50 = ('%-32d' % 50).encode('ascii')
self.assert_equal(self.repository.get(key50), b'SOMEDATA')
self.repository.delete(key50)
self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(key50))
self.assert_raises(Repository.ObjectNotFound, lambda: self.repository.get(key50))
self.repository.commit()
self.repository.close()
repository2 = self.open()
self.assert_raises(Repository.DoesNotExist, lambda: repository2.get(key50))
self.assert_raises(Repository.ObjectNotFound, lambda: repository2.get(key50))
for x in range(100):
if x == 50:
continue
@ -68,7 +68,7 @@ def test_consistency(self):
self.repository.put(b'00000000000000000000000000000000', b'bar')
self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'bar')
self.repository.delete(b'00000000000000000000000000000000')
self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(b'00000000000000000000000000000000'))
self.assert_raises(Repository.ObjectNotFound, lambda: self.repository.get(b'00000000000000000000000000000000'))
def test_consistency2(self):
"""Test cache consistency2
@ -258,7 +258,7 @@ def test_repair_missing_segment(self):
def test_repair_missing_commit_segment(self):
self.add_objects([[1, 2, 3], [4, 5, 6]])
self.delete_segment(1)
self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
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):
@ -266,7 +266,7 @@ def test_repair_corrupted_commit_segment(self):
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.DoesNotExist, lambda: self.get_objects(4))
self.assert_raises(Repository.ObjectNotFound, lambda: self.get_objects(4))
self.check(status=True)
self.get_objects(3)
self.assert_equal(set([1, 2, 3]), self.list_objects())