* @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
}
/**
- * @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;
}
/**
* @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 ) {
}
}
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] );