From: Juan Osorio Date: Fri, 30 Nov 2018 22:29:28 +0000 (-0800) Subject: objectcache: Fix WinCache keys longer than 150 chars X-Git-Tag: 1.34.0-rc.0~3259^2 X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=commitdiff_plain;h=5bae617f0f4810d7b044d3d196d4afd0f6f848a0;p=lhc%2Fweb%2Fwiklou.git objectcache: Fix WinCache keys longer than 150 chars Adds MD5 hashing to the generation of keys for WinCache. This fixes the issue of keys (e.g. sub-headings) longer than 150 characters. Bug: T210794 Change-Id: Ieabf6b014a0660198077a23760a05564bf268535 --- diff --git a/includes/libs/objectcache/WinCacheBagOStuff.php b/includes/libs/objectcache/WinCacheBagOStuff.php index 98f44d11b5..9c6c907c02 100644 --- a/includes/libs/objectcache/WinCacheBagOStuff.php +++ b/includes/libs/objectcache/WinCacheBagOStuff.php @@ -61,4 +61,40 @@ class WinCacheBagOStuff extends BagOStuff { return $ok; } + + /** + * Construct a cache key. + * + * @since 1.27 + * @param string $keyspace + * @param array $args + * @return string + */ + public function makeKeyInternal( $keyspace, $args ) { + // WinCache keys have a maximum length of 150 characters. From that, + // subtract the number of characters we need for the keyspace and for + // the separator character needed for each argument. To handle some + // custom prefixes used by thing like WANObjectCache, limit to 125. + // NOTE: Same as in memcached, except the max key length there is 255. + $charsLeft = 125 - strlen( $keyspace ) - count( $args ); + + $args = array_map( + function ( $arg ) use ( &$charsLeft ) { + // 33 = 32 characters for the MD5 + 1 for the '#' prefix. + if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) { + $arg = '#' . md5( $arg ); + } + + $charsLeft -= strlen( $arg ); + return $arg; + }, + $args + ); + + if ( $charsLeft < 0 ) { + return $keyspace . ':BagOStuff-long-key:##' . md5( implode( ':', $args ) ); + } + + return $keyspace . ':' . implode( ':', $args ); + } }