Whamcloud - gitweb
LU-6586 mgs: deactive MDT permanently 47/14747/11
authorwang di <di.wang@intel.com>
Thu, 7 May 2015 13:40:51 +0000 (06:40 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 12 Aug 2015 23:50:57 +0000 (23:50 +0000)
Deactivate/activate MDT in the config log, so
the user can permanently deactivate one MDT.

Add active proc entry for MDC, and mark MDC to
be inactive once the MDC is deactivated.

Add conf-sanity.sh 50i to verify activate
and deactivate MDT.

Signed-off-by: wang di <di.wang@intel.com>
Change-Id: Ia8d18f48f12fc180c32da777bde0902a774ddf93
Reviewed-on: http://review.whamcloud.com/14747
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lmv/lmv_obd.c
lustre/lod/lod_dev.c
lustre/mdc/lproc_mdc.c
lustre/mgs/mgs_llog.c
lustre/osp/osp_dev.c
lustre/tests/conf-sanity.sh

index 86c803b..792cfd5 100644 (file)
@@ -71,6 +71,8 @@ static void lmv_activate_target(struct lmv_obd *lmv,
 
         tgt->ltd_active = activate;
         lmv->desc.ld_active_tgt_count += (activate ? 1 : -1);
 
         tgt->ltd_active = activate;
         lmv->desc.ld_active_tgt_count += (activate ? 1 : -1);
+
+       tgt->ltd_exp->exp_obd->obd_inactive = !activate;
 }
 
 /**
 }
 
 /**
index dc30788..8ec09b8 100644 (file)
@@ -866,8 +866,79 @@ static int lod_process_config(const struct lu_env *env,
        }
 
        case LCFG_PARAM: {
        }
 
        case LCFG_PARAM: {
-               struct obd_device *obd = lod2obd(lod);
+               struct obd_device *obd;
+               char *param;
+
+               /* Check if it is activate/deactivate mdc
+                * lustre-MDTXXXX-osp-MDTXXXX.active=1 */
+               param = lustre_cfg_buf(lcfg, 1);
+               if (strstr(param, "osp") != NULL &&
+                   strstr(param, ".active=") != NULL) {
+                       struct lod_tgt_descs    *ltd = &lod->lod_mdt_descs;
+                       struct lod_tgt_desc     *sub_tgt = NULL;
+                       char *ptr;
+                       char *tmp;
+                       int i;
+
+                       ptr = strstr(param, ".");
+                       *ptr = '\0';
+                       obd = class_name2obd(param);
+                       if (obd == NULL) {
+                               CERROR("%s: can not find %s: rc = %d\n",
+                                      lod2obd(lod)->obd_name, param, -EINVAL);
+                               *ptr = '.';
+                               GOTO(out, rc);
+                       }
+
+                       cfs_foreach_bit(ltd->ltd_tgt_bitmap, i) {
+                               struct lod_tgt_desc *tgt;
+
+                               tgt = LTD_TGT(ltd, i);
+                               if (tgt->ltd_tgt->dd_lu_dev.ld_obd == obd) {
+                                       sub_tgt = tgt;
+                                       break;
+                               }
+                       }
+
+                       if (sub_tgt == NULL) {
+                               CERROR("%s: can not find %s: rc = %d\n",
+                                      lod2obd(lod)->obd_name, param, -EINVAL);
+                               *ptr = '.';
+                               GOTO(out, rc);
+                       }
+
+                       *ptr = '.';
+                       tmp = strstr(param, "=");
+                       tmp++;
+                       if (*tmp == '1') {
+                               struct llog_ctxt *ctxt;
 
 
+                               obd = sub_tgt->ltd_tgt->dd_lu_dev.ld_obd;
+                               ctxt = llog_get_context(obd,
+                                               LLOG_UPDATELOG_ORIG_CTXT);
+                               if (ctxt == NULL) {
+                                       rc = llog_setup(env, obd, &obd->obd_olg,
+                                                      LLOG_UPDATELOG_ORIG_CTXT,
+                                                   NULL, &llog_common_cat_ops);
+                                       if (rc < 0)
+                                               GOTO(out, rc);
+                               } else {
+                                       llog_ctxt_put(ctxt);
+                               }
+                               rc = lod_sub_prep_llog(env, lod,
+                                                      sub_tgt->ltd_tgt,
+                                                      sub_tgt->ltd_index);
+                               if (rc == 0)
+                                       sub_tgt->ltd_active = 1;
+                       } else {
+                               lod_sub_fini_llog(env, sub_tgt->ltd_tgt,
+                                                 NULL);
+                               sub_tgt->ltd_active = 0;
+                       }
+                       GOTO(out, rc);
+               }
+
+               obd = lod2obd(lod);
                rc = class_process_proc_param(PARAM_LOV, obd->obd_vars,
                                              lcfg, obd);
                if (rc > 0)
                rc = class_process_proc_param(PARAM_LOV, obd->obd_vars,
                                              lcfg, obd);
                if (rc > 0)
@@ -1743,13 +1814,22 @@ static int lod_obd_get_info(const struct lu_env *env, struct obd_export *exp,
                        tgt = MDT_TGT(d, i);
                        LASSERT(tgt != NULL);
                        LASSERT(tgt->ltd_tgt != NULL);
                        tgt = MDT_TGT(d, i);
                        LASSERT(tgt != NULL);
                        LASSERT(tgt->ltd_tgt != NULL);
+                       if (!tgt->ltd_active)
+                               continue;
+
                        ctxt = llog_get_context(tgt->ltd_tgt->dd_lu_dev.ld_obd,
                                                LLOG_UPDATELOG_ORIG_CTXT);
                        if (ctxt == NULL) {
                        ctxt = llog_get_context(tgt->ltd_tgt->dd_lu_dev.ld_obd,
                                                LLOG_UPDATELOG_ORIG_CTXT);
                        if (ctxt == NULL) {
+                               CDEBUG(D_INFO, "%s: %s is not ready.\n",
+                                      obd->obd_name,
+                                     tgt->ltd_tgt->dd_lu_dev.ld_obd->obd_name);
                                rc = -EAGAIN;
                                break;
                        }
                        if (ctxt->loc_handle == NULL) {
                                rc = -EAGAIN;
                                break;
                        }
                        if (ctxt->loc_handle == NULL) {
+                               CDEBUG(D_INFO, "%s: %s is not ready.\n",
+                                      obd->obd_name,
+                                     tgt->ltd_tgt->dd_lu_dev.ld_obd->obd_name);
                                rc = -EAGAIN;
                                llog_ctxt_put(ctxt);
                                break;
                                rc = -EAGAIN;
                                llog_ctxt_put(ctxt);
                                break;
index 934669d..0466fd7 100644 (file)
 #include "mdc_internal.h"
 
 #ifdef CONFIG_PROC_FS
 #include "mdc_internal.h"
 
 #ifdef CONFIG_PROC_FS
+static int mdc_active_seq_show(struct seq_file *m, void *v)
+{
+       struct obd_device *dev = m->private;
+       int rc;
+
+       LPROCFS_CLIMP_CHECK(dev);
+       rc = seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive);
+       LPROCFS_CLIMP_EXIT(dev);
+       return rc;
+}
+
+static ssize_t mdc_active_seq_write(struct file *file,
+                                   const char __user *buffer,
+                                   size_t count, loff_t *off)
+{
+       struct obd_device *dev;
+       int val, rc;
+
+       dev = ((struct seq_file *)file->private_data)->private;
+       rc = lprocfs_write_helper(buffer, count, &val);
+       if (rc)
+               return rc;
+       if (val < 0 || val > 1)
+               return -ERANGE;
+
+       /* opposite senses */
+       if (dev->u.cli.cl_import->imp_deactive == val)
+               rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val);
+       else
+               CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", val);
+
+       return count;
+}
+LPROC_SEQ_FOPS(mdc_active);
 
 static int mdc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v)
 {
 
 static int mdc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v)
 {
@@ -208,6 +242,8 @@ struct lprocfs_vars lprocfs_mdc_obd_vars[] = {
          .fops =       &mdc_pinger_recov_fops          },
        { .name =       "rpc_stats",
          .fops =       &mdc_rpc_stats_fops             },
          .fops =       &mdc_pinger_recov_fops          },
        { .name =       "rpc_stats",
          .fops =       &mdc_rpc_stats_fops             },
+       { .name =       "active",
+         .fops =       &mdc_active_fops                },
        { NULL }
 };
 #endif /* CONFIG_PROC_FS */
        { NULL }
 };
 #endif /* CONFIG_PROC_FS */
