/** @var TransactionProfiler */
protected $trxProfiler;
- /** @var Profiler */
- public static $__instance = null; // do not call this outside Profiler and ProfileSection
+ // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
+ /** @var Profiler Do not call this outside Profiler and ProfileSection */
+ public static $__instance = null;
+ // @codingStandardsIgnoreEnd
/**
* @param array $params
*/
class TransactionProfiler {
/** @var float seconds */
- protected $mDBLockThreshold = 5.0;
- /** @var array DB/server name => (active trx count,timestamp) */
+ protected $mDBLockThreshold = 3.0;
+ /** @var array DB/server name => (active trx count, time, DBs involved) */
protected $mDBTrxHoldingLocks = array();
/** @var array DB/server name => list of (function name, elapsed time) */
protected $mDBTrxMethodTimes = array();
*
* @param string $server DB server
* @param string $db DB name
- * @param string $id Resource ID string of connection
+ * @param string $id ID string of transaction
*/
public function transactionWritingIn( $server, $db, $id ) {
- $name = "{$server} ({$db}) ($id)";
+ $name = "{$server} ({$db}) (TRX#$id)";
if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
++$this->mDBTrxHoldingLocks[$name]['refs'];
} else {
- $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+ $this->mDBTrxHoldingLocks[$name] = array(
+ 'refs' => 1, 'start' => microtime( true ), 'conns' => array() );
$this->mDBTrxMethodTimes[$name] = array();
}
+ foreach ( $this->mDBTrxHoldingLocks as $name => &$info ) {
+ $info['conns'][$name] = 1; // track all DBs in transactions for this transaction
+ }
}
/**
*
* @param string $server DB server
* @param string $db DB name
- * @param string $id Resource ID string of connection
+ * @param string $id ID string of transaction
*/
public function transactionWritingOut( $server, $db, $id ) {
- $name = "{$server} ({$db}) ($id)";
+ $name = "{$server} ({$db}) (TRX#$id)";
if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
$slow = false;
foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
- list( $method, $realtime ) = $info;
+ $realtime = $info[1];
if ( $realtime >= $this->mDBLockThreshold ) {
$slow = true;
break;
}
}
if ( $slow ) {
- $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
- $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+ $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks[$name]['conns'] ) );
+ $msg = "Sub-optimal transaction on DB(s) [{$dbs}]:\n";
foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
list( $method, $realtime ) = $info;
$msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );