Page MenuHomePhabricator

Fix problem of self::$executeContext sometimes being null in DeferredUpdates::handleUpdateQueue
Closed, ResolvedPublic

Description

This continues from T248891: Error: Trying to access array offset on value of type null (includes/deferred/DeferredUpdates.php:237) on PHP 7.4

From T248891:
11:05:14 Dumping file(s) mw-error.log
11:05:14 + set +e
11:05:14 + cd /srv/jenkins/workspace/workspace/quibble-vendor-mysql-php74-docker/log
11:05:14 + grep --color . mw-error.log
11:05:14 2020-03-30 18:03:32 cf60bdc56f7f wikidb: [665416b8da28a05f62ce7a94] /index.php?title=BeforeEach-name-0.9997845813782571-I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n&action=submit   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:03:33 cf60bdc56f7f wikidb: [10a3e56aa570ec5ebfceeb8f] /index.php?title=BeforeEach-name-0.02593870942175247-I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n&action=submit   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:03:35 cf60bdc56f7f wikidb: [9c3c49439dec9d888816c59f] /index.php?title=BeforeEach-name-0.35932370040107586-I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n&action=submit   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:03:38 cf60bdc56f7f wikidb: [b70a7998f6fae9c2094580ec] /index.php?title=BeforeEach-name-0.5304086324145123-I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n&action=delete   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:03:40 cf60bdc56f7f wikidb: [ea2e27cf7de5144f23bf5d19] /index.php?title=Special:Undelete&action=submit   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:03:41 cf60bdc56f7f wikidb: [acc714eb27b0a78edfdd46b1] /index.php?title=BeforeEach-name-0.7802289035705332-I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%C3%A0liz%C3%A6ti%C3%B8n&action=submit   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
11:05:14 2020-03-30 18:04:00 cf60bdc56f7f wikidb: [b1b5ac8c63cdcdff7dde5348] /index.php/Special:CreateAccount   ErrorException from line 237 of /workspace/src/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
11:05:14 #0 /workspace/src/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError()
11:05:14 #1 /workspace/src/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue()
11:05:14 #2 /workspace/src/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates()
11:05:14 #3 /workspace/src/includes/MediaWiki.php(839): MediaWiki->restInPeace()
11:05:14 #4 /workspace/src/includes/MediaWiki.php(859): MediaWiki->{closure}()
11:05:14 #5 /workspace/src/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
11:05:14 #6 /workspace/src/index.php(47): MediaWiki->run()
11:05:14 #7 {main}
	self::$executeContext = [ 'stage' => $stage, 'subqueue' => [] ];
	try {
		$e = self::run( $du, $lbf, $logger, $stats, $httpMethod );
		// …
		while ( self::$executeContext['subqueue'] ) { # <! Error: array offset on null 
			// …
			unset( self::$executeContext['subqueue'][$firstKey] );
			// …
		}
	} finally {
		// …
		self::$executeContext = null;
	}

Interesting. It would seem that an exception (presumably from run()) is aborting the while-loop and reaching the finally block (that part makes sense) but then somehow getting back into the while-loop?

For this task:

  1. Figure out why self::$executeContext can sometimes be null during execution.
  2. Make it no longer possible or account for it.

Event Timeline

From IRC:

<Aaron>
I suspect a deferred update is explicitly calling doUpdates(), which seems unsafe
addUpdate()/tryOpportunisticExecute() already avoid that
makes sense that the outer caller would be the one to explode too

<Aaron>
though it looks like nothing is doing that anymore (after the refreshlinks refactor)
any other explanation would have to be "exotic" though :s

<Aaron>
did you check for recursive doUpdates() calls?

Krinkle triaged this task as High priority.Apr 4 2020, 3:49 AM

I can reproduce this locally on PHP 7.4 with MediaWiki core + Vector and no other extensions, and then making an edit.

mw-error.log
2020-04-21 18:29:57 bf142c26cdab default: [341839ba92735282d0102c53] /mediawiki/index.php?title=Main_Page&action=submit   ErrorException from line 237 of /var/www/mediawiki/includes/deferred/DeferredUpdates.php: PHP Notice: Trying to access array offset on value of type null
#0 /var/www/mediawiki/includes/deferred/DeferredUpdates.php(237): MWExceptionHandler::handleError(integer, string, string, integer, array)
#1 /var/www/mediawiki/includes/deferred/DeferredUpdates.php(150): DeferredUpdates::handleUpdateQueue(array, string, integer)
#2 /var/www/mediawiki/includes/MediaWiki.php(1059): DeferredUpdates::doUpdates(string)
#3 /var/www/mediawiki/includes/MediaWiki.php(839): MediaWiki->restInPeace()
#4 /var/www/mediawiki/includes/MediaWiki.php(848): MediaWiki->{closure}()
#5 /var/www/mediawiki/includes/MediaWiki.php(574): MediaWiki->doPostOutputShutdown()
#6 /var/www/mediawiki/index.php(47): MediaWiki->run()
#7 {main}

