Whamcloud - gitweb
LU-14777 lod: fix E2BIG on create 43/44043/3
authorSergey Cheremencev <sergey.cheremencev@hpe.com>
Fri, 18 Dec 2020 13:18:13 +0000 (16:18 +0300)
committerOleg Drokin <green@whamcloud.com>
Thu, 30 Sep 2021 13:27:08 +0000 (13:27 +0000)
A fix solves 2 cases that caused create to fail
with -E2BIG.
1. Stripe count number should be calculated depending
on LOV_PATTERN_OVERSTRIPING flag.
2. In a case of failover lod_comp_entry_stripe_count
may return 0 if all OST targets have been disconnected.
Return EAGAIN in such case to calculate this later,
when at least one OST would be connected.

HPE-bug-id: LUS-9485
Fixes: aa72de32 ("LU-11691 lov: Limit layout size to max ea size")
Change-Id: I26cad4903d5dd6197fe1384013fbba8b2c76487c
Signed-off-by: Sergey Cheremencev <sergey.cheremencev@hpe.com>
Reviewed-on: https://review.whamcloud.com/44043
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lod/lod_internal.h
lustre/lod/lod_lov.c
lustre/lod/lod_object.c

index 0e41743..3060e7a 100644 (file)
@@ -157,6 +157,7 @@ struct lod_device {
 
 #define lod_ost_bitmap         lod_ost_descs.ltd_tgt_bitmap
 #define lod_ost_count          lod_ost_descs.ltd_lov_desc.ld_tgt_count
 
 #define lod_ost_bitmap         lod_ost_descs.ltd_tgt_bitmap
 #define lod_ost_count          lod_ost_descs.ltd_lov_desc.ld_tgt_count
+#define lod_ost_active_count   lod_ost_descs.ltd_lov_desc.ld_active_tgt_count
 #define lod_remote_mdt_count   lod_mdt_descs.ltd_lmv_desc.ld_tgt_count
 
 struct lod_layout_component {
 #define lod_remote_mdt_count   lod_mdt_descs.ltd_lmv_desc.ld_tgt_count
 
 struct lod_layout_component {
index ae80072..ab139b7 100644 (file)
@@ -745,11 +745,18 @@ static int lod_gen_component_ea(const struct lu_env *env,
                        RETURN(-E2BIG);
                objs = &v3->lmm_objects[0];
        }
                        RETURN(-E2BIG);
                objs = &v3->lmm_objects[0];
        }
+       lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        stripe_count = lod_comp_entry_stripe_count(lo, comp_idx, is_dir);
        if (stripe_count == 0 && !is_dir &&
            !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
        stripe_count = lod_comp_entry_stripe_count(lo, comp_idx, is_dir);
        if (stripe_count == 0 && !is_dir &&
            !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
-           !(lod_comp->llc_pattern & LOV_PATTERN_MDT))
+           !(lod_comp->llc_pattern & LOV_PATTERN_MDT)) {
+               /* Try again if all active targets are disconnected.
+                * It is possible when MDS does failover. */
+               if (!lod->lod_ost_active_count &&
+                   lod->lod_ost_count)
+                       RETURN(-EAGAIN);
                RETURN(-E2BIG);
                RETURN(-E2BIG);
+       }
 
        if (!is_dir && lo->ldo_is_composite)
                lod_comp_shrink_stripe_count(lod_comp, &stripe_count);
 
        if (!is_dir && lo->ldo_is_composite)
                lod_comp_shrink_stripe_count(lod_comp, &stripe_count);
@@ -758,7 +765,6 @@ static int lod_gen_component_ea(const struct lu_env *env,
                GOTO(done, rc = 0);
 
        /* generate ost_idx of this component stripe */
                GOTO(done, rc = 0);
 
        /* generate ost_idx of this component stripe */
-       lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        for (i = 0; i < stripe_count; i++) {
                struct dt_object *object;
                __u32 ost_idx = (__u32)-1UL;
        for (i = 0; i < stripe_count; i++) {
                struct dt_object *object;
                __u32 ost_idx = (__u32)-1UL;
index 5729d2f..21d9a03 100644 (file)
@@ -2658,7 +2658,9 @@ __u16 lod_comp_entry_stripe_count(struct lod_object *lo,
                return lod->lod_ost_count;
        else
                return lod_get_stripe_count(lod, lo, comp_idx,
                return lod->lod_ost_count;
        else
                return lod_get_stripe_count(lod, lo, comp_idx,
-                                           entry->llc_stripe_count, false);
+                                           entry->llc_stripe_count,
+                                           entry->llc_pattern &
+                                           LOV_PATTERN_OVERSTRIPING);
 }
 
 static int lod_comp_md_size(struct lod_object *lo, bool is_dir)
 }
 
 static int lod_comp_md_size(struct lod_object *lo, bool is_dir)