clean up convert_dbms_metrics; fix invalid results handling bug
This commit is contained in:
parent
285522a0f5
commit
4e290c9548
|
@ -187,10 +187,7 @@ class BaseParser:
|
||||||
return value in self.valid_true_val or value in self.valid_false_val
|
return value in self.valid_true_val or value in self.valid_false_val
|
||||||
|
|
||||||
def convert_dbms_metrics(self, metrics, observation_time, target_objective):
|
def convert_dbms_metrics(self, metrics, observation_time, target_objective):
|
||||||
metric_data = {}
|
numeric_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_catalog = MetricCatalog.objects.filter(
|
numeric_metric_catalog = MetricCatalog.objects.filter(
|
||||||
dbms__id=self.dbms_id, metric_type__in=MetricType.numeric())
|
dbms__id=self.dbms_id, metric_type__in=MetricType.numeric())
|
||||||
|
|
||||||
|
@ -210,12 +207,10 @@ class BaseParser:
|
||||||
|
|
||||||
if metadata.metric_type == MetricType.COUNTER:
|
if metadata.metric_type == MetricType.COUNTER:
|
||||||
assert isinstance(converted, float)
|
assert isinstance(converted, float)
|
||||||
base_metric_data[name] = converted
|
numeric_metric_data[name] = converted
|
||||||
metric_data[name] = converted
|
|
||||||
elif metadata.metric_type == MetricType.STATISTICS:
|
elif metadata.metric_type == MetricType.STATISTICS:
|
||||||
assert isinstance(converted, float)
|
assert isinstance(converted, float)
|
||||||
base_metric_data[name] = converted
|
numeric_metric_data[name] = converted
|
||||||
metric_data[name] = converted
|
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
'Unknown metric type for {}: {}'.format(name, metadata.metric_type))
|
'Unknown metric type for {}: {}'.format(name, metadata.metric_type))
|
||||||
|
@ -227,10 +222,11 @@ class BaseParser:
|
||||||
target_objective, ', '.join(target_list.keys())))
|
target_objective, ', '.join(target_list.keys())))
|
||||||
|
|
||||||
for target_name, target_instance in target_list.items():
|
for target_name, target_instance in target_list.items():
|
||||||
metric_data[target_name] = target_instance.compute(
|
# wait_class is needed to calculate target_objectives, but it is not numeric
|
||||||
base_metric_data, observation_time)
|
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):
|
def extract_valid_variables(self, variables, catalog, default_value=None):
|
||||||
valid_variables = {}
|
valid_variables = {}
|
||||||
|
|
|
@ -530,27 +530,29 @@ def handle_result_files(session, files, execution_times=None):
|
||||||
|
|
||||||
worst_result = Result.objects.filter(metric_data=worst_metric).first()
|
worst_result = Result.objects.filter(metric_data=worst_metric).first()
|
||||||
last_result = Result.objects.filter(session=session).order_by("-id").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
|
# Copy worst data and modify
|
||||||
knob_data = worst_result.knob_data
|
knob_data = worst_result.knob_data
|
||||||
knob_data.pk = None
|
knob_data.pk = None
|
||||||
all_knobs = JSONUtil.loads(knob_data.knobs)
|
if last_result.next_configuration is not None:
|
||||||
for knob in all_knobs.keys():
|
last_conf = JSONUtil.loads(last_result.next_configuration)
|
||||||
for tunable_knob in last_conf.keys():
|
if last_conf.get("recommendation", None) is not None:
|
||||||
if tunable_knob in knob:
|
last_conf = last_conf["recommendation"]
|
||||||
all_knobs[knob] = last_conf[tunable_knob]
|
last_conf = parser.convert_dbms_knobs(last_result.dbms.pk, last_conf)
|
||||||
knob_data.knobs = JSONUtil.dumps(all_knobs)
|
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)
|
data_knobs = JSONUtil.loads(knob_data.data)
|
||||||
for knob in data_knobs.keys():
|
for knob in data_knobs.keys():
|
||||||
for tunable_knob in last_conf.keys():
|
for tunable_knob in last_conf.keys():
|
||||||
if tunable_knob in knob:
|
if tunable_knob in knob:
|
||||||
data_knobs[knob] = last_conf[tunable_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 = last_result.knob_data.name.split('*')[0].split('#')
|
||||||
knob_name_parts[-1] = str(int(knob_name_parts[-1]) + 1) + '*'
|
knob_name_parts[-1] = str(int(knob_name_parts[-1]) + 1) + '*'
|
||||||
knob_data.name = '#'.join(knob_name_parts)
|
knob_data.name = '#'.join(knob_name_parts)
|
||||||
|
|
Loading…
Reference in New Issue