Revert "Add small HtmlCacheUpdater service class to normalize purging code"
authorDaniel Kinzler <dkinzler@wikimedia.org>
Wed, 7 Aug 2019 13:56:30 +0000 (13:56 +0000)
committerDaniel Kinzler <dkinzler@wikimedia.org>
Wed, 7 Aug 2019 13:56:30 +0000 (13:56 +0000)
This reverts commit 35da1bbd7cb8b4414c4fbcf331473f1024bc638d.

Reason for revert: wrong tab, wrong patch. Ooops.

Change-Id: I5828fff6308d43460a3b2b10f60996409181f8b3

19 files changed:
RELEASE-NOTES-1.34
autoload.php
includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/Title.php
includes/cache/HTMLFileCache.php
includes/cache/HtmlCacheUpdater.php [deleted file]
includes/deferred/CdnCacheUpdate.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/HtmlFileCacheUpdate.php [deleted file]
includes/deferred/LinksUpdate.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevDelRevisionList.php

index 56a886e..8ecc469 100644 (file)
@@ -92,8 +92,6 @@ For notes on 1.33.x and older releases, see HISTORY.
   to add fields to Special:Mute.
 * (T100896) Skin authors can define custom OOUI themes using OOUIThemePaths.
   See <https://www.mediawiki.org/wiki/OOUI/Themes> for details.
-* The HtmlCacheUpdater service was added to unify the logic of purging CDN cache
-  and HTML file cache to simplify callers and make them more consistent.
 
 === External library changes in 1.34 ===
 
@@ -437,7 +435,6 @@ because of Phabricator reports.
 * SearchEngine::textAlreadyUpdatedForIndex() is deprecated, given the
   deprecation above this method is no longer needed/called and should not be
   implemented by SearchEngine implementation.
-* Title::purgeSquid is deprecated. Use MediaWikiServices::getHtmlCacheUpdater.
 
 === Other changes in 1.34 ===
 * …
