summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_mount.h
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2020-05-27 16:08:37 -0700
committerDarrick J. Wong <darrick.wong@oracle.com>2020-06-24 18:12:17 -0700
commit148186a4e4547d4f0d0c00d0993cedf0f115a253 (patch)
treefcb5771ab76d6818a6a4b20de7296a716e713abe /fs/xfs/xfs_mount.h
parent0c5fb05607608257b1efab073ef55bf8bc8743be (diff)
xfs: periodically relog deferred intent itemsdefer-ops-stalls_2020-06-24
There's a subtle design flaw in the deferred log item code that can lead to pinning the log tail. Taking up the defer ops chain examples from the previous commit, we can get trapped in sequences like this: Caller hands us a transaction t0 with D0-D3 attached. The defer ops chain will look like the following if the transaction rolls succeed: t1: D0(t0), D1(t0), D2(t0), D3(t0) t2: d4(t1), d5(t1), D1(t0), D2(t0), D3(t0) t3: d5(t1), D1(t0), D2(t0), D3(t0) ... t9: d9(t7), D3(t0) t10: D3(t0) t11: d10(t10), d11(t10) t12: d11(t10) In transaction 9, we finish d9 and try to roll to t10 while holding onto an intent item for D3 that we logged in t0. The previous commit changed the order in which we place new defer ops in the defer ops processing chain to reduce the maximum chain length. Now make xfs_defer_finish_noroll capable of relogging the entire chain periodically so that we can always move the log tail forward. We do this every seven loops, having observed that while most chains never exceed seven items in length, the rest go far over that and seem to be involved in most of the stall problems. Callers are now required to ensure that the transaction reservation is large enough to handle logging done items and new intent items for the maximum possible chain length. Most callers are careful to keep the chain lengths low, so the overhead should be minimal. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs/xfs_mount.h')
0 files changed, 0 insertions, 0 deletions