Whamcloud - gitweb
LU-8922 lod: check master stripes properly 47/24247/2
authorDi Wang <di.wang@intel.com>
Thu, 8 Dec 2016 09:55:26 +0000 (04:55 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 1 Jan 2017 01:57:41 +0000 (01:57 +0000)
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 <di.wang@intel.com>
Change-Id: I089f5cf517c71816151e8ece1b36b9064ee3b7f2
Reviewed-on: https://review.whamcloud.com/24247
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lod/lod_object.c
lustre/mgs/mgs_llog.c
lustre/tests/conf-sanity.sh

index cb15551..eb26b30 100644 (file)
@@ -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;
                }
 
index c84988b..16ebfd7 100644 (file)
@@ -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);
                        }
                }
 
index f8ad8ad..a3a6af5 100755 (executable)
@@ -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