From 836e9d237a60929f32efea801485fde77b5950bc Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Sun, 25 Mar 2018 21:00:15 -0700 Subject: [PATCH] Cleanup ProfilerOutputDb try/catch logic for DBErrors Also make it avoid transactions for non-sqlite when DBO_TRX is set. This was the intention before, but nothing made sure that flag was not active when the upsert()s ran. Change-Id: I9cb21b199aae4134d172352e66cf8d2841327f85 --- includes/profiler/output/ProfilerOutputDb.php | 83 +++++++++++-------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/includes/profiler/output/ProfilerOutputDb.php b/includes/profiler/output/ProfilerOutputDb.php index 2225e3f630..28dc2cc21e 100644 --- a/includes/profiler/output/ProfilerOutputDb.php +++ b/includes/profiler/output/ProfilerOutputDb.php @@ -48,46 +48,59 @@ class ProfilerOutputDb extends ProfilerOutput { } public function log( array $stats ) { - $pfhost = $this->perHost ? wfHostname() : ''; - try { $dbw = wfGetDB( DB_MASTER ); - $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster - if ( $useTrx ) { - $dbw->startAtomic( __METHOD__ ); - } - foreach ( $stats as $data ) { - $name = $data['name']; - $eventCount = $data['calls']; - $timeSum = (float)$data['real']; - $memorySum = (float)$data['memory']; - $name = substr( $name, 0, 255 ); + } catch ( DBError $e ) { + return; // ignore + } + + $fname = __METHOD__; + $dbw->onTransactionIdle( function () use ( $stats, $dbw, $fname ) { + $pfhost = $this->perHost ? wfHostname() : ''; + // Sqlite: avoid excess b-tree rebuilds (mostly for non-WAL mode) + // non-Sqlite: lower contention with small transactions + $useTrx = ( $dbw->getType() === 'sqlite' ); - // Kludge - $timeSum = $timeSum >= 0 ? $timeSum : 0; - $memorySum = $memorySum >= 0 ? $memorySum : 0; + try { + $useTrx ? $dbw->startAtomic( $fname ) : null; - $dbw->upsert( 'profiling', - [ - 'pf_name' => $name, - 'pf_count' => $eventCount, - 'pf_time' => $timeSum, - 'pf_memory' => $memorySum, - 'pf_server' => $pfhost - ], - [ [ 'pf_name', 'pf_server' ] ], - [ - "pf_count=pf_count+{$eventCount}", - "pf_time=pf_time+{$timeSum}", - "pf_memory=pf_memory+{$memorySum}", - ], - __METHOD__ - ); + foreach ( $stats as $data ) { + $name = $data['name']; + $eventCount = $data['calls']; + $timeSum = (float)$data['real']; + $memorySum = (float)$data['memory']; + $name = substr( $name, 0, 255 ); + + // Kludge + $timeSum = $timeSum >= 0 ? $timeSum : 0; + $memorySum = $memorySum >= 0 ? $memorySum : 0; + + $dbw->upsert( 'profiling', + [ + 'pf_name' => $name, + 'pf_count' => $eventCount, + 'pf_time' => $timeSum, + 'pf_memory' => $memorySum, + 'pf_server' => $pfhost + ], + [ [ 'pf_name', 'pf_server' ] ], + [ + "pf_count=pf_count+{$eventCount}", + "pf_time=pf_time+{$timeSum}", + "pf_memory=pf_memory+{$memorySum}", + ], + $fname + ); + } + } catch ( DBError $e ) { + // ignore } - if ( $useTrx ) { - $dbw->endAtomic( __METHOD__ ); + + try { + $useTrx ? $dbw->endAtomic( $fname ) : null; + } catch ( DBError $e ) { + // ignore } - } catch ( DBError $e ) { - } + } ); } } -- 2.20.1