X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fprofiler%2Foutput%2FProfilerOutputDb.php;h=28dc2cc21ef82dd97c148a66db5c6fe8752463af;hp=2225e3f6306fc5dab08fe866a6673af722cf2bf2;hb=836e9d237a60929f32efea801485fde77b5950bc;hpb=14cb8f992f7f9d1e1b405c200720c53f4e62b8d2 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 ) { - } + } ); } }