Ad-hoc debugging:

DeferredUpdates.php.diff
--- a/includes/deferred/DeferredUpdates.php
+++ b/includes/deferred/DeferredUpdates.php
@@ -283,18 +283,19 @@ class DeferredUpdates {
    private static function run(
        DeferrableUpdate $update,
        LBFactory $lbFactory,
        LoggerInterface $logger,
        StatsdDataFactoryInterface $stats,
        $httpMethod
    ) : ?Throwable {
        $suffix = ( $update instanceof DeferrableCallback ) ? "_{$update->getOrigin()}" : '';
        $type = get_class( $update ) . $suffix;
+       wfDebug( __METHOD__ . ': ' . "$type\n" );
mw-debug-www.log
Start request GET /mediawiki/load.php?lang=en&modules=…&only=styles&skin=vector
…
DeferredUpdates::run: MWCallableUpdate_Pingback::schedulePingback
DeferredUpdates::run: MWCallableUpdate_ResourceLoader->measureResponseTime
DeferredUpdates::run: MWCallableUpdate_ResourceLoader->saveModuleDependenciesInternal
[DBQuery] Wikimedia\Rdbms\DatabaseMysqlBase::open [0s] db-master: SET group_concat_max_len = 262144, sql_mode = 'TRADITIONAL'
[DBConnection] Wikimedia\Rdbms\LoadBalancer::getLocalConnection: opened new connection for 0
DeferredUpdates::run: MWCallableUpdate_ResourceLoader->saveModuleDependenciesInternal
DeferredUpdates::run: MWCallableUpdate_ResourceLoader->saveModuleDependenciesInternal
DeferredUpdates::run: MWCallableUpdate_ResourceLoader->saveModuleDependenciesInternal
Request ended normally


Start request POST /mediawiki/api.php
…
DeferredUpdates::run: MWCallableUpdate_Pingback::schedulePingback
Request ended normally


Start request POST /mediawiki/index.php?title=Main_Page&action=submit
…
DeferredUpdates::run: AtomicSectionUpdate_MediaWiki\Storage\PageUpdater::getAtomicSectionUpdate
[DBQuery] MediaWiki\Storage\PageUpdater::getAtomicSectionUpdate [0s] db-master: BEGIN
…
[DBQuery] MediaWiki\Storage\PageUpdater::getAtomicSectionUpdate [0s] db-master: COMMIT
DeferredUpdates::run: CdnCacheUpdate
[squid] CdnCacheUpdate::purge: http://default.web.mw.localhost:8080/mediawiki/index.php?title=Main_Page http://default.web.mw.localhost:8080/mediawiki/index.php?title=Main_Page&action=history
MediaWiki::preOutputCommit: pre-send deferred updates completed
MediaWiki::preOutputCommit: session changes committed
MediaWiki::preOutputCommit: LBFactory shutdown completed
[cookie] setcookie: "UseDC", "master", "1587493807", "/", "", "", "1"
[cookie] setcookie: "UseCDNCache", "false", "1587493807", "/", "", "", "1"
[objectcache] getWithSetCallback(global:rdbms-server-readonly:db-master:default:): process cache hit
OutputPage::sendCacheControl: no caching **
wfClientAcceptsGzip: client accepts gzip.
MediaWiki\OutputHandler::handleGzip() is compressing output
DeferredUpdates::run: RefreshSecondaryDataUpdate



Start request GET /mediawiki/index.php?title=Main_Page
…
[localisation] LocalisationCache using store LCStoreStaticArray
[DBQuery] LinksUpdate::acquirePageLock [0s] db-master: SELECT RELEASE_LOCK('default:LinksUpdate:atomicity:pageid:1') as lockstatus
DeferredUpdates::run: AutoCommitUpdate_LinksUpdate::doUpdate
DeferredUpdates::run: MWCallableUpdate_Pingback::schedulePingback
[session] SessionManager using store SqlBagOStuff
DeferredUpdates::run: MWCallableUpdate_SqlBagOStuff->occasionallyGarbageCollect
[DBQuery] SqlBagOStuff::deleteServerObjectsExpiringBefore [0.001s] db-master: SELECT  keyname,exptime  FROM `objectcache`    WHERE (exptime < '20200421182957')  ORDER BY exptime LIMIT 100
[session] Session "0m0c0pfagv6gs1ki6ih4f8bqd5puvuaj" requested without UserID cookie
DeferredUpdates::run: MWCallableUpdate_RecentChange::notifyEdit
[DBQuery] RecentChange::save [0.001s] db-master: INSERT INTO `recentchanges` (rc_timestamp,rc_namespace,rc_title,rc_type,rc_source,rc_minor,rc_cur_id,rc_this_oldid,rc_last_oldid,rc_bot,rc_ip,rc_patrolled,rc_new,rc_old_len,rc_new_len,rc_deleted,rc_logid,rc_log_type,rc_log_action,rc_params,rc_comment_id,rc_actor) VALUES ('20200421182957',0,'Main_Page',0,'mw.edit',0,1,3,2,0,'172.20.0.6',0,0,736,737,0,0,NULL,'','','1',5)
[DBQuery] RecentChange::notifyEdit [0s] db-master: COMMIT
[DBQuery] Wikimedia\Rdbms\DatabaseMysqlBase::open [0s] db-master: SET group_concat_max_len = 262144, sql_mode = 'TRADITIONAL'
[DBQuery] WatchedItemStore::updateNotificationTimestamp [0s] db-master: SELECT  wl_user AS `value`  FROM `watchlist`    WHERE (wl_user != 0) AND wl_namespace = 0 AND wl_title = 'Main_Page' AND (wl_notificationtimestamp IS NULL)
[DBReplication] Cannot use ChronologyProtector with EmptyBagOStuff
DeferredUpdates::run: MWCallableUpdate_MediaWiki\Storage\PageUpdater->saveRevision
[objectcache] getWithSetCallback(global:rdbms-server-readonly:db-master:default:): process cache hit
DeferredUpdates::run: MWCallableUpdate_MediaWiki\Storage\DerivedPageDataUpdater->doUpdates
DeferredUpdates::run: SearchUpdate
…
DeferredUpdates::run: MWCallableUpdate_WikiPage::onArticleEdit
[SQLBagOStuff] Connection mysql object #169 (handle id #171) will be used for SqlBagOStuff
DeferredUpdates::run: JobQueueEnqueueUpdate
…
DeferredUpdates::run: TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs
…
DeferredUpdates::run: JobQueueEnqueueUpdate
DeferredUpdates::run: SiteStatsUpdate
Request ended normally

DeferredUpdates::run: MWCallableUpdate_WikiPage->doViewUpdates
…

DeferredUpdates::run: MWCallableUpdate_Pingback::schedulePingback
DeferredUpdates::run: TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs
…
[runJobs] htmlCacheUpdate Main_Page table=templatelinks recursive=1 rootJobIsSelf=1 rootJobSignature=74ce50dcd6ec47a5d174f89562dd93805541fc6e rootJobTimestamp=20200421182957 causeAction=page-edit namespace=0 title=Main_Page requestId=341839ba92735282d0102c53 causeAgent=unknown (id=6,timestamp=20200421182957) t=3 good
[DBQuery] JobQueueDB::doAck [0.001s] db-master: DELETE FROM `job` WHERE job_cmd = 'htmlCacheUpdate' AND job_id = '6'
Request ended normally

Change 591509 had a related patch set uploaded (by Aaron Schulz; owner: Aaron Schulz):
[mediawiki/core@master] deferred: add turnstile debug logging to DeferredUpdates::attemptUpdate()

https://gerrit.wikimedia.org/r/591509

Change 591509 had a related patch set uploaded (by Aaron Schulz; owner: Aaron Schulz):
[mediawiki/core@master] deferred: add turnstile debug logging to DeferredUpdates::attemptUpdate()

https://gerrit.wikimedia.org/r/591509

Based on this, I've applied the following:

--- a/includes/deferred/DeferredUpdates.php
+++ b/includes/deferred/DeferredUpdates.php
@@ -243,11 +243,17 @@ class DeferredUpdates {
                            $guiEx = $guiEx ?: ( $e instanceof ErrorPageError ? $e : null );
                            $exception = $exception ?: $e;
                        }
+                       if ( self::$executeContext === null ) {
+                           $logger->debug( 'BUG - Found null $executeContext' );
+                       }
                    } finally {
                        // Make sure we always clean up the context.
                        // Losing updates while rewinding the stack is acceptable,
                        // losing updates that are added later is not.
                        self::$executeContext = null;
+                       if ( self::$executeContext === null ) {
+                           $logger->debug( 'Setting null $executeContext' );
+                       }
                    }
                }
            }
