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:
parent
21e03af56b
commit
5a69f58823
3 changed files with 12 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in a new issue