index 7252ee5..1b43a56 100644 (file)
@@ -3319,61 +3319,77 @@ static int mgs_write_log_param(const struct lu_env *env,
                GOTO(end, rc);
        }
 
                GOTO(end, rc);
        }
 
-        if (class_match_param(ptr, PARAM_OSC""PARAM_ACTIVE, &tmp) == 0) {
-                /* active=0 means off, anything else means on */
-                int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
-                int i;
+       if (class_match_param(ptr, PARAM_OSC PARAM_ACTIVE, &tmp) == 0 ||
+           class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0) {
+               /* active=0 means off, anything else means on */
+               int flag = (*tmp == '0') ? CM_EXCLUDE : 0;
+               bool deactive_osc = memcmp(ptr, PARAM_OSC PARAM_ACTIVE,
+                                         strlen(PARAM_OSC PARAM_ACTIVE)) == 0;
+               int i;
+
+               if (!deactive_osc) {
+                       __u32   index;
+
+                       rc = server_name2index(mti->mti_svname, &index, NULL);
+                       if (rc < 0)
+                               GOTO(end, rc);
 
 
-                if (!(mti->mti_flags & LDD_F_SV_TYPE_OST)) {
-                        LCONSOLE_ERROR_MSG(0x144, "%s: Only OSCs can "
-                                           "be (de)activated.\n",
-                                           mti->mti_svname);
-                        GOTO(end, rc = -EINVAL);
-                }
-                LCONSOLE_WARN("Permanently %sactivating %s\n",
-                              flag ? "de": "re", mti->mti_svname);
-                /* Modify clilov */
+                       if (index == 0) {
+                               LCONSOLE_ERROR_MSG(0x144, "%s: MDC0 can not be"
+                                                  " (de)activated.\n",
+                                                  mti->mti_svname);
+                               GOTO(end, rc = -EINVAL);
+                       }
+               }
+
+               LCONSOLE_WARN("Permanently %sactivating %s\n",
+                             flag ? "de" : "re", mti->mti_svname);
+               /* Modify clilov */
                rc = name_create(&logname, mti->mti_fsname, "-client");
                rc = name_create(&logname, mti->mti_fsname, "-client");
-               if (rc)
+               if (rc < 0)
                        GOTO(end, rc);
                rc = mgs_modify(env, mgs, fsdb, mti, logname,
                        GOTO(end, rc);
                rc = mgs_modify(env, mgs, fsdb, mti, logname,
-                                mti->mti_svname, "add osc", flag);
-                name_destroy(&logname);
-                if (rc)
-                        goto active_err;
-                /* Modify mdtlov */
-                /* Add to all MDT logs for CMD */
-                for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+                               mti->mti_svname,
+                               deactive_osc ? "add osc" : "add mdc", flag);
+               name_destroy(&logname);
+               if (rc < 0)
+                       goto active_err;
+
+               /* Modify mdtlov */
+               /* Add to all MDT logs for DNE */
+               for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
                        if (!test_bit(i, fsdb->fsdb_mdt_index_map))
                        if (!test_bit(i, fsdb->fsdb_mdt_index_map))
-                                continue;
+                               continue;
                        rc = name_create_mdt(&logname, mti->mti_fsname, i);
                        rc = name_create_mdt(&logname, mti->mti_fsname, i);
-                       if (rc)
+                       if (rc < 0)
                                GOTO(end, rc);
                        rc = mgs_modify(env, mgs, fsdb, mti, logname,
                                GOTO(end, rc);
                        rc = mgs_modify(env, mgs, fsdb, mti, logname,
-                                       mti->mti_svname, "add osc", flag);
-                        name_destroy(&logname);
-                        if (rc)
-                                goto active_err;
-                }
-        active_err:
-                if (rc) {
-                        LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
-                                           "log (%d). No permanent "
-                                           "changes were made to the "
-                                           "config log.\n",
-                                           mti->mti_svname, rc);
+                                       mti->mti_svname,
+                                       deactive_osc ? "add osc" : "add osp",
+                                       flag);
+                       name_destroy(&logname);
+                       if (rc < 0)
+                               goto active_err;
+               }
+active_err:
+               if (rc < 0) {
+                       LCONSOLE_ERROR_MSG(0x145, "Couldn't find %s in"
+                                          "log (%d). No permanent "
+                                          "changes were made to the "
+                                          "config log.\n",
+                                          mti->mti_svname, rc);
                        if (test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags))
                        if (test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags))
