MediaWiki  1.32.5
DeferredUpdates Class Reference

Class for managing the deferred updates. More...

Collaboration diagram for DeferredUpdates:

Static Public Member Functions

static addCallableUpdate ( $callable, $stage=self::POSTSEND, $dbw=null)
 Add a callable update. More...
 
static addUpdate (DeferrableUpdate $update, $stage=self::POSTSEND)
 Add an update to the deferred list to be run later by execute() More...
 
static clearPendingUpdates ()
 Clear all pending updates without performing them. More...
 
static doUpdates ( $mode='run', $stage=self::ALL)
 Do any deferred updates and clear the list. More...
 
static getPendingUpdates ( $stage=self::ALL)
 
static pendingUpdatesCount ()
 
static tryOpportunisticExecute ( $mode='run')
 Run all deferred updates immediately if there are no DB writes active. More...
 

Public Attributes

const ALL = 0
 
const BIG_QUEUE_SIZE = 100
 
const POSTSEND = 2
 
const PRESEND = 1
 

Static Protected Member Functions

static execute (array &$queue, $mode, $stage)
 Immediately run/queue a list of updates. More...
 

Static Private Member Functions

static areDatabaseTransactionsActive ()
 
static enqueueUpdates (array $updates)
 Enqueue a job for each EnqueueableDataUpdate item and return the other items. More...
 
static push (array &$queue, DeferrableUpdate $update)
 
static runUpdate (DeferrableUpdate $update, LBFactory $lbFactory, $mode, $stage)
 

Static Private Attributes

static array null $executeContext
 Information about the current execute() call or null if not running. More...
 
static DeferrableUpdate[] $postSendUpdates = []
 Updates to be deferred until after request end. More...
 
static DeferrableUpdate[] $preSendUpdates = []
 Updates to be deferred until before request end. More...
 

Detailed Description

Class for managing the deferred updates.

In web request mode, deferred updates can be run at the end of the request, either before or after the HTTP response has been sent. In either case, they run after the DB commit step. If an update runs after the response is sent, it will not block clients. If sent before, it will run synchronously. These two modes are defined via PRESEND and POSTSEND constants, the latter being the default for addUpdate() and addCallableUpdate().

Updates that work through this system will be more likely to complete by the time the client makes their next request after this one than with the JobQueue system.

In CLI mode, deferred updates will run:

  • a) During DeferredUpdates::addUpdate if no LBFactory DB handles have writes pending
  • b) On commit of an LBFactory DB handle if no other such handles have writes pending
  • c) During an LBFactory::waitForReplication call if no LBFactory DBs have writes pending
  • d) When the queue is large and an LBFactory DB handle commits (EnqueueableDataUpdate only)
  • e) At the completion of Maintenance::execute()
See also
Maintenance::setLBFactoryTriggers

When updates are deferred, they go into one two FIFO "top-queues" (one for pre-send and one for post-send). Updates enqueued during doUpdate() of a "top" update go into the "sub-queue" for that update. After that method finishes, the sub-queue is run until drained. This continues for each top-queue job until the entire top queue is drained. This happens for the pre-send top-queue, and later on, the post-send top-queue, in execute().

Since
1.19

Definition at line 56 of file DeferredUpdates.php.

Member Function Documentation

◆ addCallableUpdate()

static DeferredUpdates::addCallableUpdate (   $callable,
  $stage = self::POSTSEND,
  $dbw = null 
)
static

Add a callable update.

In a lot of cases, we just need a callback/closure, defining a new DeferrableUpdate object is not necessary

See also
MWCallableUpdate::__construct()
Parameters
callable$callable
int$stageDeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
IDatabase | IDatabase[] | null$dbwAbort if this DB is rolled back optional

Definition at line 118 of file DeferredUpdates.php.

References addUpdate(), and wfGetCaller().

