objectcache: avoid using heavily time-drifted microtime() values in WAN cache
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 18 Oct 2018 18:42:27 +0000 (11:42 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Thu, 18 Oct 2018 18:42:27 +0000 (11:42 -0700)
Change-Id: Ifcb9e4b4a1d5adfdaaa6ea505e34956516b871de

includes/libs/objectcache/WANObjectCache.php

index 3af820b..e7586cf 100644 (file)
@@ -2225,7 +2225,17 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @codeCoverageIgnore
         */
        protected function getCurrentTime() {
-               return $this->wallClockOverride ?: microtime( true );
+               if ( $this->wallClockOverride ) {
+                       return $this->wallClockOverride;
+               }
+
+               $clockTime = (float)time(); // call this first
+               // microtime() uses an initial gettimeofday() call added to usage clocks.
+               // This can severely drift from time() and the microtime() value of other threads
+               // due to undercounting of the amount of time elapsed. Instead of seeing the current
+               // time as being in the past, use the value of time(). This avoids setting cache values
+               // that will immediately be seen as expired and possibly cause stampedes.
+               return max( microtime( true ), $clockTime );
        }
 
        /**