From abe9998afed30544e9b8dc57862fedd9f7508f9c Mon Sep 17 00:00:00 2001 From: Marcelo Ferreira Date: Tue, 12 May 2026 11:53:43 +0200 Subject: [PATCH 1/2] Fix EWMA calculation for WeightedAvgRate Average number of rows and average time taken to process rows are convergent to the average by adding the 1-weight to the calculation. Previous calculation was divergent and a not correct implementation of ewma The result of update() is not affected due to the proportional calculation of number-rows/time-taken --- lib/WeightedAvgRate.pm | 4 ++-- t/lib/WeightedAvgRate.t | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/WeightedAvgRate.pm b/lib/WeightedAvgRate.pm index 138c1f6e1..3ae7fd65a 100644 --- a/lib/WeightedAvgRate.pm +++ b/lib/WeightedAvgRate.pm @@ -69,8 +69,8 @@ sub update { PTDEBUG && _d('Source op time:', $n, 'n /', $t, 's'); if ( $self->{avg_n} && $self->{avg_t} ) { - $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + $n; - $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + $t; + $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + ($n * (1 - $self->{weight})); + $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + ($t * (1 - $self->{weight})); $self->{avg_rate} = $self->{avg_n} / $self->{avg_t}; PTDEBUG && _d('Weighted avg rate:', $self->{avg_rate}, 'n/s'); } diff --git a/t/lib/WeightedAvgRate.t b/t/lib/WeightedAvgRate.t index 99ccd8790..beaefe07d 100644 --- a/t/lib/WeightedAvgRate.t +++ b/t/lib/WeightedAvgRate.t @@ -36,7 +36,7 @@ for (1..5) { } is( $rll->update(1000, 2), - 540, + 548, "Decrease rate, decrease n" ); From 03fb40834763504dbc67532ea651bca07a5891d3 Mon Sep 17 00:00:00 2001 From: Marcelo Ferreira Date: Tue, 12 May 2026 11:53:51 +0200 Subject: [PATCH 2/2] Update tools with weighted average rate --- bin/pt-online-schema-change | 4 ++-- bin/pt-table-checksum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index 3293048a7..f28bf8cab 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -5659,8 +5659,8 @@ sub update { PTDEBUG && _d('Source op time:', $n, 'n /', $t, 's'); if ( $self->{avg_n} && $self->{avg_t} ) { - $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + $n; - $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + $t; + $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + ($n * (1 - $self->{weight})); + $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + ($t * (1 - $self->{weight})); $self->{avg_rate} = $self->{avg_n} / $self->{avg_t}; PTDEBUG && _d('Weighted avg rate:', $self->{avg_rate}, 'n/s'); } diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index 1fed83eec..0e697eae7 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -9724,8 +9724,8 @@ sub update { PTDEBUG && _d('Source op time:', $n, 'n /', $t, 's'); if ( $self->{avg_n} && $self->{avg_t} ) { - $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + $n; - $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + $t; + $self->{avg_n} = ($self->{avg_n} * $self->{weight}) + ($n * (1 - $self->{weight})); + $self->{avg_t} = ($self->{avg_t} * $self->{weight}) + ($t * (1 - $self->{weight})); $self->{avg_rate} = $self->{avg_n} / $self->{avg_t}; PTDEBUG && _d('Weighted avg rate:', $self->{avg_rate}, 'n/s'); }