I believe Mike's comments still stand as of current master - MutationLogHarvester::load() is responsible for loading the log from disk (called from Warmup::doWarmup), and it iterates across all blocks in the mutation log, adding items found to MutationLogHarvester::loading - a map of vbucket to a pair of
The loading map is populated in a single call - so for example if the size of this map pushes memory usage above the high watermark, then fewer items than desired will be loaded. Once the loading map is deleted - when the MutationLogHarvester is deleted (i.e. at the end of Warmup::doWarmup) then memory usage will drop.
We should look at addressing this - along the same lines as Mike's comment - load keys incrementally, or at least in chunks.