@@ -291,12 +297,16 @@ class DeferredUpdates {
        $type = get_class( $update ) . $suffix;
        $stats->increment( "deferred_updates.$httpMethod.$type" );
 
+       $objId = spl_object_id( $update );
+       $logger->debug( "Start of '$type' #$objId" );
        $e = null;
        try {
            self::attemptUpdate( $update, $lbFactory );
 
            return null;
        } catch ( Throwable $e ) {
+       } finally {
+           $logger->debug( "End of '$type' #$objId" );
        }
 
        MWExceptionHandler::logException( $e );

And logged the following during one edit:

…
[DeferredUpdates] Start of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #456
  [DeferredUpdates] Start of 'JobQueueEnqueueUpdate' #506
    [DeferredUpdates] End of 'JobQueueEnqueueUpdate' #506
  [DeferredUpdates] Setting null $executeContext
  [DeferredUpdates] Start of 'SiteStatsUpdate' #523
    [DeferredUpdates] End of 'SiteStatsUpdate' #523
  [DeferredUpdates] Setting null $executeContext
[DeferredUpdates] End of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #456
[DeferredUpdates] BUG - Found null $executeContext
Full log
/var/log/mediawiki# cat mw-debug-www.log | grep Deferred
[DeferredUpdates] Start of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] End of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #598
[DeferredUpdates] End of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #598
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] End of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'AtomicSectionUpdate_MediaWiki\Storage\PageUpdater::getAtomicSectionUpdate' #472
[DeferredUpdates] End of 'AtomicSectionUpdate_MediaWiki\Storage\PageUpdater::getAtomicSectionUpdate' #472
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'CdnCacheUpdate' #497
[DeferredUpdates] End of 'CdnCacheUpdate' #497
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'RefreshSecondaryDataUpdate' #484
[DeferredUpdates] End of 'RefreshSecondaryDataUpdate' #484
[DeferredUpdates] Start of 'AutoCommitUpdate_LinksUpdate::doUpdate' #511
[DeferredUpdates] End of 'AutoCommitUpdate_LinksUpdate::doUpdate' #511
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_Pingback::schedulePingback' #186
[DeferredUpdates] End of 'MWCallableUpdate_Pingback::schedulePingback' #186
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_RecentChange::notifyEdit' #474
[DeferredUpdates] End of 'MWCallableUpdate_RecentChange::notifyEdit' #474
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_MediaWiki\Storage\PageUpdater->saveRevision' #469
[DeferredUpdates] End of 'MWCallableUpdate_MediaWiki\Storage\PageUpdater->saveRevision' #469
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_MediaWiki\Storage\DerivedPageDataUpdater->doUpdates' #320
[DeferredUpdates] End of 'MWCallableUpdate_MediaWiki\Storage\DerivedPageDataUpdater->doUpdates' #320
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'SearchUpdate' #473
[DeferredUpdates] End of 'SearchUpdate' #473
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_WikiPage::onArticleEdit' #460
[DeferredUpdates] End of 'MWCallableUpdate_WikiPage::onArticleEdit' #460
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'JobQueueEnqueueUpdate' #480
[DeferredUpdates] End of 'JobQueueEnqueueUpdate' #480
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #456
[DeferredUpdates] Start of 'JobQueueEnqueueUpdate' #506
[DeferredUpdates] End of 'JobQueueEnqueueUpdate' #506
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'SiteStatsUpdate' #523
[DeferredUpdates] End of 'SiteStatsUpdate' #523
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] End of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #456
[DeferredUpdates] BUG - Found null $executeContext
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_WikiPage->doViewUpdates' #436
[DeferredUpdates] End of 'MWCallableUpdate_WikiPage->doViewUpdates' #436
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] End of 'MWCallableUpdate_Pingback::schedulePingback' #191
[DeferredUpdates] Setting null $executeContext
[DeferredUpdates] Start of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #443
[DeferredUpdates] End of 'TransactionRoundDefiningUpdate_MediaWiki::schedulePostSendJobs' #443
[DeferredUpdates] Setting null $executeContext

Change 594906 had a related patch set uploaded (by Aaron Schulz; owner: Aaron Schulz):
[mediawiki/core@master] deferredupdates: support limited DeferredUpdates::doUpdates()

https://gerrit.wikimedia.org/r/594906

Change 594906 merged by jenkins-bot:
[mediawiki/core@master] deferredupdates: support limited DeferredUpdates::doUpdates()

https://gerrit.wikimedia.org/r/594906

Change 591509 merged by jenkins-bot:
[mediawiki/core@master] deferred: add turnstile debug logging to DeferredUpdates::attemptUpdate()

https://gerrit.wikimedia.org/r/591509

Change 596082 had a related patch set uploaded (by Aaron Schulz; owner: Aaron Schulz):
[mediawiki/core@master] deferred: make DeferredUpdates::doUpdates() recursion more uniform

https://gerrit.wikimedia.org/r/596082

Change 596082 merged by jenkins-bot:
[mediawiki/core@master] deferred: make DeferredUpdates::doUpdates() recursion more uniform

https://gerrit.wikimedia.org/r/596082