X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2Fdeferred%2FDeferredUpdates.php;h=1ba6c1febdfef9bb7032c17b48bbf8acce8b1d95;hb=61898ad28ed69c5b391eb43e0db9386279b9612c;hp=2b2b2b784eeb00c581098cb0a95d80e1197e582b;hpb=26b56403a1b31e16381ebe25e8df9afcfde36282;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/deferred/DeferredUpdates.php b/includes/deferred/DeferredUpdates.php index 2b2b2b784e..1ba6c1febd 100644 --- a/includes/deferred/DeferredUpdates.php +++ b/includes/deferred/DeferredUpdates.php @@ -52,6 +52,8 @@ class DeferredUpdates { private static $preSendUpdates = []; /** @var DeferrableUpdate[] Updates to be deferred until after request end */ private static $postSendUpdates = []; + /** @var bool Whether to just run updates in addUpdate() */ + private static $immediateMode = false; const ALL = 0; // all updates; in web requests, use only after flushing the output buffer const PRESEND = 1; // for updates that should run before flushing output buffer @@ -85,6 +87,12 @@ class DeferredUpdates { self::push( self::$postSendUpdates, $update ); } + if ( self::$immediateMode ) { + // No more explicit doUpdates() calls will happen, so run this now + self::doUpdates( 'run' ); + return; + } + // Try to run the updates now if in CLI mode and no transaction is active. // This covers scripts that don't/barely use the DB but make updates to other stores. if ( $wgCommandLineMode ) { @@ -126,6 +134,14 @@ class DeferredUpdates { } } + /** + * @param bool $value Whether to just immediately run updates in addUpdate() + * @since 1.28 + */ + public static function setImmediateMode( $value ) { + self::$immediateMode = (bool)$value; + } + /** * @param DeferrableUpdate[] $queue * @param DeferrableUpdate $update @@ -146,18 +162,22 @@ class DeferredUpdates { } /** + * Immediately run/queue a list of updates + * * @param DeferrableUpdate[] &$queue List of DeferrableUpdate objects * @param string $mode Use "enqueue" to use the job queue when possible * @param integer $stage Class constant (PRESEND, POSTSEND) (since 1.28) * @throws ErrorPageError Happens on top-level calls * @throws Exception Happens on second-level calls */ - public static function execute( array &$queue, $mode, $stage ) { + protected static function execute( array &$queue, $mode, $stage ) { $services = MediaWikiServices::getInstance(); $stats = $services->getStatsdDataFactory(); $lbFactory = $services->getDBLoadBalancerFactory(); $method = RequestContext::getMain()->getRequest()->getMethod(); + $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ ); + /** @var ErrorPageError $reportableError */ $reportableError = null; /** @var DeferrableUpdate[] $updates Snapshot of queue */ @@ -180,7 +200,13 @@ class DeferredUpdates { // Order will be DataUpdate followed by generic DeferrableUpdate tasks $updatesByType = [ 'data' => [], 'generic' => [] ]; foreach ( $updates as $du ) { - $updatesByType[$du instanceof DataUpdate ? 'data' : 'generic'][] = $du; + if ( $du instanceof DataUpdate ) { + $du->setTransactionTicket( $ticket ); + $updatesByType['data'][] = $du; + } else { + $updatesByType['generic'][] = $du; + } + $name = ( $du instanceof DeferrableCallback ) ? get_class( $du ) . '-' . $du->getOrigin() : get_class( $du ); @@ -204,6 +230,10 @@ class DeferredUpdates { $firstKey = key( self::$executeContext['subqueue'] ); unset( self::$executeContext['subqueue'][$firstKey] ); + if ( $subUpdate instanceof DataUpdate ) { + $subUpdate->setTransactionTicket( $ticket ); + } + $guiError = self::runUpdate( $subUpdate, $lbFactory, $stage ); $reportableError = $reportableError ?: $guiError; }