Fix wb xfailed test, update exported obj md5

Signed-off-by: Kamil Lepek <kamil.lepek94@gmail.com>
This commit is contained in:
Kamil Lepek 2019-06-18 15:46:15 +02:00
parent 34a5b8e882
commit bdfd086d81
2 changed files with 32 additions and 21 deletions

View File

@ -158,21 +158,31 @@ class Core:
logging.getLogger("pyocf").warning(
"Reading whole exported object! This disturbs statistics values"
)
read_buffer = Data(self.device.size)
io = self.new_io()
io.configure(0, read_buffer.size, IoDir.READ, 0, 0)
io.set_data(read_buffer)
io.set_queue(self.cache.get_default_queue())
cmpl = OcfCompletion([("err", c_int)])
io.callback = cmpl.callback
io.submit()
cmpl.wait()
cache_line_size = int(self.cache.get_stats()['conf']['cache_line_size'])
read_buffer_all = Data(self.device.size)
if cmpl.results["err"]:
raise Exception("Error reading whole exported object")
read_buffer = Data(cache_line_size)
return read_buffer.md5()
position = 0
while position < read_buffer_all.size:
io = self.new_io()
io.configure(position, cache_line_size, IoDir.READ, 0, 0)
io.set_data(read_buffer)
io.set_queue(self.cache.get_default_queue())
cmpl = OcfCompletion([("err", c_int)])
io.callback = cmpl.callback
io.submit()
cmpl.wait()
if cmpl.results["err"]:
raise Exception("Error reading whole exported object")
read_buffer_all.copy(read_buffer, position, 0, cache_line_size)
position += cache_line_size
return read_buffer_all.md5()
lib = OcfLib.getInstance()

View File

@ -178,11 +178,13 @@ def test_stop(pyocf_ctx, mode: CacheMode, cls: CacheLineSize, with_flush: bool):
cache = Cache.start_on_device(cache_device, cache_mode=mode, cache_line_size=cls)
core_exported = Core.using_device(core_device)
cache.add_core(core_exported)
cls_no = 10
run_io_and_cache_data_if_possible(core_exported, mode, cls)
run_io_and_cache_data_if_possible(core_exported, mode, cls, cls_no)
stats = cache.get_stats()
assert int(stats["conf"]["dirty"]) == (1 if mode.lazy_write() else 0), "Dirty data before MD5"
assert int(stats["conf"]["dirty"]) == (cls_no if mode.lazy_write() else 0),\
"Dirty data before MD5"
md5_exported_core = core_exported.exp_obj_md5()
@ -191,7 +193,6 @@ def test_stop(pyocf_ctx, mode: CacheMode, cls: CacheLineSize, with_flush: bool):
cache.stop()
if mode.lazy_write() and not with_flush:
pytest.xfail("MD5 sums equal without flush with dirty data") # TODO: remove after WB fixed
assert core_device.md5() != md5_exported_core, \
"MD5 check: core device vs exported object with dirty data"
else:
@ -353,21 +354,21 @@ def test_start_too_small_device(pyocf_ctx, mode, cls):
Cache.start_on_device(cache_device, cache_mode=mode, cache_line_size=cls)
def run_io_and_cache_data_if_possible(exported_obj, mode, cls):
test_data = Data.from_string("This is test data")
def run_io_and_cache_data_if_possible(exported_obj, mode, cls, cls_no):
test_data = Data(cls_no * cls)
if mode in {CacheMode.WI, CacheMode.WA}:
logger.info("[STAGE] Write to core device")
io_to_core(exported_obj, test_data, 20, True)
io_to_core(exported_obj, test_data, 0, True)
logger.info("[STAGE] Read from exported object")
io_from_exported_object(exported_obj, test_data.size, 20)
io_from_exported_object(exported_obj, test_data.size, 0)
else:
logger.info("[STAGE] Write to exported object")
io_to_core(exported_obj, test_data, 20)
io_to_core(exported_obj, test_data, 0)
stats = exported_obj.cache.get_stats()
assert stats["usage"]["occupancy"]["value"] == \
((cls / CacheLineSize.LINE_4KiB) if mode != CacheMode.PT else 0), "Occupancy"
((cls_no * cls / CacheLineSize.LINE_4KiB) if mode != CacheMode.PT else 0), "Occupancy"
def io_to_core(exported_obj: Core, data: Data, offset: int, to_core_device=False):