Referenced by MediaWiki\Auth\AuthManager\autoCreateUser(), MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider\beginPrimaryAuthentication(), SpecialEditWatchlist\cleanupWatchlist(), User\clearNotification(), FileBackendMultiWrite\doDirectoryOp(), SpamBlacklist\doLogging(), FileBackendMultiWrite\doOperationsInternal(), FileBackendMultiWrite\doQuickOperationsInternal(), LinksDeletionUpdate\doUpdate(), SiteStatsUpdate\doUpdate(), WikiPage\doViewUpdates(), EditPage\edit(), MovePageForm\execute(), MediaWiki\Logger\Monolog\BufferHandler\handle(), Category\initialize(), WikiPage\insertRedirect(), LocalFile\maybeUpgradeRow(), RecentChange\notifyEdit(), RecentChange\notifyNew(), WikiPage\onArticleEdit(), ManualLogEntry\publish(), WikiPage\purgeInterwikiCheckKey(), MediaWiki\Session\SessionBackend\save(), SpecialSearch\saveNamespaces(), MediaWiki\Storage\PageUpdater\saveRevision(), Pingback\schedulePingback(), RevDelList\setVisibility(), DeferredUpdatesTest\testAddCallableUpdate(), DeferredUpdatesTest\testDoUpdatesCLI(), DeferredUpdatesTest\testDoUpdatesWeb(), MediaWikiTest\testPostSendJobDoesNotSetCookie(), DeferredUpdatesTest\testPresendAddOnPostsendRun(), CdnCacheUpdateTest\testPurgeMergeWeb(), DeferredUpdatesTest\testRunUpdateTransactionScope(), DeferredUpdatesTest\testTryOpportunisticExecute(), WikiPage\updateCategoryCounts(), WatchedItemStore\updateNotificationTimestamp(), and EditPage\updateWatchlist().

◆ addUpdate()

static DeferredUpdates::addUpdate ( DeferrableUpdate  $update,
  $stage = self::POSTSEND 
)
static

Add an update to the deferred list to be run later by execute()

In CLI mode, callback magic will also be used to run updates when safe

Parameters
DeferrableUpdate$updateSome object that implements doUpdate()
int$stageDeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)

Definition at line 79 of file DeferredUpdates.php.

References $wgCommandLineMode, push(), and tryOpportunisticExecute().

Referenced by addCallableUpdate(), MediaWiki\Auth\AuthManager\autoCreateUser(), MediaWiki\Auth\AuthManager\continueAccountCreation(), LocalFile\delete(), LocalFile\deleteOld(), MediaWiki\Storage\PageUpdater\doCreate(), WikiPage\doDeleteUpdates(), MediaWiki\Storage\PageUpdater\doModify(), RevDelFileList\doPostCommitUpdates(), WikiFilePage\doPurge(), WikiPage\doPurge(), MediaWiki\Storage\DerivedPageDataUpdater\doSecondaryDataUpdates(), LinksUpdate\doUpdate(), MediaWiki\Storage\DerivedPageDataUpdater\doUpdates(), SpecialRunJobs\execute(), ChangesListSpecialPage\execute(), LocalFileRestoreBatch\execute(), WikiImporter\finishImportPage(), Title\invalidateCache(), PurgeJobUtils\invalidatePages(), LinksUpdate\invalidateProperties(), JobQueueGroup\lazyPush(), NamespaceDupes\mergePage(), MovePage\move(), LocalFile\move(), WikiPage\onArticleCreate(), WikiPage\onArticleDelete(), WikiPage\onArticleEdit(), LocalFile\purgeCache(), File\purgeEverything(), Block\purgeExpired(), Title\purgeExpiredRestrictions(), LocalFile\purgeOldThumbnails(), Title\purgeSquid(), LocalFile\purgeThumbnails(), LocalFile\recordUpload2(), MessageCache\replace(), DeferredUpdatesTest\testAddAndRun(), DeferredUpdatesTest\testAddMergeable(), DeferredUpdatesTest\testGetPendingUpdates(), CdnCacheUpdateTest\testPurgeMergeWeb(), DeferredUpdatesTest\testRunOuterScopeUpdate(), Title\touchLinks(), and PageArchive\undeleteRevisions().

◆ areDatabaseTransactionsActive()

static DeferredUpdates::areDatabaseTransactionsActive ( )
staticprivate
Returns
bool If a transaction round is active or connection is not ready for commit()

Definition at line 380 of file DeferredUpdates.php.

References Wikimedia\Rdbms\IDatabase\explicitTrxActive(), Wikimedia\Rdbms\LoadBalancer\forEachOpenMasterConnection(), use, and Wikimedia\Rdbms\IDatabase\writesOrCallbacksPending().

◆ clearPendingUpdates()

static DeferredUpdates::clearPendingUpdates ( )
static

Clear all pending updates without performing them.

Generally, you don't want or need to call this. Unit tests need it though.

Definition at line 372 of file DeferredUpdates.php.

Referenced by MediaWikiTestCase\resetNonServiceCaches(), UploadFromUrlTestSuite\setUp(), DeferredUpdatesTest\testGetPendingUpdates(), and CdnCacheUpdateTest\testPurgeMergeWeb().

