Whamcloud - gitweb
LU-13608 out: don't return einprogress error 83/41183/2
authorAlexander Boyko <c17825@cray.com>
Thu, 30 Jul 2020 12:04:27 +0000 (08:04 -0400)
committerOleg Drokin <green@whamcloud.com>
Tue, 16 Feb 2021 21:59:48 +0000 (21:59 +0000)
When out_handle proccess an update request it could happened
that file doesn't exist, osd_fid_lookup triggers  scrub and
returns EINPROGRESS. Remote MDT would process EINPROGRESS at
ptlrpc layer and resend a request in loop, and MDT recovery
would be blocked.

The fix adds fid to OI for ENOENT, like it was before the LU-7782.
So the second attempt with the same fid will return ENOENT.

Lustre-change: https://review.whamcloud.com/39538
Lustre-commit: 865aa3f692bccdd9cf7ff6cafeee350e06bb8d76

Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com>
HPE-bug-id: LUS-9062
Change-Id: Ib9a1753234ccc773e9b9529195ebfa6e5a8c101c
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Andriy Skulysh <c17819@cray.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/41183
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/osd-ldiskfs/osd_handler.c

index 6d802a2..ffec5c7 100644 (file)
@@ -1268,13 +1268,15 @@ trigger:
                if (scrub->os_partial_scan && !scrub->os_in_join)
                        goto join;
 
-               if (IS_ERR_OR_NULL(inode) || result)
+               osd_add_oi_cache(info, dev, id, fid);
+               if (IS_ERR_OR_NULL(inode) || result) {
+                       osd_oii_insert(dev, oic, result == -ENOENT);
                        GOTO(out, result = -EINPROGRESS);
+               }
 
                LASSERT(remote);
                LASSERT(obj->oo_inode == inode);
 
-               osd_add_oi_cache(info, dev, id, fid);
                osd_oii_insert(dev, oic, true);
                goto found;
        }
@@ -1297,13 +1299,15 @@ join:
        if (rc1 && rc1 != -EALREADY)
                GOTO(out, result = -EREMCHG);
 
-       if (IS_ERR_OR_NULL(inode) || result)
+       osd_add_oi_cache(info, dev, id, fid);
+       if (IS_ERR_OR_NULL(inode) || result) {
+               osd_oii_insert(dev, oic, result == -ENOENT);
                GOTO(out, result = -EINPROGRESS);
+       }
 
        LASSERT(remote);
        LASSERT(obj->oo_inode == inode);
 
-       osd_add_oi_cache(info, dev, id, fid);
        osd_oii_insert(dev, oic, true);
        goto found;