*
* @file
* @ingroup Profiler
- * @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
*/
public function recordConnection( $server, $db, $isMaster ) {
// Report when too many connections happen...
- if ( $this->hits['conns']++ == $this->expect['conns'] ) {
- $this->reportExpectationViolated( 'conns', "[connect to $server ($db)]" );
+ if ( $this->hits['conns']++ >= $this->expect['conns'] ) {
+ $this->reportExpectationViolated(
+ 'conns', "[connect to $server ($db)]", $this->hits['conns'] );
}
- if ( $isMaster && $this->hits['masterConns']++ == $this->expect['masterConns'] ) {
- $this->reportExpectationViolated( 'masterConns', "[connect to $server ($db)]" );
+ if ( $isMaster && $this->hits['masterConns']++ >= $this->expect['masterConns'] ) {
+ $this->reportExpectationViolated(
+ 'masterConns', "[connect to $server ($db)]", $this->hits['masterConns'] );
}
}
}
// Report when too many writes/queries happen...
- if ( $this->hits['queries']++ == $this->expect['queries'] ) {
- $this->reportExpectationViolated( 'queries', $query );
+ if ( $this->hits['queries']++ >= $this->expect['queries'] ) {
+ $this->reportExpectationViolated( 'queries', $query, $this->hits['queries'] );
}
- if ( $isWrite && $this->hits['writes']++ == $this->expect['writes'] ) {
- $this->reportExpectationViolated( 'writes', $query );
+ if ( $isWrite && $this->hits['writes']++ >= $this->expect['writes'] ) {
+ $this->reportExpectationViolated( 'writes', $query, $this->hits['writes'] );
}
// Report slow queries...
if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) {
* @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." );
);
$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 ) {