'conns' => INF,
'masterConns' => INF,
'maxAffected' => INF,
+ 'readQueryRows' => INF,
'readQueryTime' => INF,
'writeQueryTime' => INF
];
}
/**
- * @param bool $value New value
+ * @param bool $value
* @return bool Old value
* @since 1.28
*/
}
/**
- * Set multiple performance expectations
+ * Set one or multiple performance expectations
*
* With conflicting expectations, the most narrow ones will be used
*
+ * Use this to initialize expectations or make them stricter mid-request
+ *
* @param array $expects Map of (event => limit)
* @param string $fname
* @since 1.26
}
/**
- * Reset performance expectations and hit counters
+ * Reset all performance expectations and hit counters
+ *
+ * Use this for unit testing or before applying a totally different set of expectations
+ * for a different part of the request, such as during "post-send" (execution after HTTP
+ * response completion)
*
* @since 1.25
*/
$this->expectBy = [];
}
+ /**
+ * Clear all expectations and hit counters and set new performance expectations
+ *
+ * Use this to apply a totally different set of expectations for a different part
+ * of the request, such as during "post-send" (execution after HTTP response completion)
+ *
+ * @param array $expects Map of (event => limit)
+ * @param string $fname
+ * @since 1.33
+ */
+ public function redefineExpectations( array $expects, $fname ) {
+ $this->resetExpectations();
+ $this->setExpectations( $expects, $fname );
+ }
+
/**
* Mark a DB as having been connected to with a new handle
*
public function transactionWritingIn( $server, $db, $id ) {
$name = "{$server} ({$db}) (TRX#$id)";
if ( isset( $this->dbTrxHoldingLocks[$name] ) ) {
- $this->logger->info( "Nested transaction for '$name' - out of sync." );
+ $this->logger->warning( "Nested transaction for '$name' - out of sync." );
}
$this->dbTrxHoldingLocks[$name] = [
'start' => microtime( true ),
* @param string $query Function name or generalized SQL
* @param float $sTime Starting UNIX wall time
* @param bool $isWrite Whether this is a write query
- * @param int $n Number of affected rows
+ * @param int $n Number of affected/read rows
*/
public function recordQueryCompletion( $query, $sTime, $isWrite = false, $n = 0 ) {
$eTime = microtime( true );
$elapsed = ( $eTime - $sTime );
if ( $isWrite && $n > $this->expect['maxAffected'] ) {
- $this->logger->info(
+ $this->logger->warning(
"Query affected $n row(s):\n" . $query . "\n" .
( new RuntimeException() )->getTraceAsString() );
+ } elseif ( !$isWrite && $n > $this->expect['readQueryRows'] ) {
+ $this->logger->warning(
+ "Query returned $n row(s):\n" . $query . "\n" .
+ ( new RuntimeException() )->getTraceAsString() );
}
// Report when too many writes/queries happen...
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." );
+ $this->logger->warning( "Detected no transaction for '$name' - out of sync." );
return;
}
list( $query, $sTime, $end ) = $info;
$trace .= sprintf( "%d\t%.6f\t%s\n", $i, ( $end - $sTime ), $query );
}
- $this->logger->info( "Sub-optimal transaction on DB(s) [{dbs}]: \n{trace}", [
+ $this->logger->warning( "Sub-optimal transaction on DB(s) [{dbs}]: \n{trace}", [
'dbs' => implode( ', ', array_keys( $this->dbTrxHoldingLocks[$name]['conns'] ) ),
'trace' => $trace
] );
return;
}
- $this->logger->info(
+ $this->logger->warning(
"Expectation ({measure} <= {max}) by {by} not met (actual: {actual}):\n{query}\n" .
( new RuntimeException() )->getTraceAsString(),
[