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>
/* 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 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;
RETURN(INTERVAL_ITER_STOP);
arg->kms = arg->old_kms;
arg->complete = true;
RETURN(INTERVAL_ITER_STOP);