From: Di Wang Date: Thu, 8 Dec 2016 09:55:26 +0000 (-0500) Subject: LU-8922 lod: check master stripes properly X-Git-Tag: 2.9.52~75 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=1be03a1088d2aa583c2651435634ba336b48f939 LU-8922 lod: check master stripes properly When creating striped directory, it should first check if the stripe has been created on the current MDT, otherwise it might create duplicate stripes on the master MDT, especially when one MDT is deactived, and specified stripes is larger than the active MDTs. Signed-off-by: Di Wang Change-Id: I089f5cf517c71816151e8ece1b36b9064ee3b7f2 Reviewed-on: https://review.whamcloud.com/24247 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Fan Yong Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index cb15551..eb26b30 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -1718,7 +1718,7 @@ static int lod_prep_md_striped_create(const struct lu_env *env, if (stripe == NULL) GOTO(out_free, rc = -ENOMEM); - /* Start index will be the master MDT */ + /* Start index must be the master MDT */ master_index = lu_site2seq(lod2lu_dev(lod)->ld_site)->ss_node_id; idx_array[0] = master_index; for (i = 0; i < stripe_count; i++) { @@ -1738,19 +1738,6 @@ static int lod_prep_md_striped_create(const struct lu_env *env, CDEBUG(D_INFO, "try idx %d, mdt cnt %u, allocated %u\n", idx, lod->lod_remote_mdt_count + 1, i); - if (idx == master_index) { - /* Allocate the FID locally */ - rc = obd_fid_alloc(env, lod->lod_child_exp, - &fid, NULL); - if (rc < 0) - GOTO(out_put, rc); - tgt_dt = lod->lod_child; - break; - } - - /* Find next available target */ - if (!cfs_bitmap_check(ltd->ltd_tgt_bitmap, idx)) - continue; if (likely(!OBD_FAIL_CHECK(OBD_FAIL_LARGE_STRIPE))) { /* check whether the idx already exists @@ -1766,6 +1753,22 @@ static int lod_prep_md_striped_create(const struct lu_env *env, continue; } + /* Sigh, this index is not in the bitmap, let's check + * next available target */ + if (!cfs_bitmap_check(ltd->ltd_tgt_bitmap, idx) && + idx != master_index) + continue; + + if (idx == master_index) { + /* Allocate the FID locally */ + rc = obd_fid_alloc(env, lod->lod_child_exp, + &fid, NULL); + if (rc < 0) + GOTO(out_put, rc); + tgt_dt = lod->lod_child; + break; + } + /* check the status of the OSP */ tgt = LTD_TGT(ltd, idx); if (tgt == NULL) @@ -1791,7 +1794,7 @@ static int lod_prep_md_striped_create(const struct lu_env *env, /* Can not allocate more stripes */ if (j == lod->lod_remote_mdt_count) { CDEBUG(D_INFO, "%s: require stripes %u only get %d\n", - lod2obd(lod)->obd_name, stripe_count, i - 1); + lod2obd(lod)->obd_name, stripe_count, i); break; } diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index c84988b..16ebfd7 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -3483,7 +3483,7 @@ static int mgs_write_log_param(const struct lu_env *env, LCONSOLE_ERROR_MSG(0x144, "%s: MDC0 can not be" " (de)activated.\n", mti->mti_svname); - GOTO(end, rc = -EINVAL); + GOTO(end, rc = -EPERM); } } diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index f8ad8ad..a3a6af5 100755 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -3705,6 +3705,7 @@ test_50i() { # prepare MDT/OST, make OSC inactive for OST1 [ "$MDSCOUNT" -lt "2" ] && skip_env "$MDSCOUNT < 2, skipping" && return + load_modules [ $(facet_fstype mds2) == zfs ] && import_zpool mds2 do_facet mds2 "$TUNEFS --param mdc.active=0 $(mdsdevname 2)" || error "tunefs MDT2 failed" @@ -3735,7 +3736,7 @@ test_50i() { rm -rf $DIR/$tdir/2 || error "unlink dir failed" # deactivate MDC for MDT2 - local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active" + TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active" set_conf_param_and_check client \ "$TEST" "${FSNAME}-MDT0001.mdc.active" 0 || error "Unable to deactivate MDT2" @@ -3743,6 +3744,13 @@ test_50i() { $LFS mkdir -i1 $DIR/$tdir/2 && error "mkdir $DIR/$tdir/2 succeeds after deactive MDT" + $LFS mkdir -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir || + error "mkdir $DIR/$tdir/striped_dir fails after deactive MDT2" + + local stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) + [ $stripe_count -eq $((MDSCOUNT - 1)) ] || + error "wrong $stripe_count != $((MDSCOUNT -1)) for striped_dir" + # cleanup umount_client $MOUNT || error "Unable to umount client" stop_mds