-                                LCONSOLE_ERROR_MSG(0x146, "This may be"
-                                                   " because the log"
-                                                   "is in the old 1.4"
-                                                   "style. Consider "
-                                                   " --writeconf to "
-                                                   "update the logs.\n");
-                        GOTO(end, rc);
-                }
-                /* Fall through to osc proc for deactivating live OSC
-                   on running MDT / clients. */
-        }
+                               LCONSOLE_ERROR_MSG(0x146, "This may be"
+                                                  " because the log"
+                                                  "is in the old 1.4"
+                                                  "style. Consider "
+                                                  " --writeconf to "
+                                                  "update the logs.\n");
+                       GOTO(end, rc);
+               }
+               /* Fall through to osc/mdc proc for deactivating live
+                  OSC/OSP on running MDT / clients. */
+       }
         /* Below here, let obd's XXX_process_config methods handle it */
 
         /* All lov. in proc */
         /* Below here, let obd's XXX_process_config methods handle it */
 
         /* All lov. in proc */
@@ -3493,6 +3509,78 @@ static int mgs_write_log_param(const struct lu_env *env,
                                }
                        }
                }
                                }
                        }
                }
+
+               /* For mdc activate/deactivate, it affects OSP on MDT as well */
+               if (class_match_param(ptr, PARAM_MDC PARAM_ACTIVE, &tmp) == 0 &&
+                   rc == 0) {
+                       char suffix[16];
+                       char *lodname = NULL;
+                       char *param_str = NULL;
+                       int i;
+                       int index;
+
+                       /* replace mdc with osp */
+                       memcpy(ptr, PARAM_OSP, strlen(PARAM_OSP));
+                       rc = server_name2index(mti->mti_svname, &index, NULL);
+                       if (rc < 0) {
+                               memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC));
+                               GOTO(end, rc);
+                       }
+
+                       for (i = 0; i < INDEX_MAP_SIZE * 8; i++) {
+                               if (!test_bit(i, fsdb->fsdb_mdt_index_map))
+                                       continue;
+
+                               if (i == index)
+                                       continue;
+
+                               name_destroy(&logname);
+                               rc = name_create_mdt(&logname, mti->mti_fsname,
+                                                    i);
+                               if (rc < 0)
+                                       break;
+
+                               if (mgs_log_is_empty(env, mgs, logname))
+                                       continue;
+
+                               snprintf(suffix, sizeof(suffix), "-osp-MDT%04x",
+                                        i);
+                               name_destroy(&cname);
+                               rc = name_create(&cname, mti->mti_svname,
+                                                suffix);
+                               if (rc < 0)
+                                       break;
+
+                               rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname,
+                                                 &mgi->mgi_bufs, cname, ptr);
+                               if (rc < 0)
+                                       break;
+
+                               /* Add configuration log for noitfying LOD
+                                * to active/deactive the OSP. */
+                               name_destroy(&param_str);
+                               rc = name_create(&param_str, cname,
+                                                (*tmp == '0') ?  ".active=0" :
+                                                ".active=1");
+                               if (rc < 0)
+                                       break;
+
+                               name_destroy(&lodname);
+                               rc = name_create(&lodname, logname, "-mdtlov");
+                               if (rc < 0)
+                                       break;
+
+                               rc = mgs_wlp_lcfg(env, mgs, fsdb, mti, logname,
+                                                 &mgi->mgi_bufs, lodname,
+                                                 param_str);
+                               if (rc < 0)
+                                       break;
+                       }
+                       memcpy(ptr, PARAM_MDC, strlen(PARAM_MDC));
+                       name_destroy(&lodname);
+                       name_destroy(&param_str);
+               }
+
                name_destroy(&logname);
                name_destroy(&cname);
                GOTO(end, rc);
                name_destroy(&logname);
                name_destroy(&cname);
                GOTO(end, rc);
