Krinkle has uploaded a new change for review.

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

Change subject: [WIP] resourceloader: Implement version hashes instead of 
timestamps
......................................................................

[WIP] resourceloader: Implement version hashes instead of timestamps

Bug: T94810
Change-Id: Ibb292d2416839327d1807a66c78fd96dac0637d0
---
M includes/resourceloader/ResourceLoaderModule.php
M includes/resourceloader/ResourceLoaderStartUpModule.php
2 files changed, 48 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/61/207661/1

diff --git a/includes/resourceloader/ResourceLoaderModule.php 
b/includes/resourceloader/ResourceLoaderModule.php
index d1b024f..f28c9bf 100644
--- a/includes/resourceloader/ResourceLoaderModule.php
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -425,20 +425,36 @@
        /* Abstract Methods */
 
        /**
-        * Get this module's last modification timestamp for a given
-        * combination of language, skin and debug mode flag. This is typically
-        * the highest of each of the relevant components' modification
-        * timestamps. Whenever anything happens that changes the module's
-        * contents for these parameters, the mtime should increase.
+        * Get a string identifying the current version of this module in a 
given context.
         *
-        * NOTE: The mtime of the module's messages is NOT automatically 
included.
-        * If you want this to happen, you'll need to call getMsgBlobMtime()
-        * yourself and take its result into consideration.
+        * Whenever anything happens that changes the module's response (e.g. 
scripts, styles, and
+        * messages) this value must change. This value is used to store module 
responses in cache.
+        * (Both client-side and server-side.)
         *
-        * NOTE: The mtime of the module's hash is NOT automatically included.
-        * If your module provides a getModifiedHash() method, you'll need to 
call getHashMtime()
-        * yourself and take its result into consideration.
+        * This method should run fast because it is frequently run by 
ResourceLoaderStartUpModule to
+        * propagate changes to the client and effectively  invalidate cache.
         *
+        * A number of utility methods are available to help you gathering data:
+        *
+        * - getMsgBlobMtime
+        *
+        * If modules have a hash or timestamp from another source, that should 
be returned as-is.
+        *
+        * If modules need to collect data (e.g. file timestamps, definition 
summaries etc.),
+        * return a serialised version of that data and defer hashing to 
ResourceLoader.
+        * E.g. return `json_encode( .. )`, not `sha1( json_encode( .. ) )`.
+        *
+        * @param ResourceLoaderContext $context
+        * @return string 0 or more characters
+        */
+       public function getVersionHash( ResourceLoaderContext $context ) {
+               return '';
+       }
+
+       /**
+        * Get this module's last modification timestamp for a given context.
+        *
+        * @deprecated since 1.26 Use getVersionHash() directly.
         * @param ResourceLoaderContext $context Context object
         * @return int UNIX timestamp
         */
@@ -447,8 +463,13 @@
        }
 
        /**
-        * Helper method for calculating when the module's hash (if it has one) 
changed.
+        * Helper method for calculating when the custom hash changed.
         *
+        * This method uses ObjectCache to track when a hash was first seen. 
That principle stems from
+        * a time that ResourceLoader could only identify module versions by 
timestamp.
+        * That is no longer the case. Use getVersionHash() directly.
+        *
+        * @deprecated since 1.26 Use getVersionHash() directly.
         * @param ResourceLoaderContext $context
         * @return int UNIX timestamp
         */
@@ -484,9 +505,7 @@
        /**
         * Get the hash for whatever this module may contain.
         *
-        * This is the method subclasses should implement if they want to make
-        * use of getHashMTime() inside getModifiedTime().
-        *
+        * @deprecated since 1.26 Use getVersionHash() directly.
         * @param ResourceLoaderContext $context
         * @return string|null Hash
         */
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php 
b/includes/resourceloader/ResourceLoaderStartUpModule.php
index 48b3576..13b4ec8 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -209,10 +209,17 @@
                                continue;
                        }
 
-                       // Coerce module timestamp to UNIX timestamp.
-                       // getModifiedTime() is supposed to return a UNIX 
timestamp, but custom implementations
-                       // might forget. TODO: Maybe emit warning?
-                       $moduleMtime = wfTimestamp( TS_UNIX, 
$module->getModifiedTime( $context ) );
+                       $versionHash = $module->getVersionHash( $context );
+                       if ( $versionHash === '' ) {
+                               // Support: MediaWiki 1.25 and earlier
+                               // Beware: Some getModifiedTime() 
implementations return their timestamp in a format
+                               // that is not an integer UNIX timestamp. This 
used to convert it with wfTimestamp(),
+                               // but since we're hashing, use it as-is.
+                               $versionHash = strval( 
$module->getModifiedTime( $context ) );
+                       }
+
+                       // Salt the hash with wgCacheEpoch
+                       $versionHash = $versionHash . $this->getConfig()->get( 
'CacheEpoch' );
 
                        $skipFunction = $module->getSkipFunction();
                        if ( $skipFunction !== null && 
!ResourceLoader::inDebugMode() ) {
@@ -225,14 +232,8 @@
                                );
                        }
 
-                       $mtime = max(
-                               $moduleMtime,
-                               wfTimestamp( TS_UNIX, $this->getConfig()->get( 
'CacheEpoch' ) )
-                       );
-
                        $registryData[$name] = array(
-                               // Convert to numbers as wfTimestamp always 
returns a string, even for TS_UNIX
-                               'version' => (int) $mtime,
+                               'versionHash' => sha1( $versionHash ),
                                'dependencies' => $module->getDependencies(),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
@@ -253,7 +254,7 @@
                        if ( $data['loader'] !== false ) {
                                $out .= ResourceLoader::makeCustomLoaderScript(
                                        $name,
-                                       $data['version'],
+                                       $data['versionHash'],
                                        $data['dependencies'],
                                        $data['group'],
                                        $data['source'],
@@ -265,7 +266,7 @@
                        // Call mw.loader.register(name, timestamp, 
dependencies, group, source, skip)
                        $registrations[] = array(
                                $name,
-                               $data['version'],
+                               $data['versionHash'],
                                $data['dependencies'],
                                $data['group'],
                                // Swap default (local) for null

-- 
To view, visit https://gerrit.wikimedia.org/r/207661
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb292d2416839327d1807a66c78fd96dac0637d0
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Krinkle <krinklem...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to