localisation: Release data from memory in LCStoreStaticArray::finishWrite
authorTimo Tijhof <krinklemail@gmail.com>
Wed, 4 Sep 2019 20:35:10 +0000 (21:35 +0100)
committerTimo Tijhof <krinklemail@gmail.com>
Wed, 4 Sep 2019 20:35:10 +0000 (21:35 +0100)
commit55db848b773c449cb481feed31e105ae149c1c6a
treed2b87b0bc9b31cce64d84e1b68708ead5ffaf0eb
parente45170d8f024985711a868abab523f01bebc9f08
localisation: Release data from memory in LCStoreStaticArray::finishWrite

With this change, the memory behaviour of LCStoreStaticArray
matches the other LCStore implementations. Specifically, that when
mass-rebuilding LocalisationCache entries for all language codes,
the computed data should be released from memory after
calling LCStore::finishWrite().

This doesn't affect user-facing web requests, even in the case
of stock MW where every once in a while a user request can lazy-
regenerate the LCStore, there is a process-cache in front of LCStore
in the LocalisationCache class.

The rebuildLocalisationCache.php clears that via
LocalisationCacheBulkLoad::unload(), but due to LCStoreStaticArray
internally holding on to the data, it was still leaking.

The leak was found by @Nikerabbit as part of testing for T218207.

To test this, amend rebuildLocalisationCache.php and add the
following on line 161, as the first line of the doRebuild/foreach/if
block:

  echo "[$code-start-mem] " . round(memory_get_usage(true)/1024/1024, 2) . " MB\n";

If you then have LocalSettings.php configured like so:

  $wgCacheDirectory = $wgTmpDirectory;
  $wgLocalisationCacheConf['store'] = 'array';

Then before this patch, running rebuildLocalisationCache.php,
shows memory starting at 12 MB and growing 2-3 MB for every language
until the very end, closing with 970 MB memory use.

After this patch, it starts at 12 MB and stops growing at 32 MB.

When configuring as `['store'] = 'files'`, which uses LCStoreCDB,
the memory starts at 12 MB and stops growing at 44 MB, both before
and after this patch.

Bug: T218207
Change-Id: I0d215efee5b31766776a068b16811d52f9879312
includes/cache/localisation/LCStoreStaticArray.php