in automation/tincrepo/main/mpp/models/sql_tc.py [0:0]
def gather_mini_dump(self, sql_file=None, out_dir=None, minidump_file=None):
"""
Utility method to gather mini dumps for test queries.
Set gp_opt_minidump to on, explain test query and gather mini-dump to out_dir
"""
tinctest.logger.trace_in("sql_file: " + str(sql_file) + "; out_dir: " + str(out_dir) + "; minidump_file: " + str(minidump_file) + ";")
if not sql_file:
sql_file = self.sql_file
if not out_dir:
out_dir = self.get_out_dir()
# Handle where self.sql_file might be None
if not sql_file:
tinctest.logger.warning("SQL file is not defined.")
tinctest.logger.trace_out()
return None
if not os.path.exists(sql_file):
tinctest.logger.warning("SQL file %s does not exist." %sql_file)
tinctest.logger.trace_out()
return None
if not os.path.exists(out_dir):
TINCSystem.make_dirs(out_dir, ignore_exists_error = True)
opt_md_sql_file = os.path.join(out_dir, os.path.basename(sql_file).replace('.sql', '_opt_md.sql'))
with open(opt_md_sql_file, 'w') as mini_dump_sql:
with open(sql_file, 'r') as original_sql:
opt_write = False
for line in original_sql:
if not line.startswith('--') and not opt_write:
# Add optimizer settings and then add the line
mini_dump_sql.write('-- start_ignore\n')
mini_dump_sql.write('set optimizer = on; \n')
mini_dump_sql.write('set optimizer_minidump = always;\n')
mini_dump_sql.write('-- end_ignore\n')
# TODO - For now we assume only one valid SQL block following metadata
# and blindly add explain. This should suffice for the first demo
# with TPC-H tests. We will handle other cases later.
mini_dump_sql.write('explain ' + line)
opt_write = True
else:
mini_dump_sql.write(line)
# Remove existing minidumps in $MASTER_DATA_DIRECTORY. Would be nice to have a GUC
# to control location , name of the Mini-dump that gets generated.
mdd = os.environ.get('MASTER_DATA_DIRECTORY', None)
if not mdd:
tinctest.logger.warning("Not gathering mini dump because MASTER_DATA_DIRECTORY is not set.")
tinctest.logger.trace_out()
return None
mini_dump_directory = os.path.join(mdd, 'minidumps')
if os.path.exists(mini_dump_directory):
for f in os.listdir(mdd):
if fnmatch(f, 'Minidump_*.mdp'):
os.remove(os.path.join(mdd,f))
# Run opt_md_sql_file and copy the generated mini-dump over to out dir
out_file = os.path.join(out_dir, os.path.basename(opt_md_sql_file).replace('.sql','.out'))
tinctest.logger.info("Gathering mini-dump from sql : " + opt_md_sql_file)
PSQL.run_sql_file(opt_md_sql_file, dbname = self.db_name, out_file = out_file)
# Copy generated minidump from MASTER_DATA_DIRECTORY to out_dir
if not os.path.exists(mini_dump_directory):
tinctest.logger.warning("Minidump does not seem to be generated. Check %s for more information." %out_file)
tinctest.logger.trace_out()
return None
for f in os.listdir(mini_dump_directory):
if fnmatch(f, 'Minidump_*.mdp'):
if not minidump_file:
test_md_file = os.path.join(out_dir, os.path.basename(self.sql_file).replace('.sql', '_minidump.mdp'))
else:
test_md_file = minidump_file
shutil.copyfile(os.path.join(mini_dump_directory, f), test_md_file)
tinctest.logger.info("Minidump gathered at %s." %test_md_file)
tinctest.logger.trace_out("test_md_file: " + str(test_md_file))
return test_md_file
tinctest.logger.warning("Minidump does not seem to be generated. Check %s for more information." %out_file)
tinctest.logger.trace_out()
return None