index ed6bb12..0208a6d 100644 (file)
@@ -642,8 +642,6 @@ $wgAutoloadLocalClasses = [
        'Hooks' => __DIR__ . '/includes/Hooks.php',
        'Html' => __DIR__ . '/includes/Html.php',
        'HtmlArmor' => __DIR__ . '/includes/libs/HtmlArmor.php',
-       'HtmlCacheUpdater' => __DIR__ . '/includes/cache/HtmlCacheUpdater.php',
-       'HtmlFileCacheUpdate' => __DIR__ . '/includes/deferred/HtmlFileCacheUpdate.php',
        'Http' => __DIR__ . '/includes/http/Http.php',
        'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
        'HttpStatus' => __DIR__ . '/includes/libs/HttpStatus.php',
index fb30199..7fda452 100644 (file)
@@ -68,7 +68,6 @@ use Wikimedia\Services\NoSuchServiceException;
 use MediaWiki\Interwiki\InterwikiLookup;
 use MagicWordFactory;
 use MediaWiki\Storage\PageEditStash;
-use HtmlCacheUpdater;
 
 /**
  * Service locator for MediaWiki core services.
@@ -596,14 +595,6 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'GenderCache' );
        }
 
-       /**
-        * @return HtmlCacheUpdater
-        * @since 1.34
-        */
-       public function getHtmlCacheUpdater() {
-               return $this->getService( 'HtmlCacheUpdater' );
-       }
-
        /**
         * @since 1.31
         * @return HttpRequestFactory
index d6b4d65..9073de1 100644 (file)
@@ -218,10 +218,6 @@ return [
                return new GenderCache( $services->getNamespaceInfo() );
        },
 
-       'HtmlCacheUpdater' => function ( MediaWikiServices $services ) : HtmlCacheUpdater {
-               return new HtmlCacheUpdater();
-       },
-
        'HttpRequestFactory' =>
        function ( MediaWikiServices $services ) : HttpRequestFactory {
                return new HttpRequestFactory();
index 674767d..281f75b 100644 (file)
@@ -3432,10 +3432,12 @@ class Title implements LinkTarget, IDBAccessObject {
 
        /**
         * Purge all applicable CDN URLs
-        * @deprecated 1.34 Use HtmlCacheUpdater
         */
        public function purgeSquid() {
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $this->getCdnUrls() );
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -4243,21 +4245,12 @@ class Title implements LinkTarget, IDBAccessObject {
         * on the number of links. Typically called on create and delete.
         */
        public function touchLinks() {
-               $jobs = [];
-               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
-                       $this,
-                       'pagelinks',
-                       [ 'causeAction' => 'page-touch' ]
-               );
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks', 'page-touch' ) );
                if ( $this->mNamespace == NS_CATEGORY ) {
-                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
-                               $this,
-                               'categorylinks',
-                               [ 'causeAction' => 'category-touch' ]
+                       DeferredUpdates::addUpdate(
+                               new HTMLCacheUpdate( $this, 'categorylinks', 'category-touch' )
                        );
                }
-
-               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
index 6d0b87e..a0d61b2 100644 (file)
@@ -219,33 +219,21 @@ class HTMLFileCache extends FileCacheBase {
                return $text;
        }
 
-       /**
-        * @param string[] $prefixedDbKeys List of prefixed DB keys for pages to purge
-        * @since 1.34
-        */
-       public static function purge( array $prefixedDbKeys ) {
-               foreach ( $prefixedDbKeys as $prefixedDbKey ) {
-                       foreach ( self::cacheablePageActions() as $type ) {
-                               $fc = new self( $prefixedDbKey, $type );
-                               $fc->clearCache();
-                       }
-               }
-       }
-
        /**
         * Clear the file caches for a page for all actions
-        * @param Traversable|Title[]|Title $titles
+        * @param Title $title
         * @return bool Whether $wgUseFileCache is enabled
         */
-       public static function clearFileCache( $titles ) {
+       public static function clearFileCache( Title $title ) {
                $config = MediaWikiServices::getInstance()->getMainConfig();
+
                if ( !$config->get( 'UseFileCache' ) ) {
                        return false;
                }
 
-               $titleIterator = ( $titles instanceof Title ) ? [ $titles ] : $titles;
-               foreach ( $titleIterator as $title ) {
-                       self::purge( [ $title->getPrefixedDBkey() ] );
+               foreach ( self::cacheablePageActions() as $type ) {
+                       $fc = new self( $title, $type );
+                       $fc->clearCache();
                }
 
                return true;
diff --git a/includes/cache/HtmlCacheUpdater.php b/includes/cache/HtmlCacheUpdater.php
deleted file mode 100644 (file)
index b04428c..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * HTML/file cache invalidation of cacheable variant/action URLs for a page
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Class to invalidate the HTML/file cache of cacheable variant/action URLs for a page
- *
- * @ingroup Cache
- * @since 1.34
- */
-class HtmlCacheUpdater {
-       /** @var int Purge after the main transaction round and respect $wgCdnReboundPurgeDelay */
-       const ISOLATION_AND_LAG_AWARE = 1;
-       /** @var int Purge immediately and only once (ignore $wgCdnReboundPurgeDelay) */
-       const IMMEDIATE_WITHOUT_REBOUND = 2;
-
-       /**
-        * Purge CDN/HTMLFileCache for a URL, Title, or iteratable of URL or Title entries
-        *
-        * String entries will be treated as URLs to be purged from the CDN layer.
-        * For Title entries, all cacheable canonical URLs associated with the page
-        * will be purged from the CDN and HTMLFileCache.
-        *
-        * The cache purges are queued as PRESEND deferred updates so that they run after the
-        * main database transaction round of LBFactory. This reduces the chance of race conditions
-        * where a stale value is re-populated before commit. Depending on $wgCdnReboundPurgeDelay,
-        * a secondary set of purges might be issued several seconds later through the use of a
-        * delayed job. This is used to mitigate the effects of DB replication lag as well as
-        * multiple layers of CDN proxies. All deferred CDN purges are combined and de-duplicated
-        * into a single DeferrableUpdate instance. This improves HTTP PURGE request pipelining.
-        *
-        * Use the IMMEDIATE_WITHOUT_REBOUND class constant to instantly issue the purges instead
-        * and skip the use of any secondary purges regardless of $wgCdnReboundPurgeDelay.
-        *
-        * @param Traversable|Title[]|Title|string[]|string $entries
-        * @param int $mode ISOLATION_AND_LAG_AWARE or IMMEDIATE_WITHOUT_REBOUND class constant
-        */
-       public function purge( $entries, $mode = self::ISOLATION_AND_LAG_AWARE ) {
-               $urls = [];
-               $titles = [];
-               if ( is_string( $entries ) ) {
-                       $urls = [ $entries ];
-               } elseif ( $entries instanceof Title ) {
-                       $titles = [ $entries ];
-               } elseif ( $entries instanceof TitleArray ) {
-                       $titles = $entries; // save memory
-               } else {
-                       foreach ( $entries as $entry ) {
-                               if ( is_string( $entry ) ) {
-                                       $urls[] = $entry;
-                               } else {
-                                       $titles[] = $entry;
-                               }
-                       }
-               }
-
-               if ( $mode === self::IMMEDIATE_WITHOUT_REBOUND ) {
-                       HTMLFileCache::clearFileCache( $titles );
-                       foreach ( $titles as $title ) {
-                               /** @var Title $title */
-                               $urls = array_merge( $urls, $title->getCdnUrls() );
-                       }
-                       CdnCacheUpdate::purge( $urls ); // purge once (no "rebound" purges)
-               } else {
-                       DeferredUpdates::addUpdate(
-                               HtmlFileCacheUpdate::newFromTitles( $titles ),
-                               DeferredUpdates::PRESEND
-                       );
-                       DeferredUpdates::addUpdate(
-                               CdnCacheUpdate::newFromTitles( $titles, $urls ),
-                               DeferredUpdates::PRESEND
-                       );
-               }
-       }
-}
index a867f20..66ce9a3 100644 (file)
@@ -24,12 +24,12 @@ use Wikimedia\Assert\Assert;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Handles purging the appropriate CDN objects given a list of URLs or Title instances
+ * Handles purging appropriate CDN URLs given a title (or titles)
  * @ingroup Cache
  */
 class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
        /** @var string[] Collection of URLs to purge */
-       private $urls = [];
+       protected $urls = [];
 
        /**
         * @param string[] $urlArr Collection of URLs to purge
@@ -59,9 +59,12 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                        $urlArr = array_merge( $urlArr, $title->getCdnUrls() );
                }
 
-               return new self( $urlArr );
+               return new CdnCacheUpdate( $urlArr );
        }
 
+       /**
+        * Purges the list of URLs passed to the constructor.
+        */
        public function doUpdate() {
                global $wgCdnReboundPurgeDelay;
 
@@ -95,9 +98,10 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                // Reliably broadcast the purge to all edge nodes
+               $relayer = MediaWikiServices::getInstance()->getEventRelayerGroup()
+                                       ->getRelayer( 'cdn-url-purges' );
                $ts = microtime( true );
-               $relayerGroup = MediaWikiServices::getInstance()->getEventRelayerGroup();
-               $relayerGroup->getRelayer( 'cdn-url-purges' )->notifyMulti(
+               $relayer->notifyMulti(
                        'cdn-url-purges',
                        array_map(
                                function ( $url ) use ( $ts ) {
index 3dd533d..29846bf 100644 (file)
  */
 
 /**
- * Class to invalidate the HTML/file cache of all the pages linking to a given title.
+ * Class to invalidate the HTML cache of all the pages linking to a given title.
  *
  * @ingroup Cache
- * @deprecated Since 1.34; Enqueue jobs from HTMLCacheUpdateJob::newForBacklinks instead
  */
 class HTMLCacheUpdate extends DataUpdate {
        /** @var Title */
-       private $title;
+       public $mTitle;
+
        /** @var string */
-       private $table;
+       public $mTable;
 
        /**
-        * @param Title $title
+        * @param Title $titleTo
         * @param string $table
+        * @param string $causeAction Triggering action
+        * @param string $causeAgent Triggering user
         */
-       public function __construct( Title $title, $table ) {
-               $this->title = $title;
-               $this->table = $table;
+       function __construct(
+               Title $titleTo, $table, $causeAction = 'unknown', $causeAgent = 'unknown'
+       ) {
+               $this->mTitle = $titleTo;
+               $this->mTable = $table;
+               $this->causeAction = $causeAction;
+               $this->causeAgent = $causeAgent;
        }
 
        public function doUpdate() {
                $job = HTMLCacheUpdateJob::newForBacklinks(
-                       $this->title,
-                       $this->table,
+                       $this->mTitle,
+                       $this->mTable,
                        [ 'causeAction' => $this->getCauseAction(), 'causeAgent' => $this->getCauseAgent() ]
                );
+
                JobQueueGroup::singleton()->lazyPush( $job );
        }
 }
diff --git a/includes/deferred/HtmlFileCacheUpdate.php b/includes/deferred/HtmlFileCacheUpdate.php
deleted file mode 100644 (file)
index 7be8b61..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * HTMLFileCache cache purging
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-use MediaWiki\MediaWikiServices;
-
-/**
- * Handles purging the appropriate HTMLFileCache files given a list of titles
- * @ingroup Cache
- */
-class HtmlFileCacheUpdate implements DeferrableUpdate {
-       /** @var string[] Collection of prefixed DB keys for the pages to purge */
-       private $prefixedDbKeys = [];
-
-       /**
-        * @param string[] $prefixedDbKeys
-        */
-       public function __construct( array $prefixedDbKeys ) {
-               $this->prefixedDbKeys = $prefixedDbKeys;
-       }
-
-       /**
-        * Create an update object from an array of Title objects, or a TitleArray object
-        *
-        * @param Traversable|Title[] $titles
-        * @return HtmlFileCacheUpdate
-        */
-       public static function newFromTitles( $titles ) {
-               $prefixedDbKeys = [];
-               foreach ( $titles as $title ) {
-                       $prefixedDbKeys[] = $title->getPrefixedDBkey();
-               }
-
-               return new self( $prefixedDbKeys );
-       }
-
-       public function doUpdate() {
-               $config = MediaWikiServices::getInstance()->getMainConfig();
-               if ( $config->get( 'UseFileCache' ) ) {
-                       HTMLFileCache::purge( $this->prefixedDbKeys );
-               }
-       }
-}
index ff293cb..74e236f 100644 (file)
@@ -1066,7 +1066,6 @@ class LinksUpdate extends DataUpdate {
        private function invalidateProperties( $changed ) {
                global $wgPagePropLinkInvalidations;
 
-               $jobs = [];
                foreach ( $changed as $name => $value ) {
                        if ( isset( $wgPagePropLinkInvalidations[$name] ) ) {
                                $inv = $wgPagePropLinkInvalidations[$name];
@@ -1074,16 +1073,12 @@ class LinksUpdate extends DataUpdate {
                                        $inv = [ $inv ];
                                }
                                foreach ( $inv as $table ) {
-                                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
-                                               $this->mTitle,
-                                               $table,
-                                               [ 'causeAction' => 'page-props' ]
+                                       DeferredUpdates::addUpdate(
+                                               new HTMLCacheUpdate( $this->mTitle, $table, 'page-props' )
                                        );
                                }
                        }
                }
-
-               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
index eca5464..ee7ee6f 100644 (file)
@@ -1453,7 +1453,7 @@ abstract class File implements IDBAccessObject {
                $title = $this->getTitle();
                if ( $title ) {
                        $title->invalidateCache();
-                       MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $title );
+                       $title->purgeSquid();
                }
        }
 
@@ -1469,12 +1469,9 @@ abstract class File implements IDBAccessObject {
                // Purge cache of all pages using this file
                $title = $this->getTitle();
                if ( $title ) {
-                       $job = HTMLCacheUpdateJob::newForBacklinks(
-                               $title,
-                               'imagelinks',
-                               [ 'causeAction' => 'file-purge' ]
+                       DeferredUpdates::addUpdate(
+                               new HTMLCacheUpdate( $title, 'imagelinks', 'file-purge' )
                        );
-                       JobQueueGroup::singleton()->lazyPush( $job );
                }
        }
 
index 989d222..54fc251 100644 (file)
@@ -1047,7 +1047,10 @@ class LocalFile extends File {
                $this->purgeThumbnails( $options );
 
                // Purge CDN cache for this file
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $this->getUrl() );
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( [ $this->getUrl() ] ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -1070,7 +1073,7 @@ class LocalFile extends File {
                foreach ( $files as $file ) {
                        $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
                }
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $urls );
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -1102,7 +1105,7 @@ class LocalFile extends File {
                $this->purgeThumbList( $dir, $files );
 
                // Purge the CDN
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $urls );
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -1722,9 +1725,8 @@ class LocalFile extends File {
                                                }
                                        } else {
                                                # Existing file page: invalidate description page cache
-                                               $title = $wikiPage->getTitle();
-                                               $title->invalidateCache();
-                                               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $title );
+                                               $wikiPage->getTitle()->invalidateCache();
+                                               $wikiPage->getTitle()->purgeSquid();
                                                # Allow the new file version to be patrolled from the page footer
                                                Article::purgePatrolFooterCache( $descId );
                                        }
@@ -1772,8 +1774,10 @@ class LocalFile extends File {
                                                # Delete old thumbnails
                                                $this->purgeThumbnails();
                                                # Remove the old file from the CDN cache
-                                               MediaWikiServices::getInstance()
-                                                       ->getHtmlCacheUpdater()->purge( $this->getUrl() );
+                                               DeferredUpdates::addUpdate(
+                                                       new CdnCacheUpdate( [ $this->getUrl() ] ),
+                                                       DeferredUpdates::PRESEND
+                                               );
                                        } else {
                                                # Update backlink pages pointing to this title if created
                                                LinksUpdate::queueRecursiveJobsForTable(
@@ -1796,12 +1800,9 @@ class LocalFile extends File {
                }
 
                # Invalidate cache for all pages using this file
-               $job = HTMLCacheUpdateJob::newForBacklinks(
-                       $this->getTitle(),
-                       'imagelinks',
-                       [ 'causeAction' => 'file-upload', 'causeAgent' => $user->getName() ]
+               DeferredUpdates::addUpdate(
+                       new HTMLCacheUpdate( $this->getTitle(), 'imagelinks', 'file-upload' )
                );
-               JobQueueGroup::singleton()->lazyPush( $job );
 
                return Status::newGood();
        }
@@ -2003,7 +2004,7 @@ class LocalFile extends File {
                foreach ( $archiveNames as $archiveName ) {
                        $purgeUrls[] = $this->getArchiveUrl( $archiveName );
                }
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $purgeUrls );
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $purgeUrls ), DeferredUpdates::PRESEND );
 
                return $status;
        }
@@ -2040,8 +2041,10 @@ class LocalFile extends File {
                        $this->purgeDescription();
                }
 
-               $url = $this->getArchiveUrl( $archiveName );
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $url );
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( [ $this->getArchiveUrl( $archiveName ) ] ),
+                       DeferredUpdates::PRESEND
+               );
 
                return $status;
        }
index a2e4734..73fa947 100644 (file)
@@ -25,7 +25,7 @@
 use MediaWiki\MediaWikiServices;
 
 /**
- * Job to purge the HTML/file cache for all pages that link to or use another page or file
+ * Job to purge the cache for all pages that link to or use another page or file
  *
  * This job comes in a few variants:
  *   - a) Recursive jobs to purge caches for backlink pages for a given title.
@@ -110,7 +110,7 @@ class HTMLCacheUpdateJob extends Job {
         * @param array $pages Map of (page ID => (namespace, DB key)) entries
         */
        protected function invalidateTitles( array $pages ) {
-               global $wgUpdateRowsPerQuery, $wgPageLanguageUseDB;
+               global $wgUpdateRowsPerQuery, $wgUseFileCache, $wgPageLanguageUseDB;
 
                // Get all page IDs in this query into an array
                $pageIds = array_keys( $pages );
@@ -160,11 +160,20 @@ class HTMLCacheUpdateJob extends Job {
                        __METHOD__
                ) );
 
-               // Update CDN and file caches (avoiding secondary purge overhead)
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge(
-                       $titleArray,
-                       HtmlCacheUpdater::IMMEDIATE_WITHOUT_REBOUND
-               );
+               // Update CDN; call purge() directly so as to not bother with secondary purges
+               $urls = [];
+               foreach ( $titleArray as $title ) {
+                       /** @var Title $title */
+                       $urls = array_merge( $urls, $title->getCdnUrls() );
+               }
+               CdnCacheUpdate::purge( $urls );
+
+               // Update file cache
+               if ( $wgUseFileCache ) {
+                       foreach ( $titleArray as $title ) {
+                               HTMLFileCache::clearFileCache( $title );
+                       }
+               }
        }
 
        public function getDeduplicationInfo() {
index 19e417a..d69a433 100644 (file)
@@ -756,14 +756,10 @@ class PageArchive {
 
                        Hooks::run( 'ArticleUndelete',
                                [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
-
                        if ( $this->title->getNamespace() == NS_FILE ) {
-                               $job = HTMLCacheUpdateJob::newForBacklinks(
-                                       $this->title,
-                                       'imagelinks',
-                                       [ 'causeAction' => 'imagelinks', 'causeAgent' => 'file-restore' ]
+                               DeferredUpdates::addUpdate(
+                                       new HTMLCacheUpdate( $this->title, 'imagelinks', 'file-restore' )
                                );
-                               JobQueueGroup::singleton()->lazyPush( $job );
                        }
                }
 
index fd9f7b2..acd506b 100644 (file)
@@ -176,12 +176,9 @@ class WikiFilePage extends WikiPage {
 
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       $job = HTMLCacheUpdateJob::newForBacklinks(
-                               $this->mTitle,
-                               'imagelinks',
-                               [ 'causeAction' => 'file-purge' ]
+                       DeferredUpdates::addUpdate(
+                               new HTMLCacheUpdate( $this->mTitle, 'imagelinks', 'file-purge' )
                        );
-                       JobQueueGroup::singleton()->lazyPush( $job );
                } else {
                        wfDebug( 'ImagePage::doPurge no image for '
                                . $this->mFile->getName() . "; limiting purge to cache only\n" );
index 33fd472..3bc9f7c 100644 (file)
@@ -1294,8 +1294,13 @@ class WikiPage implements Page, IDBAccessObject {
 
                $this->mTitle->invalidateCache();
 
-               // Clear file cache and send purge after above page_touched update was committed
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $this->mTitle );
+               // Clear file cache
+               HTMLFileCache::clearFileCache( $this->getTitle() );
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        $messageCache = MessageCache::singleton();
@@ -3379,20 +3384,18 @@ class WikiPage implements Page, IDBAccessObject {
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
 
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( [ $title, $other ] );
+               $other->purgeSquid();
 
                $title->touchLinks();
+               $title->purgeSquid();
                $title->deleteTitleProtection();
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
                // Invalidate caches of articles which include this page
-               $job = HTMLCacheUpdateJob::newForBacklinks(
-                       $title,
-                       'templatelinks',
-                       [ 'causeAction' => 'page-create' ]
+               DeferredUpdates::addUpdate(
+                       new HTMLCacheUpdate( $title, 'templatelinks', 'page-create' )
                );
-               JobQueueGroup::singleton()->lazyPush( $job );
 
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
@@ -3412,14 +3415,19 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: move this into a PageEventEmitter service
 
                // Update existence markers on article/talk tabs...
+               // Clear Backlink cache first so that purge jobs use more up-to-date backlink information
+               BacklinkCache::get( $title )->clear();
                $other = $title->getOtherPage();
 
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( [ $title, $other ] );
+               $other->purgeSquid();
 
                $title->touchLinks();
+               $title->purgeSquid();
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
+               // File cache
+               HTMLFileCache::clearFileCache( $title );
                InfoAction::invalidateCache( $title );
 
                // Messages
@@ -3429,12 +3437,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Images
                if ( $title->getNamespace() == NS_FILE ) {
-                       $job = HTMLCacheUpdateJob::newForBacklinks(
-                               $title,
-                               'imagelinks',
-                               [ 'causeAction' => 'page-delete' ]
+                       DeferredUpdates::addUpdate(
+                               new HTMLCacheUpdate( $title, 'imagelinks', 'page-delete' )
                        );
-                       JobQueueGroup::singleton()->lazyPush( $job );
                }
 
                // User talk pages
@@ -3467,28 +3472,26 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                // TODO: move this into a PageEventEmitter service
 
-               $jobs = [];
-               if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
+               if ( $slotsChanged === null || in_array( SlotRecord::MAIN,  $slotsChanged ) ) {
                        // Invalidate caches of articles which include this page.
                        // Only for the main slot, because only the main slot is transcluded.
                        // TODO: MCR: not true for TemplateStyles! [SlotHandler]
-                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
-                               $title,
-                               'templatelinks',
-                               [ 'causeAction' => 'page-edit' ]
+                       DeferredUpdates::addUpdate(
+                               new HTMLCacheUpdate( $title, 'templatelinks', 'page-edit' )
                        );
                }
+
                // Invalidate the caches of all pages which redirect here
-               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
-                       $title,
-                       'redirect',
-                       [ 'causeAction' => 'page-edit' ]
+               DeferredUpdates::addUpdate(
+                       new HTMLCacheUpdate( $title, 'redirect', 'page-edit' )
                );
-               JobQueueGroup::singleton()->lazyPush( $jobs );
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $title );
+               // Purge CDN for this page only
+               $title->purgeSquid();
+               // Clear file cache for this page only
+               HTMLFileCache::clearFileCache( $title );
 
                // Purge ?action=info cache
                $revid = $revision ? $revision->getId() : null;
index d69fa36..ca7bc04 100644 (file)
@@ -122,7 +122,10 @@ class RevDelFileList extends RevDelList {
                        $file->purgeOldThumbnails( $archiveName );
                        $purgeUrls[] = $file->getArchiveUrl( $archiveName );
                }
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $purgeUrls );
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $purgeUrls ),
+                       DeferredUpdates::PRESEND
+               );
 
                return Status::newGood();
        }
index 1eaf0cc..0705503 100644 (file)
@@ -19,7 +19,6 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -178,10 +177,9 @@ class RevDelRevisionList extends RevDelList {
        }
 
        public function doPostCommitUpdates( array $visibilityChangeMap ) {
-               MediaWikiServices::getInstance()->getHtmlCacheUpdater()->purge( $this->title );
+               $this->title->purgeSquid();
                // Extensions that require referencing previous revisions may need this
-               Hooks::run( 'ArticleRevisionVisibilitySet',
-                       [ $this->title, $this->ids, $visibilityChangeMap ] );
+               Hooks::run( 'ArticleRevisionVisibilitySet', [ $this->title, $this->ids, $visibilityChangeMap ] );
                return Status::newGood();
        }
 }