Whamcloud - gitweb
LU-13312 ldlm: fix to stop iterating tree early in ldlm_kms_shift_cb() 62/37762/5
authorWang Shilong <wshilong@ddn.com>
Sat, 29 Feb 2020 14:02:55 +0000 (22:02 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 24 Mar 2020 05:20:39 +0000 (05:20 +0000)
It is very possible that old_kms is equal (last extent end + 1),
and if we fail last one check, we will have to iterate all PR extent locks
in tree which is O(N).

This is very likely to happen in IO500 hard mode, because firstly
we try to write which generates a lot of PW locks, after that read
is triggered which need cancel all PW locks to PR locks.

Be careful to avoid overflow, as @l_extent.end could be OBD_OBJECT_EOF,
if that is case, it just means we could stop iterating.

Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Change-Id: Ie142fb738482a8abcc7d0c9d67d6e6eb520459db
Reviewed-on: https://review.whamcloud.com/37762
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Gu Zheng <gzheng@ddn.com>

index 9e046c9..2cfd006 100644 (file)
@@ -890,7 +890,8 @@ static enum interval_iter ldlm_kms_shift_cb(struct interval_node *n,
        /* If we find a lock with a greater or equal kms, we are not the
         * highest lock (or we share that distinction with another lock), and
         * don't need to update KMS.  Return old_kms and stop looking. */
-       if (lock->l_policy_data.l_extent.end >= arg->old_kms) {
+       if (lock->l_policy_data.l_extent.end == OBD_OBJECT_EOF ||
+           lock->l_policy_data.l_extent.end + 1 >= arg->old_kms) {
                arg->kms = arg->old_kms;
                arg->complete = true;