rdbms: change "profiler" argument in Database::factory so it works again
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 13 Mar 2019 18:11:18 +0000 (11:11 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 14 Mar 2019 22:19:58 +0000 (22:19 +0000)
The Profiler::profileIn and Profiler::profileOut methods are just stubs.
Use a callback to the Profiler::scopedProfileIn method instead.

Change-Id: I16068bce583bb880250fe91235f2283453be5e4c

includes/db/MWLBFactory.php
includes/libs/rdbms/database/Database.php
tests/phpunit/includes/db/DatabaseTestHelper.php

index e50f855..cb1a69d 100644 (file)
@@ -54,7 +54,9 @@ abstract class MWLBFactory {
                                $mainConfig->get( 'DBmwschema' ),
                                $mainConfig->get( 'DBprefix' )
                        ),
-                       'profiler' => Profiler::instance(),
+                       'profiler' => function ( $section ) {
+                               return Profiler::instance()->scopedProfileIn( $section );
+                       },
                        'trxProfiler' => Profiler::instance()->getTransactionProfiler(),
                        'replLogger' => LoggerFactory::getInstance( 'DBReplication' ),
                        'queryLogger' => LoggerFactory::getInstance( 'DBQuery' ),
index 49b2792..1600c26 100644 (file)
@@ -260,7 +260,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        /** @var int[] Prior flags member variable values */
        private $priorFlags = [];
 
-       /** @var mixed Class name or object With profileIn/profileOut methods */
+       /** @var callable|null */
        protected $profiler;
        /** @var TransactionProfiler */
        protected $trxProfiler;
@@ -308,7 +308,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $this->srvCache = $params['srvCache'] ?? new HashBagOStuff();
 
-               $this->profiler = $params['profiler'];
+               $this->profiler = is_callable( $params['profiler'] ) ? $params['profiler'] : null;
                $this->trxProfiler = $params['trxProfiler'];
                $this->connLogger = $params['connLogger'];
                $this->queryLogger = $params['queryLogger'];
@@ -408,9 +408,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         *      used to adjust lock timeouts or encoding modes and the like.
         *   - connLogger: Optional PSR-3 logger interface instance.
         *   - queryLogger: Optional PSR-3 logger interface instance.
-        *   - profiler: Optional class name or object with profileIn()/profileOut() methods.
-        *      These will be called in query(), using a simplified version of the SQL that also
-        *      includes the agent as a SQL comment.
+        *   - profiler : Optional callback that takes a section name argument and returns
+        *      a ScopedCallback instance that ends the profile section in its destructor.
+        *      These will be called in query(), using a simplified version of the SQL that
+        *      also includes the agent as a SQL comment.
         *   - trxProfiler: Optional TransactionProfiler instance.
         *   - errorLogger: Optional callback that takes an Exception and logs it.
         *   - deprecationLogger: Optional callback that takes a string and logs it.
@@ -1272,19 +1273,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $queryProf .= $this->trxShortId ? " [TRX#{$this->trxShortId}]" : "";
 
                $startTime = microtime( true );
-               if ( $this->profiler ) {
-                       $this->profiler->profileIn( $queryProf );
-               }
+               $ps = $this->profiler ? ( $this->profiler )( $queryProf ) : null;
                $this->affectedRowCount = null;
                $ret = $this->doQuery( $commentedSql );
                $this->affectedRowCount = $this->affectedRows();
-               if ( $this->profiler ) {
-                       $this->profiler->profileOut( $queryProf );
-               }
+               unset( $ps ); // profile out (if set)
                $queryRuntime = max( microtime( true ) - $startTime, 0.0 );
 
-               unset( $queryProfSection ); // profile out (if set)
-
                if ( $ret !== false ) {
                        $this->lastPing = $startTime;
                        if ( $isWrite && $this->trxLevel ) {
index 65b82ab..ff10fef 100644 (file)
@@ -45,7 +45,7 @@ class DatabaseTestHelper extends Database {
        public function __construct( $testName, array $opts = [] ) {
                $this->testName = $testName;
 
-               $this->profiler = new ProfilerStub( [] );
+               $this->profiler = null;
                $this->trxProfiler = new TransactionProfiler();
                $this->cliMode = $opts['cliMode'] ?? true;
                $this->connLogger = new \Psr\Log\NullLogger();