objectcache: avoid using heavily time-drifted microtime() values in WAN cache

Change-Id: Ifcb9e4b4a1d5adfdaaa6ea505e34956516b871de
This commit is contained in:
Aaron Schulz 2018-10-18 11:42:27 -07:00
parent 90451ed2bf
commit d2c2bf6553

View 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 );
}
/**