summaryrefslogtreecommitdiff
tag namedefer-ops-stalls_2020-10-10 (92be85b6c599f2c4a71baebd6c87c239d8d09c3f)
tag date2020-10-10 10:59:13 -0700
tagged byDarrick J. Wong <darrick.wong@oracle.com>
tagged objectcommit e210b768ce...
xfs: fix some log stalling problems in defer ops
This series tries to fix some structural problems in the defer ops code. The defer ops code has been finishing items in the wrong order -- if a top level defer op creates items A and B, and finishing item A creates more defer ops A1 and A2, we'll put the new items on the end of the chain and process them in the order A B A1 A2. This is kind of weird, since it's convenient for programmers to be able to think of A and B as an ordered sequence where all the work for A must finish before we move on to B, e.g. A A1 A2 D. That isn't how the defer ops actually works, but so far we've been lucky that this hasn't ever caused serious problems. This /will/, however, when we get to the atomic extent swap code, where for refcounting purposes it actually /does/ matter that unmap and map child intents execute in that order, and complete before we move on to the next extent in the files. This also causes a very long chain of intent items to build up, which can exhaust memory. We need to teach defer ops to finish all the sub-work associated with each defer op that the caller gave us, to minimize the length of the defer ops chains; and then we need to teach it to relog items periodically to avoid pinning the log tail. v2: combine all the relog patches into one, and base the decision to relog an iten dependent on whether or not it's in an old checkpoint v3: fix backwards logic, don't relog items in the same checkpoint, and split up the changes