X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=performance_schema%2Ffile_summary_by_instance%2Ffile_summary_by_instance_row.go;h=3e6b908931e09d6ffb8df3a3922682ac6d69388b;hb=5b55b644d9ab58c9a2ff3392fbd88107ef1a18cc;hp=d1228077439710c6954fda5ab5d0c073d22509fe;hpb=51686f03152ce2a2456023fc77ac9fb865ce2b43;p=pstop.git diff --git a/performance_schema/file_summary_by_instance/file_summary_by_instance_row.go b/performance_schema/file_summary_by_instance/file_summary_by_instance_row.go index d122807..3e6b908 100644 --- a/performance_schema/file_summary_by_instance/file_summary_by_instance_row.go +++ b/performance_schema/file_summary_by_instance/file_summary_by_instance_row.go @@ -8,9 +8,9 @@ import ( "log" "regexp" "sort" - // "strconv" "time" + "github.com/sjmudd/pstop/key_value_cache" "github.com/sjmudd/pstop/lib" ) @@ -49,30 +49,27 @@ CREATE TABLE `file_summary_by_instance` ( // /./ --> / perl: $new =~ s{/\./}{}; // // --> / perl: $new =~ s{//}{/}; const ( - re_one_or_the_other = `/(\.)?/` - re_slash_dot_dot_slash = `[^/]+/\.\./` - re_auto_cnf = `/auto\.cnf$` - re_binlog = `/binlog\.(\d{6}|index)$` - re_charset = `/share/charsets/Index\.xml$` - re_db_opt = `/db\.opt$` - re_encoded = `@(\d{4})` // FIXME - add me to catch @0024 --> $ for example - re_error_msg = `/share/[^/]+/errmsg\.sys$` - re_ibdata = `/ibdata\d+$` - re_part_table = `(.+)#P#p(\d+|MAX)` - re_pid_file = `/[^/]+\.pid$` - re_redo_log = `/ib_logfile\d+$` - re_relative_path = `^\.\./` - re_slowlog = `/slowlog$` - re_table_file = `/([^/]+)/([^/]+)\.(frm|ibd|MYD|MYI|CSM|CSV|par)$` - re_temp_table = `#sql-[0-9_]+` + re_encoded = `@(\d{4})` // FIXME - add me to catch @0024 --> $ for example ) var ( - v_one_or_the_other *regexp.Regexp = regexp.MustCompile(re_one_or_the_other) - v_slash_dot_dot_slash *regexp.Regexp = regexp.MustCompile(re_slash_dot_dot_slash) - v_table_file *regexp.Regexp = regexp.MustCompile(re_table_file) - v_temp_table *regexp.Regexp = regexp.MustCompile(re_temp_table) - v_part_table *regexp.Regexp = regexp.MustCompile(re_part_table) + re_one_or_the_other *regexp.Regexp = regexp.MustCompile(`/(\.)?/`) + re_slash_dot_dot_slash *regexp.Regexp = regexp.MustCompile(`[^/]+/\.\./`) + re_table_file *regexp.Regexp = regexp.MustCompile(`/([^/]+)/([^/]+)\.(frm|ibd|MYD|MYI|CSM|CSV|par)$`) + re_temp_table *regexp.Regexp = regexp.MustCompile(`#sql-[0-9_]+`) + re_part_table *regexp.Regexp = regexp.MustCompile(`(.+)#P#p(\d+|MAX)`) + re_ibdata *regexp.Regexp = regexp.MustCompile(`/ibdata\d+$`) + re_redo_log *regexp.Regexp = regexp.MustCompile(`/ib_logfile\d+$`) + re_binlog *regexp.Regexp = regexp.MustCompile(`/binlog\.(\d{6}|index)$`) + re_db_opt *regexp.Regexp = regexp.MustCompile(`/db\.opt$`) + re_slowlog *regexp.Regexp = regexp.MustCompile(`/slowlog$`) + re_auto_cnf *regexp.Regexp = regexp.MustCompile(`/auto\.cnf$`) + re_pid_file *regexp.Regexp = regexp.MustCompile(`/[^/]+\.pid$`) + re_error_msg *regexp.Regexp = regexp.MustCompile(`/share/[^/]+/errmsg\.sys$`) + re_charset *regexp.Regexp = regexp.MustCompile(`/share/charsets/Index\.xml$`) + re_dollar *regexp.Regexp = regexp.MustCompile(`@0024`) // FIXME - add me to catch @0024 --> $ (specific case) + + cache key_value_cache.KeyValueCache ) type file_summary_by_instance_row struct { @@ -199,8 +196,8 @@ func cleanup_path(path string) string { for { orig_path := path - path = v_one_or_the_other.ReplaceAllString(path, "/") - path = v_slash_dot_dot_slash.ReplaceAllString(path, "/") + path = re_one_or_the_other.ReplaceAllString(path, "/") + path = re_slash_dot_dot_slash.ReplaceAllString(path, "/") if orig_path == path { // no change so give up break } @@ -215,46 +212,44 @@ func (t file_summary_by_instance_row) simple_name(global_variables map[string]st path := t.FILE_NAME - // FIXME and make this work. - // re4 := regexp.MustCompile(re_encoded) - // if m4 := re4.FindStringSubmatch(path); m4 != nil { - // if value, err := strconv.ParseInt(m4[1], 16, 16); err != nil { - // // missing replace @.... with char(value) in path - // - // } - // } + if cached_result, err := cache.Get(path); err == nil { + return cached_result + } + + // @0024 --> $ (should do this more generically) + path = re_dollar.ReplaceAllLiteralString(path, "$") // this should probably be ordered from most expected regexp to least - if m1 := v_table_file.FindStringSubmatch(path); m1 != nil { + if m1 := re_table_file.FindStringSubmatch(path); m1 != nil { // we may match temporary tables so check for them - if m2 := v_temp_table.FindStringSubmatch(m1[2]); m2 != nil { - return "" + if m2 := re_temp_table.FindStringSubmatch(m1[2]); m2 != nil { + return cache.Put(path, "") } // we may match partitioned tables so check for them - if m3 := v_part_table.FindStringSubmatch(m1[2]); m3 != nil { - return m1[1] + "." + m3[1] // . (less partition info) + if m3 := re_part_table.FindStringSubmatch(m1[2]); m3 != nil { + return cache.Put(path, m1[1]+"."+m3[1]) // .
(less partition info) } - return m1[1] + "." + m1[2] // .
+ return cache.Put(path, m1[1]+"."+m1[2]) // .
} - if regexp.MustCompile(re_ibdata).MatchString(path) == true { - return "" + if re_ibdata.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_redo_log).MatchString(path) == true { - return "" + if re_redo_log.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_binlog).MatchString(path) == true { - return "" + if re_binlog.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_db_opt).MatchString(path) == true { - return "" + if re_db_opt.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_slowlog).MatchString(path) == true { - return "" + if re_slowlog.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_auto_cnf).MatchString(path) == true { - return "" + if re_auto_cnf.MatchString(path) == true { + return cache.Put(path, "") } // relay logs are a bit complicated. If a full path then easy to // identify,but if a relative path we may need to add $datadir, @@ -265,21 +260,21 @@ func (t file_summary_by_instance_row) simple_name(global_variables map[string]st if relay_log[0] != '/' { // relative path relay_log = cleanup_path(global_variables["datadir"] + relay_log) // datadir always ends in / } - relay_log_re := relay_log + `\.(\d{6}|index)$` - if regexp.MustCompile(relay_log_re).MatchString(path) == true { - return "" + re_relay_log := relay_log + `\.(\d{6}|index)$` + if regexp.MustCompile(re_relay_log).MatchString(path) == true { + return cache.Put(path, "") } } - if regexp.MustCompile(re_pid_file).MatchString(path) == true { - return "" + if re_pid_file.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_error_msg).MatchString(path) == true { - return "" + if re_error_msg.MatchString(path) == true { + return cache.Put(path, "") } - if regexp.MustCompile(re_charset).MatchString(path) == true { - return "" + if re_charset.MatchString(path) == true { + return cache.Put(path, "") } - return path + return cache.Put(path, path) } // Convert the imported "table" to a merged one with merged data.