diff --git a/omniadvisor/src/omniadvisor/service/retest_service.py b/omniadvisor/src/omniadvisor/service/retest_service.py index 061319584679388c097b388f5b40120bfb0a4ec3..efb641708bc06801113207d30c42118901247bd8 100644 --- a/omniadvisor/src/omniadvisor/service/retest_service.py +++ b/omniadvisor/src/omniadvisor/service/retest_service.py @@ -35,6 +35,6 @@ def retest(load: Load, config: dict): # 若是出现异常配置,也要退出 global_logger.warning('Retest failed in round %d. Exception source: Spark exception: %s.', i, spark_output) tuning_result = get_tuning_result(load, config) - if tuning_result.failed_times >= OA_CONF.config_fail_threshold: + if tuning_result.failed_count >= OA_CONF.config_fail_threshold: global_logger.info('The number of retest failures has reached the failure threshold.') return diff --git a/omniadvisor/src/omniadvisor/service/tuning_result/tuning_result.py b/omniadvisor/src/omniadvisor/service/tuning_result/tuning_result.py index 233103825d05423a9c5b6e9cc2142170f6e46aee..9954120586a6f8b96d99f12d09fd1298f6f0fc65 100644 --- a/omniadvisor/src/omniadvisor/service/tuning_result/tuning_result.py +++ b/omniadvisor/src/omniadvisor/service/tuning_result/tuning_result.py @@ -85,13 +85,17 @@ class TuningResult: return self._tuning_record.rounds @property - def exam_times(self): + def exam_count(self): return len(self._exam_records) @property - def failed_times(self): + def failed_count(self): return sum([exam_record.status == OA_CONF.ExecStatus.fail for exam_record in self._exam_records]) + @property + def completed_count(self): + return sum([exam_record.status != OA_CONF.ExecStatus.running for exam_record in self._exam_records]) + @property def status(self): """ @@ -101,9 +105,9 @@ class TuningResult: 复测中:复测次数小于指定复测次数,且失败次数没有超过阈值,复测流程尚在进行中 :return: """ - if self.failed_times >= OA_CONF.config_fail_threshold: + if self.failed_count >= OA_CONF.config_fail_threshold: overall_status = OA_CONF.ExecStatus.fail - elif len(self._exam_records) >= OA_CONF.tuning_retest_times: + elif self.completed_count >= OA_CONF.tuning_retest_times: overall_status = OA_CONF.ExecStatus.success else: overall_status = OA_CONF.ExecStatus.running @@ -111,6 +115,9 @@ class TuningResult: @property def runtime(self): + if self.status == OA_CONF.ExecStatus.fail: + return OA_CONF.exec_fail_return_runtime + # 计算执行状态为success的平均runtime success_runtimes = [ exam_record.runtime @@ -125,6 +132,9 @@ class TuningResult: @property def trace(self): + if self.status == OA_CONF.ExecStatus.fail: + return OA_CONF.exec_fail_return_trace + success_exam_results = [ exam_record for exam_record in self._exam_records if exam_record.status == OA_CONF.ExecStatus.success diff --git a/omniadvisor/tests/omniadvisor/interface/test_config_tuning.py b/omniadvisor/tests/omniadvisor/interface/test_config_tuning.py index 660db90490247e341be32210d7f83d13fcd29e9a..dd4d701b23118195a593a096ff85f6f061deac11 100644 --- a/omniadvisor/tests/omniadvisor/interface/test_config_tuning.py +++ b/omniadvisor/tests/omniadvisor/interface/test_config_tuning.py @@ -65,7 +65,7 @@ class TestTuning: mock_spark_run.return_value = mock_exam_record, spark_output mock_smac_tuning.return_value = self.tune_return_val mock_tuning_result = MagicMock() - mock_tuning_result.failed_times = OA_CONF.config_fail_threshold + mock_tuning_result.failed_count = OA_CONF.config_fail_threshold mock_get_tuning_result.return_value = mock_tuning_result tuning_result_history = MagicMock() tuning_result_history.best_config = {**self.load.default_config, **self.tune_return_val[0]} diff --git a/omniadvisor/tests/omniadvisor/service/tuning_result/test_tuning_result.py b/omniadvisor/tests/omniadvisor/service/tuning_result/test_tuning_result.py index 0d6759328764d824e04388754928374c4a038767..ff50acfaa70269607a74fcd71d3fd37f2135b9a6 100644 --- a/omniadvisor/tests/omniadvisor/service/tuning_result/test_tuning_result.py +++ b/omniadvisor/tests/omniadvisor/service/tuning_result/test_tuning_result.py @@ -17,7 +17,9 @@ class TestTuningResult: # Mocking TuningRecord and ExamRecord tuning_record_mock = MagicMock() - task_mock = MagicMock() + exam_record_mock_1 = MagicMock() + exam_record_mock_2 = MagicMock() + exam_record_mock_3 = MagicMock() # Set up mock attributes for tuning record tuning_record_mock.config = {"param1": "value1", "param2": "value2"} @@ -26,20 +28,28 @@ class TestTuningResult: tuning_record_mock.rounds = 1 # Set up mock attributes for exam record - task_mock.status = OA_CONF.ExecStatus.success - task_mock.runtime = 10 - task_mock.trace = "trace_info" - - return load, config, tuning_record_mock, task_mock + exam_record_mock_1.status = OA_CONF.ExecStatus.success + exam_record_mock_1.runtime = 10 + exam_record_mock_1.trace = "trace_info1" + exam_record_mock_2.status = OA_CONF.ExecStatus.success + exam_record_mock_2.runtime = 8 + exam_record_mock_2.trace = "trace_info2" + exam_record_mock_3.status = OA_CONF.ExecStatus.success + exam_record_mock_3.runtime = 12 + exam_record_mock_3.trace = "trace_info3" + + return load, config, tuning_record_mock, [exam_record_mock_1, exam_record_mock_2, exam_record_mock_3] @patch('omniadvisor.service.tuning_result.tuning_result.TuningRecordRepository.query_by_load_and_config') @patch('omniadvisor.service.tuning_result.tuning_result.ExamRecordRepository.query_by_load_and_config') def test_get_tuning_result(self, mock_task_query, mock_tuning_record_query, setup_mocks): - load, config, tuning_record_mock, task_mock = setup_mocks + # 强制设定复测次数为3,用于测试 + OA_CONF.tuning_retest_times = 3 - # Set return values for mocks + # 准备测试数据 + load, config, tuning_record_mock, exam_record_mock_list = setup_mocks mock_tuning_record_query.return_value = [tuning_record_mock] - mock_task_query.return_value = [task_mock] + mock_task_query.return_value = exam_record_mock_list result = get_tuning_result(load, config) @@ -51,28 +61,16 @@ class TestTuningResult: assert result.runtime == 10 def test_tuning_result_property(self, setup_mocks): - _, _, tuning_record_mock, _ = setup_mocks - - # 准备测试数据 - task_mock1 = MagicMock() - task_mock1.status = OA_CONF.ExecStatus.success - task_mock1.runtime = 10 - task_mock1.trace = "trace_info1" - task_mock2 = MagicMock() - task_mock2.status = OA_CONF.ExecStatus.success - task_mock2.runtime = 15 - task_mock2.trace = "trace_info2" - task_mock3 = MagicMock() - task_mock3.status = OA_CONF.ExecStatus.fail - task_mock3.runtime = 10 - task_mock3.trace = "trace_info3" # 强制设定复测次数为3,用于测试 OA_CONF.tuning_retest_times = 3 - tasks = [task_mock1, task_mock2] + # 准备测试数据 + _, _, tuning_record_mock, exam_record_mock_list = setup_mocks + exam_record_mock_list[-1].status = OA_CONF.ExecStatus.running + tuning_result = TuningResult( tuning_record=tuning_record_mock, - exam_records=tasks + exam_records=exam_record_mock_list ) assert tuning_result.config == {"param1": "value1", "param2": "value2"} @@ -80,15 +78,16 @@ class TestTuningResult: assert tuning_result.method_extend == "method_extend1" assert tuning_result.rounds == 1 assert tuning_result.status == OA_CONF.ExecStatus.running - assert tuning_result.runtime == 12.5 - assert tuning_result.trace == "trace_info1" + assert tuning_result.runtime == 9 + assert tuning_result.trace == "trace_info2" - tasks = [task_mock1, task_mock2, task_mock3] + # 准备测试数据 + exam_record_mock_list[-1].status = OA_CONF.ExecStatus.fail tuning_result = TuningResult( tuning_record=tuning_record_mock, - exam_records=tasks + exam_records=exam_record_mock_list ) assert tuning_result.status == OA_CONF.ExecStatus.fail - assert tuning_result.runtime == 12.5 - assert tuning_result.trace == "trace_info1" + assert tuning_result.runtime == OA_CONF.exec_fail_return_runtime + assert tuning_result.trace == OA_CONF.exec_fail_return_trace