From 47f7638d603aba66d835b26b75369de314a4f7e4 Mon Sep 17 00:00:00 2001 From: Hartley McGuire Date: Wed, 27 Aug 2025 16:06:49 +0000 Subject: [PATCH] PT-2015 Fix pt-config-diff not sorting flags Previously, flags would be compared in the exact order they are output by MySQL, which can result in false negatives if the input ordering does not match. Example from the ticket: ``` [root@avvr-dbm51 ~]# pt-config-diff /etc/my.cnf h=localhost,P=3047 1 config difference Variable /etc/my.cnf avvr-dbm51 ========================= ============ ============ myisam_recover_options FORCE,BACKUP BACKUP,FORCE ``` This commit fixes the issue by sorting the flags before comparison to ensure that any ordering differences will not report a diff. Co-authored-by: Jonathan Gnagy --- bin/pt-config-diff | 4 ++++ lib/MySQLConfigComparer.pm | 4 ++++ t/lib/MySQLConfigComparer.t | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/bin/pt-config-diff b/bin/pt-config-diff index a6358afd..9c619646 100755 --- a/bin/pt-config-diff +++ b/bin/pt-config-diff @@ -3701,6 +3701,10 @@ sub _normalize_value { $val = defined $val ? $val : ''; $val = $alt_val_for{$val} if exists $alt_val_for{$val}; + if ( $val =~ m/,/ && !$is_dir && !$base_path) { + $val = join(',', sort(split(',', $val))); + } + if ( $val ) { if ( $is_dir ) { $val .= '/' unless $val =~ m/\/$/; diff --git a/lib/MySQLConfigComparer.pm b/lib/MySQLConfigComparer.pm index a09aefd7..114297b1 100644 --- a/lib/MySQLConfigComparer.pm +++ b/lib/MySQLConfigComparer.pm @@ -295,6 +295,10 @@ sub _normalize_value { $val = defined $val ? $val : ''; $val = $alt_val_for{$val} if exists $alt_val_for{$val}; + if ( $val =~ m/,/ && !$is_dir && !$base_path) { + $val = join(',', sort(split(',', $val))); + } + if ( $val ) { if ( $is_dir ) { $val .= '/' unless $val =~ m/\/$/; diff --git a/t/lib/MySQLConfigComparer.t b/t/lib/MySQLConfigComparer.t index 3977fd44..5ad852f3 100644 --- a/t/lib/MySQLConfigComparer.t +++ b/t/lib/MySQLConfigComparer.t @@ -369,6 +369,30 @@ $c2 = new MySQLConfig( ) or print Dumper($diff); } +# ############################################################################ +# PS-2015 pt-config-diff doesn't diff ordered flags +# ############################################################################ +$c1 = new MySQLConfig( + result_set => [['log_slow_verbosity', 'innodb,microtime']], + format => 'show_variables', +); +$c2 = new MySQLConfig( + result_set => [['log_slow_verbosity', 'microtime,innodb']], + format => 'show_variables', +); + +{ + $diff = $cc->diff( + configs => [$c1, $c2], + ); + + is_deeply( + $diff, + undef, + "Values are same regardless of order" + ) or diag(Dumper($diff)); +} + # ############################################################################ # https://bugs.launchpad.net/percona-toolkit/+bug/889739 # pt-config-diff doesn't diff quoted strings properly