pyocf: more generic erorr device volume

Make ErrorDevice a wraper over any type of volume rather than
inheriting from RamVolume. This way error injection layer can be added
over any type of volume.

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2022-04-01 11:36:08 +02:00
parent d8e519855b
commit 3d83e1f004
2 changed files with 29 additions and 7 deletions

View File

@ -405,16 +405,17 @@ class RamVolume(Volume):
return string_at(self.data_ptr, self.size)
class ErrorDevice(RamVolume):
class ErrorDevice(Volume):
def __init__(
self,
size,
vol,
error_sectors: set = None,
error_seq_no: dict = None,
armed=True,
uuid=None,
):
super().__init__(size, uuid)
self.vol = vol
super().__init__(uuid)
self.error_sectors = error_sectors
self.error_seq_no = error_seq_no
self.armed = armed
@ -426,7 +427,7 @@ class ErrorDevice(RamVolume):
def do_submit_io(self, io):
if not self.armed:
super().do_submit_io(io)
self.vol.do_submit_io(io)
return
direction = IoDir(io.contents._dir)
@ -451,7 +452,7 @@ class ErrorDevice(RamVolume):
io.contents._end(io, -OcfErrorCode.OCF_ERR_IO)
self.stats["errors"][direction] += 1
else:
super().do_submit_io(io)
self.vol.do_submit_io(io)
def arm(self):
self.armed = True
@ -463,9 +464,29 @@ class ErrorDevice(RamVolume):
return self.error
def reset_stats(self):
self.vol.reset_stats()
super().reset_stats()
self.stats["errors"] = {IoDir.WRITE: 0, IoDir.READ: 0}
def get_length(self):
return self.vol.get_length()
def get_max_io_size(self):
return self.vol.get_max_io_size()
def do_submit_flush(self, flush):
return self.vol.do_submit_flush(flush)
def do_submit_discard(self, discard):
return self.vol.do_submit_discard(discard)
def dump(self, offset=0, size=0, ignore=VOLUME_POISON, **kwargs):
return self.vol.dump(offset, size, ignore=ignore, **kwargs)
def md5(self):
return self.vol.md5()
def get_copy(self):
return self.vol.get_copy()
lib = OcfLib.getInstance()
lib.ocf_io_get_priv.restype = POINTER(VolumeIoPriv)

View File

@ -47,7 +47,8 @@ def test_simple_wt_write(pyocf_ctx):
def test_start_corrupted_metadata_lba(pyocf_ctx):
cache_device = ErrorDevice(S.from_MiB(50), error_sectors=set([0]))
ramdisk = RamVolume(S.from_MiB(50))
cache_device = ErrorDevice(ramdisk, error_sectors=set([0]))
with pytest.raises(OcfError, match="OCF_ERR_WRITE_CACHE"):
cache = Cache.start_on_device(cache_device)