◆ doUpdates()

◆ enqueueUpdates()

static DeferredUpdates::enqueueUpdates ( array  $updates)
staticprivate

Enqueue a job for each EnqueueableDataUpdate item and return the other items.

Parameters
DeferrableUpdate[]$updatesA list of deferred update instances
Returns
DeferrableUpdate[] Remaining updates that do not support being queued

Definition at line 329 of file DeferredUpdates.php.

References as, and JobQueueGroup\singleton().

Referenced by tryOpportunisticExecute().

◆ execute()

static DeferredUpdates::execute ( array $queue,
  $mode,
  $stage 
)
staticprotected

Immediately run/queue a list of updates.

Parameters
DeferrableUpdate[]&$queueList of DeferrableUpdate objects
string$modeUse "enqueue" to use the job queue when possible
int$stageClass constant (PRESEND, POSTSEND) (since 1.28)
Exceptions
ErrorPageErrorHappens on top-level calls
ExceptionHappens on second-level calls

Definition at line 177 of file DeferredUpdates.php.

References $name, $queue, $services, as, RequestContext\getMain(), key, and runUpdate().

Referenced by doUpdates().

◆ getPendingUpdates()

static DeferredUpdates::getPendingUpdates (   $stage = self::ALL)
static
Parameters
int$stageDeferredUpdates constant (PRESEND, POSTSEND, or ALL)
Returns
DeferrableUpdate[]
Since
1.29

Definition at line 357 of file DeferredUpdates.php.

Referenced by DeferredUpdatesTest\testGetPendingUpdates().

◆ pendingUpdatesCount()

◆ push()

static DeferredUpdates::push ( array $queue,
DeferrableUpdate  $update 
)
staticprivate
Parameters
DeferrableUpdate[]$queue
DeferrableUpdate$update

Definition at line 149 of file DeferredUpdates.php.

References $queue.

Referenced by addUpdate().

◆ runUpdate()

static DeferredUpdates::runUpdate ( DeferrableUpdate  $update,
LBFactory  $lbFactory,
  $mode,
  $stage 
)
staticprivate
Parameters
DeferrableUpdate$update
LBFactory$lbFactory
string$mode
int$stage
Returns
ErrorPageError|null

Definition at line 255 of file DeferredUpdates.php.

References $e, Wikimedia\Rdbms\LBFactory\beginMasterChanges(), Wikimedia\Rdbms\LBFactory\commitMasterChanges(), DeferrableUpdate\doUpdate(), MWExceptionHandler\rollbackMasterChangesAndLog(), and JobQueueGroup\singleton().

Referenced by execute().

◆ tryOpportunisticExecute()

static DeferredUpdates::tryOpportunisticExecute (   $mode = 'run')
static

Run all deferred updates immediately if there are no DB writes active.

If there are many deferred updates pending, $mode is 'run', and there are still busy LBFactory database handles, then any EnqueueableDataUpdate tasks might be enqueued as jobs to be executed later.

Parameters
string$modeUse "enqueue" to use the job queue when possible
Returns
bool Whether updates were allowed to run
Since
1.28

Definition at line 301 of file DeferredUpdates.php.

References doUpdates(), enqueueUpdates(), and pendingUpdatesCount().

Referenced by addUpdate(), Maintenance\setLBFactoryTriggers(), and DeferredUpdatesTest\testTryOpportunisticExecute().

Member Data Documentation

◆ $executeContext

array null DeferredUpdates::$executeContext
staticprivate

Information about the current execute() call or null if not running.

Definition at line 69 of file DeferredUpdates.php.

◆ $postSendUpdates

DeferrableUpdate [] DeferredUpdates::$postSendUpdates = []
staticprivate

Updates to be deferred until after request end.

Definition at line 60 of file DeferredUpdates.php.

◆ $preSendUpdates

DeferrableUpdate [] DeferredUpdates::$preSendUpdates = []
staticprivate

Updates to be deferred until before request end.

Definition at line 58 of file DeferredUpdates.php.

◆ ALL

const DeferredUpdates::ALL = 0

Definition at line 62 of file DeferredUpdates.php.

Referenced by doUpdates(), and DeferredUpdatesTest\testGetPendingUpdates().

◆ BIG_QUEUE_SIZE

const DeferredUpdates::BIG_QUEUE_SIZE = 100

Definition at line 66 of file DeferredUpdates.php.

◆ POSTSEND

◆ PRESEND


The documentation for this class was generated from the following file: