def gather_mini_dump()

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