X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flibs%2Frdbms%2FTransactionProfiler.php;h=12f6df5d4ab278d8a11076f61f998cdeda6d0464;hb=7f3d6713e7191c476adb3d3c30344a0327b853d3;hp=4d2b28fdd5a2ff665aae9823dddc93e8948cf86a;hpb=48df0714bbfe0d5cf3ced3de9081c02d583d78c3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/rdbms/TransactionProfiler.php b/includes/libs/rdbms/TransactionProfiler.php index 4d2b28fdd5..823e0dc5cd 100644 --- a/includes/libs/rdbms/TransactionProfiler.php +++ b/includes/libs/rdbms/TransactionProfiler.php @@ -22,9 +22,12 @@ * @author Aaron Schulz */ +namespace Wikimedia\Rdbms; + use Psr\Log\LoggerInterface; use Psr\Log\LoggerAwareInterface; use Psr\Log\NullLogger; +use RuntimeException; /** * Helper class that detects high-contention DB queries via profiling calls @@ -80,11 +83,15 @@ class TransactionProfiler implements LoggerAwareInterface { } /** - * @param bool $value + * @param bool $value New value + * @return bool Old value * @since 1.28 */ public function setSilenced( $value ) { + $old = $this->silenced; $this->silenced = $value; + + return $old; } /** @@ -258,8 +265,9 @@ class TransactionProfiler implements LoggerAwareInterface { * @param string $db DB name * @param string $id ID string of transaction * @param float $writeTime Time spent in write queries + * @param integer $affected Number of rows affected by writes */ - public function transactionWritingOut( $server, $db, $id, $writeTime = 0.0 ) { + public function transactionWritingOut( $server, $db, $id, $writeTime = 0.0, $affected = 0 ) { $name = "{$server} ({$db}) (TRX#$id)"; if ( !isset( $this->dbTrxMethodTimes[$name] ) ) { $this->logger->info( "Detected no transaction for '$name' - out of sync." ); @@ -277,6 +285,14 @@ class TransactionProfiler implements LoggerAwareInterface { ); $slow = true; } + // Warn if too many rows were changed... + if ( $affected > $this->expect['maxAffected'] ) { + $this->reportExpectationViolated( + 'maxAffected', + "[transaction $id writes to {$server} ({$db})]", + $affected + ); + } // Fill in the last non-query period... $lastQuery = end( $this->dbTrxMethodTimes[$name] ); if ( $lastQuery ) { @@ -295,13 +311,15 @@ class TransactionProfiler implements LoggerAwareInterface { } } if ( $slow ) { - $dbs = implode( ', ', array_keys( $this->dbTrxHoldingLocks[$name]['conns'] ) ); - $msg = "Sub-optimal transaction on DB(s) [{$dbs}]:\n"; + $trace = ''; foreach ( $this->dbTrxMethodTimes[$name] as $i => $info ) { list( $query, $sTime, $end ) = $info; - $msg .= sprintf( "%d\t%.6f\t%s\n", $i, ( $end - $sTime ), $query ); + $trace .= sprintf( "%d\t%.6f\t%s\n", $i, ( $end - $sTime ), $query ); } - $this->logger->info( $msg ); + $this->logger->info( "Sub-optimal transaction on DB(s) [{dbs}]: \n{trace}", [ + 'dbs' => implode( ', ', array_keys( $this->dbTrxHoldingLocks[$name]['conns'] ) ), + 'trace' => $trace + ] ); } unset( $this->dbTrxHoldingLocks[$name] ); unset( $this->dbTrxMethodTimes[$name] );