From 5bae617f0f4810d7b044d3d196d4afd0f6f848a0 Mon Sep 17 00:00:00 2001 From: Juan Osorio Date: Fri, 30 Nov 2018 14:29:28 -0800 Subject: [PATCH] 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 --- .../libs/objectcache/WinCacheBagOStuff.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) 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 ); + } } -- 2.20.1