Catrope has uploaded a new change for review. https://gerrit.wikimedia.org/r/288263
Change subject: Don't cache pages with outdated global notification counts ...................................................................... Don't cache pages with outdated global notification counts When updating notification counts, we already called User::invalidateCache(), which bumps the local user's touched timestamp, which is taken into account by OutputPage when computing the last-modified timestamp of the response. However, this only works for one wiki, while the changed global count needs to be displayed on every wiki. To accomplish this, track the timestamp of the last update in NotifUser, and hook it into OutputPageCheckLastModified. Change-Id: I22c88a017f18a28179906049ee423c2d7e81c939 (cherry picked from commit d2d420a3c47cefa90a9b0f1cbd0d91777fbf47cc) --- M Echo.php M Hooks.php M includes/NotifUser.php 3 files changed, 47 insertions(+), 3 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo refs/changes/63/288263/1 diff --git a/Echo.php b/Echo.php index 887d584..c939b31 100644 --- a/Echo.php +++ b/Echo.php @@ -81,6 +81,7 @@ $wgHooks['ParserTestTables'][] = 'EchoHooks::onParserTestTables'; $wgHooks['EmailUserComplete'][] = 'EchoHooks::onEmailUserComplete'; $wgHooks['LoginFormValidErrorMessages'][] = 'EchoHooks::onLoginFormValidErrorMessages'; +$wgHooks['OutputPageCheckLastModified'][] = 'EchoHooks::onOutputPageCheckLastModified'; // Extension:UserMerge support $wgHooks['UserMergeAccountFields'][] = 'EchoHooks::onUserMergeAccountFields'; diff --git a/Hooks.php b/Hooks.php index 36f2f29..fa2a196 100644 --- a/Hooks.php +++ b/Hooks.php @@ -1002,6 +1002,18 @@ return true; } + public static function onOutputPageCheckLastModified( array &$modifiedTimes ) { + // HACK: this hook doesn't pass in a ContextSource + $user = RequestContext::getMain()->getUser(); + if ( $user->isLoggedIn() ) { + $notifUser = MWEchoNotifUser::newFromUser( $user ); + $lastUpdate = $notifUser->getGlobalUpdateTime(); + if ( $lastUpdate !== false ) { + $modifiedTimes['notifications'] = $lastUpdate; + } + } + } + /** * Handler for UnitTestsList hook. * @see http://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList diff --git a/includes/NotifUser.php b/includes/NotifUser.php index 1249759..cee5341 100644 --- a/includes/NotifUser.php +++ b/includes/NotifUser.php @@ -483,11 +483,10 @@ $this->setInCache( $this->getGlobalMemcKey( 'echo-notification-timestamp-message' ), $globalMsgUnread === false ? -1 : $globalMsgUnread->getTimestamp( TS_MW ), 86400 ); $this->setInCache( $this->getGlobalMemcKey( 'echo-notification-timestamp' ), $globalAllUnread === false ? -1 : $globalAllUnread->getTimestamp( TS_MW ), 86400 ); - // Invalidate the user's cache - $user = $this->mUser; - $user->invalidateCache(); + $this->invalidateCache(); // Schedule an update to the echo_unread_wikis table + $user = $this->mUser; DeferredUpdates::addCallableUpdate( function () use ( $user, $alertCount, $alertUnread, $msgCount, $msgUnread ) { $uw = EchoUnreadWikis::newFromUser( $user ); if ( $uw ) { @@ -497,6 +496,38 @@ } /** + * Get the timestamp of the last time the global notification counts/timestamps were updated, if available. + * + * If the timestamp of the last update is not known, this will return the current timestamp. + * If the user is not attached, this will return false. + * + * @return string|false MW timestamp of the last update, or false if the user is not attached + */ + public function getGlobalUpdateTime() { + $key = $this->getGlobalMemcKey( 'echo-notification-updated' ); + if ( $key === false ) { + return false; + } + return wfTimestamp( TS_MW, ObjectCache::getMainWANInstance()->getCheckKeyTime( $key ) ); + } + + /** + * Invalidate user caches related to notification counts/timestamps. + * + * This bumps the local user's touched timestamp as well as the timestamp returned by getGlobalUpdateTime(). + */ + protected function invalidateCache() { + // Update the user touched timestamp for the local user + $this->mUser->invalidateCache(); + + // Update the global touched timestamp + $key = $this->getGlobalMemcKey( 'echo-notification-updated' ); + if ( $key ) { + ObjectCache::getMainWANInstance()->touchCheckKey( $key ); + } + } + + /** * Get the user's email notification format * @return string */ -- To view, visit https://gerrit.wikimedia.org/r/288263 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I22c88a017f18a28179906049ee423c2d7e81c939 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Echo Gerrit-Branch: wmf/1.28.0-wmf.1 Gerrit-Owner: Catrope <roan.katt...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits