tests: more robust verififaction in ioclass tests
Signed-off-by: Michal Mielewczyk <michal.mielewczyk@intel.com>
This commit is contained in:
parent
1742841ee3
commit
6ad0562b53
@ -96,42 +96,43 @@ def test_ioclass_occupancy_directory_write(io_size_multiplication, cache_mode, c
|
||||
f"To each directory perform IO with size of {io_size_multiplication} max io_class occupancy"
|
||||
):
|
||||
for io_class in io_classes:
|
||||
original_occupacies = {}
|
||||
original_occupancies = {}
|
||||
tmp_io_class_list = [i for i in io_classes if i != io_class]
|
||||
for i in tmp_io_class_list:
|
||||
original_occupacies[i.id] = get_io_class_occupancy(cache, i.id)
|
||||
original_occupancies[i.id] = get_io_class_occupancy(cache, i.id)
|
||||
|
||||
run_io_dir(
|
||||
f"{io_class.dir_path}/tmp_file",
|
||||
int(
|
||||
(io_class.max_occupancy * cache_size) / Unit.Blocks4096 * io_size_multiplication
|
||||
),
|
||||
)
|
||||
io_count = get_io_count(io_class, cache_size, cache_line_size, io_size_multiplication)
|
||||
run_io_dir(f"{io_class.dir_path}/tmp_file", io_count)
|
||||
|
||||
actuall_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
io_size = io_class.max_occupancy * cache_size
|
||||
actual_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
expected_occupancy = io_class.max_occupancy * cache_size
|
||||
if io_size_multiplication < 1:
|
||||
io_size *= io_size_multiplication
|
||||
io_size.set_unit(Unit.Blocks4096)
|
||||
expected_occupancy *= io_size_multiplication
|
||||
expected_occupancy = expected_occupancy.align_down(cache_line_size.value.value)
|
||||
expected_occupancy.set_unit(Unit.Blocks4096)
|
||||
|
||||
if not isclose(io_size.value, actuall_occupancy.value, rel_tol=0.1):
|
||||
if not isclose(expected_occupancy.value, actual_occupancy.value, rel_tol=0.1):
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass {i.id} should be equal {io_size} "
|
||||
f"but is {actuall_occupancy} instead!"
|
||||
f"Occupancy for ioclass {io_class.id} should be equal {expected_occupancy} "
|
||||
f"but is {actual_occupancy} instead!"
|
||||
)
|
||||
|
||||
for i in tmp_io_class_list:
|
||||
actuall_occupancy = get_io_class_occupancy(cache, i.id)
|
||||
if original_occupacies[i.id] != actuall_occupancy:
|
||||
actual_occupancy = get_io_class_occupancy(cache, i.id)
|
||||
io_count = get_io_count(i, cache_size, cache_line_size, io_size_multiplication)
|
||||
if (
|
||||
original_occupancies[i.id] != actual_occupancy
|
||||
and io_count * Unit.Blocks4096.value < actual_occupancy.value
|
||||
):
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass {i.id} should not change "
|
||||
f"during IO to ioclass {io_class.id}. Original value: "
|
||||
f"{original_occupacies[i.id]}, actuall: {actuall_occupancy}"
|
||||
f"{original_occupancies[i.id]}, actual: {actual_occupancy}"
|
||||
)
|
||||
|
||||
with TestRun.step("Check if none of ioclasses did not exceed specified occupancy"):
|
||||
for io_class in io_classes:
|
||||
actuall_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
actual_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
|
||||
occupancy_limit = (
|
||||
(io_class.max_occupancy * cache_size)
|
||||
@ -139,11 +140,11 @@ def test_ioclass_occupancy_directory_write(io_size_multiplication, cache_mode, c
|
||||
.set_unit(Unit.Blocks4096)
|
||||
)
|
||||
|
||||
# Divergency may be casued be rounding max occupancy
|
||||
if actuall_occupancy > occupancy_limit + Size(100, Unit.Blocks4096):
|
||||
# Divergency may be caused by rounding max occupancy
|
||||
if actual_occupancy > occupancy_limit * 1.01:
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass id exceeded: {io_class.id}. "
|
||||
f"Limit: {occupancy_limit}, actuall: {actuall_occupancy}"
|
||||
f"Limit: {occupancy_limit}, actual: {actual_occupancy}"
|
||||
)
|
||||
|
||||
|
||||
@ -193,12 +194,8 @@ def test_ioclass_occupancy_directory_read(io_size_multiplication, cache_line_siz
|
||||
f"max io_class occupancy for future read"
|
||||
):
|
||||
for io_class in io_classes:
|
||||
run_io_dir(
|
||||
f"{io_class.dir_path}/tmp_file",
|
||||
int(
|
||||
(io_class.max_occupancy * cache_size) / Unit.Blocks4096 * io_size_multiplication
|
||||
),
|
||||
)
|
||||
io_size = get_io_count(io_class, cache_size, cache_line_size, io_size_multiplication)
|
||||
run_io_dir(f"{io_class.dir_path}/tmp_file", io_size)
|
||||
|
||||
with TestRun.step("Remove old ioclass config"):
|
||||
ioclass_config.remove_ioclass_config()
|
||||
@ -233,38 +230,42 @@ def test_ioclass_occupancy_directory_read(io_size_multiplication, cache_line_siz
|
||||
|
||||
with TestRun.step(f"Read each file and check if data was inserted to appropriate ioclass"):
|
||||
for io_class in io_classes:
|
||||
original_occupacies = {}
|
||||
original_occupancies = {}
|
||||
tmp_io_class_list = [i for i in io_classes if i != io_class]
|
||||
for i in tmp_io_class_list:
|
||||
original_occupacies[i.id] = get_io_class_occupancy(cache, i.id)
|
||||
original_occupancies[i.id] = get_io_class_occupancy(cache, i.id)
|
||||
|
||||
run_io_dir_read(f"{io_class.dir_path}/tmp_file")
|
||||
|
||||
actuall_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
actual_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
|
||||
io_size = io_class.max_occupancy * cache_size
|
||||
expected_occupancy = io_class.max_occupancy * cache_size
|
||||
if io_size_multiplication < 1:
|
||||
io_size *= io_size_multiplication
|
||||
io_size.set_unit(Unit.Blocks4096)
|
||||
expected_occupancy *= io_size_multiplication
|
||||
expected_occupancy.set_unit(Unit.Blocks4096)
|
||||
|
||||
if not isclose(io_size.value, actuall_occupancy.value, rel_tol=0.1):
|
||||
if not isclose(expected_occupancy.value, actual_occupancy.value, rel_tol=0.1):
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass {i.id} should be equal {io_size} "
|
||||
f"but is {actuall_occupancy} instead!"
|
||||
f"Occupancy for ioclass {i.id} should be equal {expected_occupancy} "
|
||||
f"but is {actual_occupancy} instead!"
|
||||
)
|
||||
|
||||
for i in tmp_io_class_list:
|
||||
actuall_occupancy = get_io_class_occupancy(cache, i.id)
|
||||
if original_occupacies[i.id] != actuall_occupancy:
|
||||
actual_occupancy = get_io_class_occupancy(cache, i.id)
|
||||
io_count = get_io_count(i, cache_size, cache_line_size, io_size_multiplication)
|
||||
if (
|
||||
original_occupancies[i.id] != actual_occupancy
|
||||
and io_count * Unit.Blocks4096.value < actual_occupancy.value
|
||||
):
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass {i.id} should not change "
|
||||
f"during IO to ioclass {io_class.id}. Original value: "
|
||||
f"{original_occupacies[i.id]}, actuall: {actuall_occupancy}"
|
||||
f"{original_occupancies[i.id]}, actual: {actual_occupancy}"
|
||||
)
|
||||
|
||||
with TestRun.step("Check if none of ioclasses did not exceed specified occupancy"):
|
||||
for io_class in io_classes:
|
||||
actuall_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
actual_occupancy = get_io_class_occupancy(cache, io_class.id)
|
||||
|
||||
occupancy_limit = (
|
||||
(io_class.max_occupancy * cache_size)
|
||||
@ -272,11 +273,11 @@ def test_ioclass_occupancy_directory_read(io_size_multiplication, cache_line_siz
|
||||
.set_unit(Unit.Blocks4096)
|
||||
)
|
||||
|
||||
# Divergency may be casued be rounding max occupancy
|
||||
if actuall_occupancy > occupancy_limit + Size(100, Unit.Blocks4096):
|
||||
# Divergency may be caused by rounding max occupancy
|
||||
if actual_occupancy > occupancy_limit * 1.01:
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass id exceeded: {io_class.id}. "
|
||||
f"Limit: {occupancy_limit}, actuall: {actuall_occupancy}"
|
||||
f"Limit: {occupancy_limit}, actual: {actual_occupancy}"
|
||||
)
|
||||
|
||||
|
||||
@ -385,3 +386,11 @@ def test_ioclass_occupancy_sum_cache():
|
||||
f"cache stats: {cache_stats}, sumed up stats {usage_stats_sum}\n"
|
||||
f"particular stats {[get_io_class_usage(cache, i.id) for i in io_classes]}"
|
||||
)
|
||||
|
||||
|
||||
def get_io_count(io_class, cache_size, cls, io_size_multiplication):
|
||||
io_count = int((io_class.max_occupancy * cache_size) / Unit.Blocks4096 * io_size_multiplication)
|
||||
# io size needs to be aligned to cache line size
|
||||
io_count -= int(io_count % (cls.value / Unit.Blocks4096))
|
||||
|
||||
return io_count
|
||||
|
@ -100,7 +100,7 @@ def test_ioclass_resize(cache_line_size, new_occupancy):
|
||||
)
|
||||
|
||||
# Divergency may be casued be rounding max occupancy
|
||||
if actuall_occupancy > occupancy_limit + Size(100, Unit.Blocks4096):
|
||||
if actuall_occupancy > occupancy_limit * 1.01:
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass id exceeded: {io_class.id}. "
|
||||
f"Limit: {occupancy_limit}, actuall: {actuall_occupancy}"
|
||||
@ -144,7 +144,7 @@ def test_ioclass_resize(cache_line_size, new_occupancy):
|
||||
)
|
||||
|
||||
# Divergency may be casued be rounding max occupancy
|
||||
if actuall_occupancy > occupancy_limit + Size(100, Unit.Blocks4096):
|
||||
if actuall_occupancy > occupancy_limit * 1.01:
|
||||
TestRun.LOGGER.error(
|
||||
f"Occupancy for ioclass id exceeded: {io_class.id}. "
|
||||
f"Limit: {occupancy_limit}, actuall: {actuall_occupancy}"
|
||||
|
Loading…
Reference in New Issue
Block a user