def test_acp_param_flush_max_buffers(cache_line_size, cache_mode): """ title: Functional test for ACP flush-max-buffers parameter. description: | Verify if there is appropriate number of I/O requests between wake-up time intervals, which depends on flush-max-buffer parameter. pass_criteria: - ACP triggered dirty data flush - Number of writes to core is lower or equal than flush_max_buffers """ with TestRun.step("Test prepare."): buffer_values = get_random_list( min_val=FlushParametersAcp.acp_params_range().flush_max_buffers[0], max_val=FlushParametersAcp.acp_params_range().flush_max_buffers[1], n=10, ) default_config = FlushParametersAcp.default_acp_params() acp_configs = [ FlushParametersAcp(flush_max_buffers=buf, wake_up_time=Time(seconds=1)) for buf in buffer_values ] acp_configs.append(default_config) with TestRun.step("Prepare partitions."): core_size = Size(5, Unit.GibiByte) cache_device = TestRun.disks["cache"] core_device = TestRun.disks["core"] cache_device.create_partitions([Size(10, Unit.GibiByte)]) core_device.create_partitions([core_size]) with TestRun.step( f"Start cache in {cache_mode} with {cache_line_size} and add core." ): cache = casadm.start_cache(cache_device.partitions[0], cache_mode, cache_line_size) core = cache.add_core(core_device.partitions[0]) with TestRun.step("Set cleaning policy to NOP."): cache.set_cleaning_policy(CleaningPolicy.nop) with TestRun.step("Start IO in background."): fio = get_fio_cmd(core, core_size) fio.run_in_background() time.sleep(10) with TestRun.step("Set cleaning policy to ACP."): cache.set_cleaning_policy(CleaningPolicy.acp) with TestRun.group( "Verify IO number for different max_flush_buffers values."): for acp_config in acp_configs: with TestRun.step(f"Setting {acp_config}"): cache.set_params_acp(acp_config) with TestRun.step( "Using blktrace verify if there is appropriate number of I/O requests, " "which depends on flush-max-buffer parameter."): blktrace = BlkTrace(core.core_device, BlkTraceMask.write) blktrace.start_monitoring() time.sleep(20) blktrace_output = blktrace.stop_monitoring() cleaning_started = False flush_writes = 0 for (prev, curr) in zip(blktrace_output, blktrace_output[1:]): if cleaning_started and write_to_core(prev): flush_writes += 1 if new_acp_iteration(prev, curr): if cleaning_started: if flush_writes <= acp_config.flush_max_buffers: flush_writes = 0 else: TestRun.LOGGER.error( f"Incorrect number of handled io requests. " f"Expected {acp_config.flush_max_buffers} - " f"actual {flush_writes}") flush_writes = 0 cleaning_started = True if not cleaning_started: TestRun.fail(f"ACP flush not triggered for {acp_config}") with TestRun.step("Stop all caches"): kill_all_io() casadm.stop_all_caches()
def test_acp_param_wake_up_time(cache_line_size, cache_mode): """ title: Functional test for ACP wake-up parameter. description: | Verify if interval between ACP cleaning iterations is not longer than wake-up time parameter value. pass_criteria: - ACP flush iterations are triggered with defined frequency. """ with TestRun.step("Test prepare."): error_threshold_ms = 50 generated_vals = get_random_list( min_val=FlushParametersAcp.acp_params_range().wake_up_time[0], max_val=FlushParametersAcp.acp_params_range().wake_up_time[1], n=10, ) acp_configs = [] for config in generated_vals: acp_configs.append( FlushParametersAcp(wake_up_time=Time(milliseconds=config))) acp_configs.append(FlushParametersAcp.default_acp_params()) with TestRun.step("Prepare partitions."): core_size = Size(5, Unit.GibiByte) cache_device = TestRun.disks["cache"] core_device = TestRun.disks["core"] cache_device.create_partitions([Size(10, Unit.GibiByte)]) core_device.create_partitions([core_size]) with TestRun.step( f"Start cache in {cache_mode} with {cache_line_size} and add core." ): cache = casadm.start_cache(cache_device.partitions[0], cache_mode, cache_line_size) core = cache.add_core(core_device.partitions[0]) with TestRun.step("Set cleaning policy to NOP."): cache.set_cleaning_policy(CleaningPolicy.nop) with TestRun.step("Start IO in background."): fio = get_fio_cmd(core, core_size) fio.run_in_background() time.sleep(10) with TestRun.step("Set cleaning policy to ACP."): cache.set_cleaning_policy(CleaningPolicy.acp) with TestRun.group("Verify IO number for different wake_up_time values."): for acp_config in acp_configs: with TestRun.step(f"Setting {acp_config}"): cache.set_params_acp(acp_config) accepted_interval_threshold = ( acp_config.wake_up_time.total_milliseconds() + error_threshold_ms) with TestRun.step( "Using blktrace verify if interval between ACP cleaning iterations " f"is shorter or equal than wake-up parameter value " f"(including {error_threshold_ms}ms error threshold)"): blktrace = BlkTrace(core.core_device, BlkTraceMask.write) blktrace.start_monitoring() time.sleep(15) blktrace_output = blktrace.stop_monitoring() for (prev, curr) in zip(blktrace_output, blktrace_output[1:]): if not new_acp_iteration(prev, curr): continue interval_ms = (curr.timestamp - prev.timestamp) / 10**6 if interval_ms > accepted_interval_threshold: TestRun.LOGGER.error( f"{interval_ms} is not within accepted range for " f"{acp_config.wake_up_time.total_milliseconds()} " f"wake_up_time param value.") with TestRun.step("Stop all caches"): kill_all_io() casadm.stop_all_caches()
def test_set_get_cleaning_params(cache_mode, cleaning_policy): """ title: Test for setting and reading cleaning parameters. description: | Verify that it is possible to set and read all available cleaning parameters for all cleaning policies using casadm --set-param and --get-param options. pass_criteria: - All cleaning parameters are set to given values. - All cleaning parameters displays proper values. """ with TestRun.step("Partition cache and core devices"): cache_dev, core_dev = storage_prepare() with TestRun.step( f"Start {caches_count} caches in {cache_mode} cache mode " f"and add {cores_per_cache} cores per cache"): caches, cores = cache_prepare(cache_mode, cache_dev, core_dev) with TestRun.step(f"Set cleaning policy to {cleaning_policy}"): if cleaning_policy != CleaningPolicy.DEFAULT: for i in range(caches_count): caches[i].set_cleaning_policy(cleaning_policy) for i in range(caches_count): current_cleaning_policy = caches[i].get_cleaning_policy() if current_cleaning_policy != cleaning_policy: TestRun.fail( f"Cleaning policy for cache nr {caches[i].cache_id} " f"is {current_cleaning_policy}, should be {cleaning_policy}" ) with TestRun.step( f"Check {cleaning_policy} cleaning policy default parameters"): if cleaning_policy == CleaningPolicy.alru: default_cleaning_params = FlushParametersAlru.default_alru_params() if cleaning_policy == CleaningPolicy.acp: default_cleaning_params = FlushParametersAcp.default_acp_params() for i in range(caches_count): check_cleaning_parameters(caches[i], cleaning_policy, default_cleaning_params) with TestRun.step(f"Set new random values for {cleaning_policy} " f"cleaning policy parameters for one cache instance"): for check in range(number_of_checks): random_cleaning_params = new_cleaning_parameters_random_values( cleaning_policy) if cleaning_policy == CleaningPolicy.alru: caches[0].set_params_alru(random_cleaning_params) if cleaning_policy == CleaningPolicy.acp: caches[0].set_params_acp(random_cleaning_params) # Check changed parameters for first cache instance: check_cleaning_parameters(caches[0], cleaning_policy, random_cleaning_params) # Check default parameters for other cache instances: for i in range(1, caches_count): check_cleaning_parameters(caches[i], cleaning_policy, default_cleaning_params) with TestRun.step(f"Set new random values for {cleaning_policy} " f"cleaning policy parameters for all cache instances"): for check in range(number_of_checks): cleaning_params = [] for i in range(caches_count): random_cleaning_params = new_cleaning_parameters_random_values( cleaning_policy) cleaning_params.append(random_cleaning_params) if cleaning_policy == CleaningPolicy.alru: caches[i].set_params_alru(random_cleaning_params) if cleaning_policy == CleaningPolicy.acp: caches[i].set_params_acp(random_cleaning_params) for i in range(caches_count): check_cleaning_parameters(caches[i], cleaning_policy, cleaning_params[i])