mirror of
https://github.com/versity/scoutfs.git
synced 2026-04-10 00:49:08 +00:00
We increase the reserve from 2x to 3x the minimum number of blocks needed for our reserve, and change the algorithm that determines when to swap them. The old algorithm swaps them if _avail is just larger than _freed. While the simplest algorithm, it suffers from the problem that in practice, when we hit ENOSPC conditions, it will almost always swap on every iteration when we hit our low water mark. In our testing, we regularly see failures because what is effectively happening is that we starve both allocators by slowly draining them block by block, trying to do work. The work of course requires us to drain more blocks to commit changes. This cycle doesn't end until both allocators are almost completely drained and not enough blocks remain to do any real work anymore. The new algorithm will not swap allocators unless _freed is 50% larger than _avail. The outcome is that, during meta space pressure, we're allowing _avail to slowly drain down to the same levels as before, effectively. However, we then swap to _freed which is now 1.5x larger. This results in us being able to do a whole chunk of work without needing to swap. While draining _avail for longer, we allow work to commit and recycle blocks back into _freed muich more effectively. Signed-off-by: Auke Kok <auke.kok@versity.com>