diff --git a/server/website/website/db/base/parser.py b/server/website/website/db/base/parser.py index 3b8ca9d..cf1daba 100644 --- a/server/website/website/db/base/parser.py +++ b/server/website/website/db/base/parser.py @@ -187,10 +187,7 @@ class BaseParser: return value in self.valid_true_val or value in self.valid_false_val def convert_dbms_metrics(self, metrics, observation_time, target_objective): - metric_data = {} - # Same as metric_data except COUNTER metrics are not divided by the time - # Note: metric_data is also not divided by the time now so base_metric_data is redundant - base_metric_data = {} + numeric_metric_data = {} numeric_metric_catalog = MetricCatalog.objects.filter( dbms__id=self.dbms_id, metric_type__in=MetricType.numeric()) @@ -210,12 +207,10 @@ class BaseParser: if metadata.metric_type == MetricType.COUNTER: assert isinstance(converted, float) - base_metric_data[name] = converted - metric_data[name] = converted + numeric_metric_data[name] = converted elif metadata.metric_type == MetricType.STATISTICS: assert isinstance(converted, float) - base_metric_data[name] = converted - metric_data[name] = converted + numeric_metric_data[name] = converted else: raise ValueError( 'Unknown metric type for {}: {}'.format(name, metadata.metric_type)) @@ -227,10 +222,11 @@ class BaseParser: target_objective, ', '.join(target_list.keys()))) for target_name, target_instance in target_list.items(): - metric_data[target_name] = target_instance.compute( - base_metric_data, observation_time) + # wait_class is needed to calculate target_objectives, but it is not numeric + numeric_metric_data[target_name] = target_instance.compute( + metrics, observation_time) - return metric_data + return numeric_metric_data def extract_valid_variables(self, variables, catalog, default_value=None): valid_variables = {} diff --git a/server/website/website/views.py b/server/website/website/views.py index 7bb437b..8740f5f 100644 --- a/server/website/website/views.py +++ b/server/website/website/views.py @@ -530,27 +530,29 @@ def handle_result_files(session, files, execution_times=None): worst_result = Result.objects.filter(metric_data=worst_metric).first() last_result = Result.objects.filter(session=session).order_by("-id").first() - last_conf = JSONUtil.loads(last_result.next_configuration) - last_conf = last_conf["recommendation"] - last_conf = parser.convert_dbms_knobs(last_result.dbms.pk, last_conf) # Copy worst data and modify knob_data = worst_result.knob_data knob_data.pk = None - all_knobs = JSONUtil.loads(knob_data.knobs) - for knob in all_knobs.keys(): - for tunable_knob in last_conf.keys(): - if tunable_knob in knob: - all_knobs[knob] = last_conf[tunable_knob] - knob_data.knobs = JSONUtil.dumps(all_knobs) + if last_result.next_configuration is not None: + last_conf = JSONUtil.loads(last_result.next_configuration) + if last_conf.get("recommendation", None) is not None: + last_conf = last_conf["recommendation"] + last_conf = parser.convert_dbms_knobs(last_result.dbms.pk, last_conf) + all_knobs = JSONUtil.loads(knob_data.knobs) + for knob in all_knobs.keys(): + for tunable_knob in last_conf.keys(): + if tunable_knob in knob: + all_knobs[knob] = last_conf[tunable_knob] + knob_data.knobs = JSONUtil.dumps(all_knobs) - data_knobs = JSONUtil.loads(knob_data.data) - for knob in data_knobs.keys(): - for tunable_knob in last_conf.keys(): - if tunable_knob in knob: - data_knobs[knob] = last_conf[tunable_knob] + data_knobs = JSONUtil.loads(knob_data.data) + for knob in data_knobs.keys(): + for tunable_knob in last_conf.keys(): + if tunable_knob in knob: + data_knobs[knob] = last_conf[tunable_knob] + knob_data.data = JSONUtil.dumps(data_knobs) - knob_data.data = JSONUtil.dumps(data_knobs) knob_name_parts = last_result.knob_data.name.split('*')[0].split('#') knob_name_parts[-1] = str(int(knob_name_parts[-1]) + 1) + '*' knob_data.name = '#'.join(knob_name_parts)