From: Hongchao Zhang Date: Fri, 8 Mar 2024 02:45:02 +0000 (+0800) Subject: EX-6247 lfsck: support compression in filter_fid X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=9e3db92ed14c996b69ddcfba40b469943abf7021;p=fs%2Flustre-release.git EX-6247 lfsck: support compression in filter_fid The OST object compression info has been stored in filter_fid by EX-8038, the LFSCK also needs to handle the compression info during processing the filter_fid. Fixes: bf4f5295e594 ("EX-8038 csdc: expand filter_fid") Signed-off-by: Hongchao Zhang Change-Id: Id050214ba0057776a05c194dc9222117c5d7fd8b Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54158 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Andreas Dilger --- diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index 32a044a..ae26ed7 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -399,7 +399,8 @@ struct lu_orphan_rec_v3 { __u32 lor_layout_version; /* The OST-object declared layout range (of version) in PFID EA.*/ __u32 lor_range; - __u32 lor_padding_1; + struct ost_layout_compr lor_layout_compr; + __u16 lor_padding_1; __u64 lor_padding_2; }; diff --git a/lustre/include/uapi/linux/lustre/lustre_user.h b/lustre/include/uapi/linux/lustre/lustre_user.h index 8f8f94e..a069b0c 100644 --- a/lustre/include/uapi/linux/lustre/lustre_user.h +++ b/lustre/include/uapi/linux/lustre/lustre_user.h @@ -790,7 +790,8 @@ static inline bool lov_pattern_supported(__u32 pattern) static inline bool lov_pattern_supported_normal_comp(__u32 pattern) { return pattern == LOV_PATTERN_RAID0 || - pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING); + pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) || + pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_COMPRESS); } diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 0886663..4255fac 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -1790,13 +1790,17 @@ static int lfsck_layout_new_v1_lovea(const struct lu_env *env, struct dt_object *parent, struct lu_buf *buf, __u32 ea_off, struct lov_mds_md_v1 **lmm, - struct lov_ost_data_v1 **objs) + struct lov_ost_data_v1 **objs, + struct ost_layout_compr *compr) { int size; __u32 stripe_size = ol->ol_stripe_size; __u32 pattern = LOV_PATTERN_RAID0; __u16 count; + if (compr->ol_compr_type != LL_COMPR_TYPE_NONE) + pattern |= LOV_PATTERN_COMPRESS; + if (ol->ol_stripe_count != 0) count = ol->ol_stripe_count; else @@ -1882,6 +1886,16 @@ static int lfsck_layout_new_comp_lovea(const struct lu_env *env, lcme->lcme_offset = cpu_to_le32(offset); lcme->lcme_size = cpu_to_le32(lcme_size); lcme->lcme_layout_gen = lcm->lcm_layout_gen; + + if (rec->lor_layout_compr.ol_compr_type != LL_COMPR_TYPE_NONE) { + pattern |= LOV_PATTERN_COMPRESS; + lcme->lcme_flags |= cpu_to_le32(LCME_FL_COMPRESS); + lcme->lcme_compr_type = rec->lor_layout_compr.ol_compr_type; + lcme->lcme_compr_lvl = rec->lor_layout_compr.ol_compr_lvl; + lcme->lcme_compr_chunk_log_bits = + rec->lor_layout_compr.ol_compr_chunk_log_bits; + } + if (ol->ol_stripe_count > 1) pattern |= LOV_PATTERN_F_HOLE; @@ -1895,7 +1909,8 @@ static int lfsck_layout_new_comp_lovea(const struct lu_env *env, static void lfsck_layout_update_lcm(struct lov_comp_md_v1 *lcm, struct lov_comp_md_entry_v1 *lcme, - __u32 version, __u32 range) + __u32 version, __u32 range, + struct ost_layout_compr *compr) { struct lov_comp_md_entry_v1 *tmp; __u64 start = le64_to_cpu(lcme->lcme_extent.e_start); @@ -1917,6 +1932,14 @@ static void lfsck_layout_update_lcm(struct lov_comp_md_v1 *lcm, else if (flags == LCM_FL_NONE && le16_to_cpu(lcm->lcm_mirror_count) > 0) lcm->lcm_flags = cpu_to_le16(LCM_FL_RDONLY); + if (compr->ol_compr_type != LL_COMPR_TYPE_NONE) { + lcme->lcme_flags |= cpu_to_le32(LCME_FL_COMPRESS); + lcme->lcme_compr_type = compr->ol_compr_type; + lcme->lcme_compr_lvl = compr->ol_compr_lvl; + lcme->lcme_compr_chunk_log_bits = + compr->ol_compr_chunk_log_bits; + } + for (i = 0; i < count; i++) { tmp = &lcm->lcm_entries[i]; if (le64_to_cpu(tmp->lcme_extent.e_end) <= start) @@ -2034,14 +2057,17 @@ static int lfsck_layout_add_comp(const struct lu_env *env, pattern |= LOV_PATTERN_F_HOLE; lmm = buf->lb_buf + offset; - /* 5. Insert teh new component body at the 'offset'. */ + /* 5. Insert the new component body at the 'offset'. */ + if (rec->lor_layout_compr.ol_compr_type != LL_COMPR_TYPE_NONE) + pattern |= LOV_PATTERN_COMPRESS; + objs = __lfsck_layout_new_v1_lovea(lmm, lfsck_dto2fid(parent), ol->ol_stripe_size, ea_off, pattern, ol->ol_stripe_count); /* 6. Update mirror related flags and version. */ lfsck_layout_update_lcm(lcm, lcme, rec->lor_layout_version, - rec->lor_range); + rec->lor_range, &rec->lor_layout_compr); rc = lfsck_layout_refill_lovea(env, lfsck, handle, parent, cfid, buf, lmm, objs, LU_XATTR_REPLACE, ost_idx, @@ -2153,7 +2179,7 @@ static int lfsck_layout_update_lovea(const struct lu_env *env, else rc = lfsck_layout_new_v1_lovea(env, lfsck, &rec->lor_layout, parent, buf, ea_off, &lmm, - &objs); + &objs, &rec->lor_layout_compr); if (rc > 0) rc = lfsck_layout_refill_lovea(env, lfsck, handle, parent, cfid, buf, lmm, objs, fl, ost_idx, rc); @@ -2178,7 +2204,8 @@ static int __lfsck_layout_update_pfid(const struct lu_env *env, struct dt_object *child, const struct lu_fid *pfid, const struct ost_layout *ol, __u32 offset, - __u32 version, __u32 range) + __u32 version, __u32 range, + struct ost_layout_compr *compr) { struct dt_device *dev = lfsck_obj2dev(child); struct filter_fid *ff = &lfsck_env_info(env)->lti_ff; @@ -2198,6 +2225,7 @@ static int __lfsck_layout_update_pfid(const struct lu_env *env, ost_layout_cpu_to_le(&ff->ff_layout, ol); ff->ff_layout_version = cpu_to_le32(version); ff->ff_range = cpu_to_le32(range); + ff->ff_layout_compr = *compr; lfsck_buf_init(&buf, ff, sizeof(*ff)); handle = lfsck_trans_create(env, dev, com->lc_lfsck); @@ -2246,7 +2274,7 @@ static int lfsck_layout_update_pfid(const struct lu_env *env, lu_object_fid(&parent->do_lu), &rec->lor_layout, ea_off, rec->lor_layout_version, - rec->lor_range); + rec->lor_range, &rec->lor_layout_compr); lfsck_object_put(env, child); RETURN(rc == 0 ? 1 : rc); @@ -2494,7 +2522,8 @@ again: rc = __lfsck_layout_update_pfid(env, com, cobj, pfid, &rec->lor_layout, ea_off, rec->lor_layout_version, - rec->lor_range); + rec->lor_range, + &rec->lor_layout_compr); } GOTO(stop, rc); @@ -3021,7 +3050,8 @@ further: lcme->lcme_flags = cpu_to_le32(flags | LCME_FL_INIT); lfsck_layout_update_lcm(lcm, lcme, rec->lor_layout_version, - rec->lor_range); + rec->lor_range, + &rec->lor_layout_compr); } rc = lfsck_layout_extend_v1v3_lovea(env, lfsck, handle, ol, @@ -3090,7 +3120,8 @@ further: LCME_FL_INIT); lfsck_layout_update_lcm(lcm, lcme, rec->lor_layout_version, - rec->lor_range); + rec->lor_range, + &rec->lor_layout_compr); } LASSERTF(buf->lb_len >= lovea_size, @@ -3411,6 +3442,10 @@ static int lfsck_lov2layout(struct lov_mds_md_v1 *lmm, struct filter_fid *ff, ol->ol_comp_end = le64_to_cpu(lcme->lcme_extent.e_end); ol->ol_comp_id = le32_to_cpu(lcme->lcme_id); ff->ff_layout_version = le32_to_cpu(lcme->lcme_layout_gen); + ff->ff_layout_compr.ol_compr_type = lcme->lcme_compr_type; + ff->ff_layout_compr.ol_compr_lvl = lcme->lcme_compr_lvl; + ff->ff_layout_compr.ol_compr_chunk_log_bits = + lcme->lcme_compr_chunk_log_bits; ff->ff_range = 0; } else { GOTO(out, rc = -EINVAL); @@ -5248,7 +5283,8 @@ static int lfsck_layout_slave_repair_pfid(const struct lu_env *env, &lrl->lrl_ff_client.ff_layout, lrl->lrl_ff_client.ff_layout_version, lrl->lrl_ff_client.ff_range, - lrl->lrl_ff_client.ff_parent.f_ver); + lrl->lrl_ff_client.ff_parent.f_ver, + &lrl->lrl_ff_client.ff_layout_compr); GOTO(unlock, rc); @@ -7553,6 +7589,9 @@ again1: if (rc < sizeof(struct lu_fid)) GOTO(out, rc = (rc < 0 ? rc : -EINVAL)); + if (rc < sizeof(struct filter_fid)) + memset(&ff->ff_layout_compr, 0, sizeof(ff->ff_layout_compr)); + fid_le_to_cpu(&rec->lor_rec.lor_fid, &ff->ff_parent); /* Currently, the filter_fid::ff_parent::f_ver is not the real parent * MDT-object's FID::f_ver, instead it is the OST-object index in its @@ -7578,15 +7617,17 @@ again1: rec->lor_layout_version = le32_to_cpu(ff->ff_layout_version & ~LU_LAYOUT_RESYNC); rec->lor_range = le32_to_cpu(ff->ff_range); + rec->lor_layout_compr = ff->ff_layout_compr; - CDEBUG(D_LFSCK, "%s: return orphan "DFID", PFID "DFID", owner %u:%u, " - "stripe size %u, stripe count %u, COMP id %u, COMP start %llu, " - "COMP end %llu, layout version %u, range %u\n", + CDEBUG(D_LFSCK, "%s: return orphan "DFID", PFID "DFID", owner %u:%u, stripe size %u, stripe count %u, COMP id %u, COMP start %llu, COMP end %llu, layout version %u, range %u, compression %s, compression level %u, compression chunk log bits %u\n", lfsck_lfsck2name(com->lc_lfsck), PFID(key), PFID(&rec->lor_rec.lor_fid), rec->lor_rec.lor_uid, rec->lor_rec.lor_gid, ol->ol_stripe_size, ol->ol_stripe_count, ol->ol_comp_id, ol->ol_comp_start, ol->ol_comp_end, - rec->lor_layout_version, rec->lor_range); + rec->lor_layout_version, rec->lor_range, + compress_type_2str(rec->lor_layout_compr.ol_compr_type), + rec->lor_layout_compr.ol_compr_lvl, + rec->lor_layout_compr.ol_compr_chunk_log_bits); GOTO(out, rc = 0); diff --git a/lustre/tests/sanity-lfsck.sh b/lustre/tests/sanity-lfsck.sh index 147c8ec..4e4a56e 100755 --- a/lustre/tests/sanity-lfsck.sh +++ b/lustre/tests/sanity-lfsck.sh @@ -3036,6 +3036,67 @@ test_18h() { } run_test 18h "LFSCK can repair crashed PFL extent range" +test_18i() { + (( $MDS1_VERSION >= $(version_code 2.14.0-ddn137) )) || + skip "Need MDS version at least 2.14.0-ddn137" + + local tfile=$DIR/$tdir/f0 + local guard=$DIR/$tdir/guard + + check_mount_and_prep + mkdir -p $DIR/$tdir + + $LFS setstripe -Z gzip:5 -E 2M -S 1M -c 1 -E -1 $tfile || + error "(0) Fail to create PFL $tfile" + + cat $LUSTRE/tests/test-framework.sh > $tfile || + error "(1.1) Fail to write $tfile" + + dd if=$LUSTRE/tests/test-framework.sh of=$tfile bs=1M seek=2 || + error "(1.2) Fail to write $tfile" + + cp $tfile $guard || + error "(1.3) Failed to copy $tfile to $guard" + + echo "Inject failure to simulate bad PFL" + #define OBD_FAIL_LFSCK_BAD_PFL_RANGE 0x162f + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x162f + + chown 1.1 $tfile + + cancel_lru_locks + do_facet $SINGLEMDS $LCTL set_param fail_loc=0 + + echo "Trigger layout LFSCK to fix them" + $START_LAYOUT -r -o || error "(2) Fail to start LFSCK for layout!" + + for ((k = 1; k <= MDSCOUNT; k++)); do + wait_update_facet mds${k} "$LCTL get_param -n \ + mdd.$(facet_svc mds${k}).lfsck_layout | + awk '/^status/ { print \\\$2 }'" "completed" $LTIME || + error "(3.1) MDS${k} is not the expected 'completed'" + done + + for ((k = 1; k <= MDSCOUNT; k++)); do + cur_status=$(do_facet ost${k} $LCTL get_param -n \ + obdfilter.$(facet_svc ost${k}).lfsck_layout | + awk '/^status/ { print $2 }') + [ "$cur_status" == "completed" ] || + error "(3.2) OST${k} Expect 'completed', but got '$cur_status'" + + done + + local repaired=$($SHOW_LAYOUT | + awk '/^repaired_orphan/ { print $2 }') + [ $repaired -eq 2 ] || + error "(4) Fail to repair crashed PFL range: $repaired" + + echo "Data in $tfile should not be broken" + diff $tfile $guard || + error "(5) Data in $tfile is broken" +} +run_test 18i "LFSCK can repair crashed PFL with compression" + $LCTL set_param debug=-cache > /dev/null test_19a() {