fix bugs when number of tunable knobs changes or are inconsistent
This commit is contained in:
parent
1c4cc0c3ed
commit
0baaefeb92
|
@ -60,6 +60,9 @@ class BaseParser:
|
|||
return res
|
||||
|
||||
def convert_integer(self, int_value, metadata):
|
||||
if len(str(int_value)) == 0:
|
||||
# The value collected from the database is empty
|
||||
return 0
|
||||
try:
|
||||
try:
|
||||
converted = int(int_value)
|
||||
|
@ -74,8 +77,12 @@ class BaseParser:
|
|||
converted = ConversionUtil.get_raw_size(
|
||||
int_value, system=self.time_system)
|
||||
else:
|
||||
raise Exception(
|
||||
'Unknown unit type: {}'.format(metadata.unit))
|
||||
# If vartype is OTHER, try to decode it with bytes and time systems
|
||||
converted = ConversionUtil.get_raw_size(
|
||||
int_value, system=self.bytes_system)
|
||||
if converted is None:
|
||||
converted = ConversionUtil.get_raw_size(
|
||||
int_value, system=self.time_system)
|
||||
if converted is None:
|
||||
raise Exception('Invalid integer format for {}: {}'.format(
|
||||
metadata.name, int_value))
|
||||
|
@ -99,10 +106,11 @@ class BaseParser:
|
|||
str_false += str(bval) + ' '
|
||||
return str_true + '; ' + str_false
|
||||
|
||||
def convert_dbms_knobs(self, knobs):
|
||||
def convert_dbms_knobs(self, knobs, knob_catalog=None):
|
||||
knob_data = {}
|
||||
tunable_knob_catalog = KnobCatalog.objects.filter(dbms__id=self.dbms_id, tunable=True)
|
||||
for metadata in tunable_knob_catalog:
|
||||
if knob_catalog is None:
|
||||
knob_catalog = KnobCatalog.objects.filter(dbms__id=self.dbms_id, tunable=True)
|
||||
for metadata in knob_catalog:
|
||||
name = metadata.name
|
||||
if name not in knobs:
|
||||
if name.startswith('global.'):
|
||||
|
@ -159,6 +167,8 @@ class BaseParser:
|
|||
return knob_data
|
||||
|
||||
def _check_knob_num_in_range(self, value, mdata, fix_knob_range=True):
|
||||
if mdata.minval is None or mdata.maxval is None:
|
||||
return True
|
||||
minval = float(mdata.minval)
|
||||
maxval = float(mdata.maxval)
|
||||
if fix_knob_range:
|
||||
|
|
|
@ -180,12 +180,13 @@ class MyRocksParser(BaseParser):
|
|||
|
||||
return metric_data
|
||||
|
||||
def convert_dbms_knobs(self, knobs):
|
||||
def convert_dbms_knobs(self, knobs, knob_catalog=None):
|
||||
knob_data = {}
|
||||
tunable_knob_catalog = KnobCatalog.objects.filter(dbms__id=self.dbms_id, tunable=True)
|
||||
if knob_catalog is None:
|
||||
knob_catalog = KnobCatalog.objects.filter(dbms__id=self.dbms_id, tunable=True)
|
||||
for name, value in list(knobs.items()):
|
||||
prt_name = self.partial_name(name)
|
||||
metadata = tunable_knob_catalog.filter(name=prt_name).first()
|
||||
metadata = knob_catalog.filter(name=prt_name).first()
|
||||
if metadata:
|
||||
conv_value = None
|
||||
if metadata.vartype == VarType.BOOL:
|
||||
|
|
|
@ -48,8 +48,8 @@ def parse_version_string(dbms_type, version_string):
|
|||
return parsed_version
|
||||
|
||||
|
||||
def convert_dbms_knobs(dbms_id, knobs):
|
||||
return _get(dbms_id).convert_dbms_knobs(knobs)
|
||||
def convert_dbms_knobs(dbms_id, knobs, knob_catalog=None):
|
||||
return _get(dbms_id).convert_dbms_knobs(knobs, knob_catalog)
|
||||
|
||||
|
||||
def convert_dbms_metrics(dbms_id, numeric_metrics, observation_time, target_objective):
|
||||
|
|
|
@ -90,7 +90,7 @@ class ConfigurationRecommendation(BaseTask): # pylint: disable=abstract-method
|
|||
|
||||
|
||||
def clean_knob_data(knob_matrix, knob_labels, session):
|
||||
# Makes sure that all knobs in the dbms are included in the knob_matrix and knob_labels
|
||||
# Filter and amend knob_matrix and knob_labels according to the tunable knobs in the session
|
||||
knob_matrix = np.array(knob_matrix)
|
||||
session_knobs = SessionKnob.objects.get_knobs_for_session(session)
|
||||
knob_cat = [k['name'] for k in session_knobs]
|
||||
|
|
|
@ -617,11 +617,13 @@ def handle_result_files(session, files, execution_times=None):
|
|||
# Load, process, and store the knobs in the DBMS's configuration
|
||||
knob_dict, knob_diffs = parser.parse_dbms_knobs(
|
||||
dbms.pk, JSONUtil.loads(files['knobs']))
|
||||
tunable_knob_dict = parser.convert_dbms_knobs(
|
||||
dbms.pk, knob_dict)
|
||||
knob_to_convert = KnobCatalog.objects.filter(dbms=dbms).exclude(
|
||||
vartype=VarType.STRING).exclude(vartype=VarType.TIMESTAMP)
|
||||
converted_knob_dict = parser.convert_dbms_knobs(
|
||||
dbms.pk, knob_dict, knob_to_convert)
|
||||
knob_data = KnobData.objects.create_knob_data(
|
||||
session, JSONUtil.dumps(knob_dict, pprint=True, sort=True),
|
||||
JSONUtil.dumps(tunable_knob_dict, pprint=True, sort=True), dbms)
|
||||
JSONUtil.dumps(converted_knob_dict, pprint=True, sort=True), dbms)
|
||||
|
||||
# Load, process, and store the runtime metrics exposed by the DBMS
|
||||
initial_metric_dict, initial_metric_diffs = parser.parse_dbms_metrics(
|
||||
|
|
Loading…
Reference in New Issue