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:
parent
d8e519855b
commit
3d83e1f004
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user