From 438b6d158ee3d0d2699db0c3dd7e96d23c9abd35 Mon Sep 17 00:00:00 2001 From: Jan Musial Date: Wed, 18 May 2022 11:05:59 +0200 Subject: [PATCH 1/3] pyocf: Delete Io object in pyocf before putting in OCF To avoid Io reuse (new io with same pointer could be allocated before deleting from pyocf instance tracking dictionary). Signed-off-by: Jan Musial --- tests/functional/pyocf/types/io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/pyocf/types/io.py b/tests/functional/pyocf/types/io.py index e314a80..a7d0cf0 100644 --- a/tests/functional/pyocf/types/io.py +++ b/tests/functional/pyocf/types/io.py @@ -92,8 +92,8 @@ class Io(Structure): except: # noqa E722 pass - self.put() self.del_object() + self.put() def submit(self): return OcfLib.getInstance().ocf_volume_submit_io(byref(self)) From 3b7d25737be3315c56314db2344c7b200abe7ce5 Mon Sep 17 00:00:00 2001 From: Jan Musial Date: Wed, 18 May 2022 11:07:36 +0200 Subject: [PATCH 2/3] pyocf: Various improvements in RIO Signed-off-by: Jan Musial --- tests/functional/pyocf/rio.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/functional/pyocf/rio.py b/tests/functional/pyocf/rio.py index 441ba10..33ccb2c 100644 --- a/tests/functional/pyocf/rio.py +++ b/tests/functional/pyocf/rio.py @@ -124,9 +124,9 @@ class Rio: def run(self): iogen = IoGen( - (self.jobspec.offset, self.jobspec.size), + (self.jobspec.offset, self.jobspec.size - self.jobspec.offset), self.jobspec.bs, - self.jobspec.randseed, + self.jobspec.randseed + hash(self.name), self.jobspec.readwrite.is_random(), self.jobspec.randommap, ) @@ -150,7 +150,7 @@ class Rio: while not self.should_finish(): with self.qd_condition: - self.qd_condition.wait_for(lambda: self.qd <= self.jobspec.qd) + self.qd_condition.wait_for(lambda: self.qd < self.jobspec.qd) data = Data(self.jobspec.bs) # TODO pattern and verify io = self.jobspec.target.new_io( @@ -195,6 +195,10 @@ class Rio: self.global_jobspec.randommap = False return self + def randseed(self, seed): + self.global_jobspec.randseed = seed + return self + def bs(self, bs: Size): self.global_jobspec.bs = bs return self From 8c220bf3f5c5db4bd26097c91e5e5b13a563462d Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Thu, 21 Oct 2021 10:51:00 +0200 Subject: [PATCH 3/3] pyocf: standby io tests Signed-off-by: Adam Rutkowski Signed-off-by: Jan Musial --- .../tests/failover/test_standby_io.py | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tests/functional/tests/failover/test_standby_io.py diff --git a/tests/functional/tests/failover/test_standby_io.py b/tests/functional/tests/failover/test_standby_io.py new file mode 100644 index 0000000..2d6edf9 --- /dev/null +++ b/tests/functional/tests/failover/test_standby_io.py @@ -0,0 +1,94 @@ +# +# Copyright(c) 2022 Intel Corporation +# SPDX-License-Identifier: BSD-3-Clause +# + +import pytest +from datetime import timedelta + +from pyocf.types.volume import RamVolume +from pyocf.types.volume_cache import CacheVolume +from pyocf.types.cache import Cache +from pyocf.types.queue import Queue +from pyocf.utils import Size +from pyocf.types.shared import CacheLineSize +from pyocf.types.ctx import OcfCtx +from pyocf.rio import Rio, ReadWrite +from pyocf.helpers import ( + get_collision_segment_page_location, + get_collision_segment_size, +) + + +@pytest.mark.parametrize("cacheline_size", CacheLineSize) +def test_test_standby_io(pyocf_ctx, cacheline_size): + num_jobs = 8 + qd = 16 + runtime = 5 + + vol_size = Size.from_MiB(100) + cache_vol = RamVolume(vol_size) + + cache = Cache(owner=OcfCtx.get_default(), cache_line_size=cacheline_size) + + cache.start_cache(init_default_io_queue=False) + + for i in range(num_jobs): + cache.add_io_queue(f"io-queue-{i}") + + cache.standby_attach(cache_vol) + + r = ( + Rio() + .target(cache) + .njobs(num_jobs) + .readwrite(ReadWrite.RANDWRITE) + .size(vol_size) + .io_size(Size.from_GiB(100)) + .bs(Size.from_KiB(4)) + .qd(qd) + .time(timedelta(seconds=runtime)) + .time_based() + .run(cache.io_queues) + ) + + +@pytest.mark.parametrize("cacheline_size", CacheLineSize) +def test_test_standby_io_metadata(pyocf_ctx, cacheline_size): + num_jobs = 8 + qd = 16 + runtime = 10 + + vol_size = Size.from_MiB(200) + cache_vol = RamVolume(vol_size) + + cache = Cache(owner=OcfCtx.get_default(), cache_line_size=cacheline_size) + + cache.start_cache(init_default_io_queue=False) + + for i in range(num_jobs): + cache.add_io_queue(f"io-queue-{i}") + + cache.standby_attach(cache_vol) + + start = get_collision_segment_page_location(cache) + count = get_collision_segment_size(cache) + io_offset = Size.from_page(start) + io_size = Size.from_page(count) + + cache_vol = CacheVolume(cache, open=True) + + r = ( + Rio() + .target(cache_vol) + .njobs(num_jobs) + .readwrite(ReadWrite.RANDWRITE) + .size(io_offset + io_size) + .bs(Size.from_KiB(16)) + .offset(io_offset) + .qd(qd) + .time(timedelta(seconds=runtime)) + .time_based() + .norandommap() + .run(cache.io_queues) + )