index dae446f..310ab15 100644 (file)
@@ -641,8 +641,9 @@ static int osp_process_config(const struct lu_env *env,
                break;
        case LCFG_PARAM:
                LASSERT(obd);
                break;
        case LCFG_PARAM:
                LASSERT(obd);
-               rc = class_process_proc_param(PARAM_OSC, obd->obd_vars,
-                                             lcfg, obd);
+               rc = class_process_proc_param(d->opd_connect_mdt ?
+                                             PARAM_OSP : PARAM_OSC,
+                                             obd->obd_vars, lcfg, obd);
                if (rc > 0)
                        rc = 0;
                if (rc == -ENOSYS) {
                if (rc > 0)
                        rc = 0;
                if (rc == -ENOSYS) {
index 29568ff..e9252f7 100644 (file)
@@ -3385,6 +3385,52 @@ test_50h() {
 }
 run_test 50h "LU-642: activate deactivated OST"
 
 }
 run_test 50h "LU-642: activate deactivated OST"
 
+test_50i() {
+       # prepare MDT/OST, make OSC inactive for OST1
+       [ "$MDSCOUNT" -lt "2" ] && skip_env "$MDSCOUNT < 2, skipping" && return
+
+       [ $(facet_fstype ost1) == zfs ] && import_zpool ost1
+       load_modules
+       do_facet mds2 "$TUNEFS --param mdc.active=0 $(mdsdevname 2)" ||
+               error "tunefs MDT2 failed"
+       start_mds  || error "Unable to start MDT"
+       start_ost  || error "Unable to start OST1"
+       start_ost2 || error "Unable to start OST2"
+       mount_client $MOUNT || error "client start failed"
+
+       mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+
+       $LCTL conf_param ${FSNAME}-MDT0000.mdc.active=0 &&
+               error "deactive MDC0 succeeds"
+       # activate MDC for MDT2
+       local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-MDT0001.mdc.active" 1 ||
+               error "Unable to activate MDT2"
+
+       $LFS mkdir -i1 $DIR/$tdir/2 || error "mkdir $DIR/$tdir/2 failed"
+       # create some file
+       createmany -o $DIR/$tdir/2/$tfile-%d 1 || error "create files failed"
+
+       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"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-MDT0001.mdc.active" 0 ||
+               error "Unable to deactivate MDT2"
+
+       $LFS mkdir -i1 $DIR/$tdir/2 &&
+               error "mkdir $DIR/$tdir/2 succeeds after deactive MDT"
+
+       # cleanup
+       umount_client $MOUNT || error "Unable to umount client"
+       stop_mds
+       stop_ost
+       stop_ost 2
+}
+run_test 50i "activate deactivated MDT"
+
 test_51() {
        local LOCAL_TIMEOUT=20
 
 test_51() {
        local LOCAL_TIMEOUT=20