Whamcloud - gitweb
LU-17070 lov: retry layout refresh if got old layouts 88/56988/3
authorBobi Jam <bobijam@whamcloud.com>
Tue, 12 Nov 2024 20:09:12 +0000 (12:09 -0800)
committerOleg Drokin <green@whamcloud.com>
Wed, 22 Jan 2025 18:51:19 +0000 (18:51 +0000)
lov_layout_change() would not apply old layouts which can get through
when MDS doesn't take layout lock, this patch would retry getting
the layout and re-apply the layout again for once.

Lustre-change: https://review.whamcloud.com/55061
Lustre-commit: 7974e41a26c22181be2818b3580756fa559d14d9

Fixes: 13557aa869 ("LU-15300 mdt: refresh LOVEA with LL granted")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id29ec4ada85060a20f730f92a6a9409d755a56a1
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56988
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Zhenyu Xu <bobijam@hotmail.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/vvp_page.c
lustre/lov/lov_object.c

index 06033d8..81131cf 100644 (file)
@@ -252,9 +252,12 @@ static void vvp_vmpage_error(struct inode *inode, struct page *vmpage,
                obj->vob_discard_page_warned = 0;
        } else {
                SetPageError(vmpage);
-               if (ioret != -ENOSPC &&
-                   OBD_FAIL_CHECK(OBD_FAIL_LLITE_PANIC_ON_ESTALE))
-                       LBUG();
+               if (OBD_FAIL_CHECK(OBD_FAIL_LLITE_PANIC_ON_ESTALE))
+                       LASSERTF(ioret == -ENOSPC,
+                                "%s:"DFID" got a stale page %p: rc = %d.\n",
+                                obj->vob_cl.co_lu.lo_dev->ld_obd->obd_name,
+                                PFID(lu_object_fid(&obj->vob_cl.co_lu)),
+                                vmpage, ioret);
 
                mapping_set_error(inode->i_mapping, ioret);
 
index 980bf1d..46c948f 100644 (file)
@@ -1420,7 +1420,12 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj,
                        CDEBUG(D_HA, "skip old for "DFID": %d < %d\n",
                               PFID(lu_object_fid(lov2lu(lov))),
                               (int)newgen, (int)oldgen);
-                       GOTO(out, result = 0);
+                       if (conf->coc_try) {
+                               set_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags);
+                               GOTO(out, result = -ERESTARTSYS);
+                       } else {
+                               GOTO(out, result = 0);
+                       }
                }
        }