From: alex Date: Sat, 14 May 2005 11:46:09 +0000 (+0000) Subject: b=6326 X-Git-Tag: v1_7_100~1336 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=d9248bdc874f71141b2f48cacc351bfc8622773b b=6326 - testing infrastructure to control order in which clients recover --- diff --git a/lustre/include/linux/lustre_ha.h b/lustre/include/linux/lustre_ha.h index ecc6543..7016274 100644 --- a/lustre/include/linux/lustre_ha.h +++ b/lustre/include/linux/lustre_ha.h @@ -27,5 +27,6 @@ void ptlrpc_fail_export(struct obd_export *exp); int ptlrpc_check_suspend(void); void ptlrpc_activate_timeouts(void); void ptlrpc_deactivate_timeouts(void); +int ptlrpc_import_control_recovery(struct obd_import *imp, int disable); #endif diff --git a/lustre/include/linux/obd.h b/lustre/include/linux/obd.h index 0b581eb..3032372 100644 --- a/lustre/include/linux/obd.h +++ b/lustre/include/linux/obd.h @@ -13,6 +13,7 @@ #define IOC_OSC_TYPE 'h' #define IOC_OSC_MIN_NR 20 #define IOC_OSC_SET_ACTIVE _IOWR(IOC_OSC_TYPE, 21, struct obd_device *) +#define IOC_OSC_CTL_RECOVERY _IOWR(IOC_OSC_TYPE, 22, struct obd_device *) #define IOC_OSC_MAX_NR 50 #define IOC_MDC_TYPE 'i' diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 3da3334..260c0c7 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -775,6 +775,9 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case IOC_OSC_SET_ACTIVE: rc = ptlrpc_set_import_active(imp, data->ioc_offset); GOTO(out, rc); + case IOC_OSC_CTL_RECOVERY: + rc = ptlrpc_import_control_recovery(imp, data->ioc_offset); + GOTO(out, rc); case OBD_IOC_PARSE: { ctxt = llog_get_context(&exp->exp_obd->obd_llogs, LLOG_CONFIG_REPL_CTXT); diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index 6ffede7..2eb95bc 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -2779,6 +2779,10 @@ static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len, err = ptlrpc_set_import_active(obd->u.cli.cl_import, data->ioc_offset); GOTO(out, err); + case IOC_OSC_CTL_RECOVERY: + err = ptlrpc_import_control_recovery(obd->u.cli.cl_import, + data->ioc_offset); + GOTO(out, err); default: CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n", cmd, current->comm); GOTO(out, err = -ENOTTY); diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c index 2e5ba9d..786bdce 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -132,6 +132,7 @@ EXPORT_SYMBOL(ptlrpc_invalidate_import); EXPORT_SYMBOL(ptlrpc_activate_import); EXPORT_SYMBOL(ptlrpc_fail_import); EXPORT_SYMBOL(ptlrpc_disconnect_import); +EXPORT_SYMBOL(ptlrpc_import_control_recovery); /* service.c */ EXPORT_SYMBOL(ptlrpc_require_repack); diff --git a/lustre/ptlrpc/recover.c b/lustre/ptlrpc/recover.c index a09c8a2..6faea9b 100644 --- a/lustre/ptlrpc/recover.c +++ b/lustre/ptlrpc/recover.c @@ -354,6 +354,24 @@ int ptlrpc_import_in_recovery(struct obd_import *imp) return in_recovery; } +int ptlrpc_import_control_recovery(struct obd_import *imp, int disable) +{ + unsigned long flags; + + /* with imp_deactivate == 1 pinger won't initiate re-connect */ + spin_lock_irqsave(&imp->imp_lock, flags); + if (disable) + imp->imp_deactive = 1; + else + imp->imp_deactive = 0; + if (imp->imp_state == LUSTRE_IMP_DISCON) { + imp->imp_force_verify = 1; + ptlrpc_pinger_wake_up(); + } + spin_unlock_irqrestore(&imp->imp_lock, flags); + RETURN(0); +} + static int ptlrpc_recover_import_no_retry(struct obd_import *imp, char *new_uuid) { diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c index 879237c..e2e9e73 100644 --- a/lustre/utils/lctl.c +++ b/lustre/utils/lctl.c @@ -223,6 +223,8 @@ command_t cmdlist[] = { "stop lock manager stress test (no args)\n"}, {"dump_ldlm", jt_obd_dump_ldlm, 0, "dump all lock manager state (no args)"}, + {"disable_recovery", jt_obd_disable_recovery, 0, "disable recovery on an import\n"}, + {"enable_recovery", jt_obd_enable_recovery, 0, "enable recovery on an import\n"}, {"activate", jt_obd_activate, 0, "activate an import\n"}, {"deactivate", jt_obd_deactivate, 0, "deactivate an import\n"}, {"recover", jt_obd_recover, 0, "usage: recover []"}, diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 03864ca..c56ae41 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -1938,6 +1938,37 @@ int jt_obd_activate(int argc, char **argv) return do_activate(argc, argv, 1); } +static int do_control_recovery(int argc, char **argv, int flag) +{ + struct obd_ioctl_data data; + int rc; + + IOC_INIT(data); + if (argc != 1) + return CMD_HELP; + + /* reuse offset for 'active' */ + data.ioc_offset = flag; + + IOC_PACK(argv[0], data); + rc = l2_ioctl(OBD_DEV_ID, IOC_OSC_CTL_RECOVERY, buf); + if (rc) + fprintf(stderr, "error: %s: failed: %s\n", + jt_cmdname(argv[0]), strerror(rc = errno)); + + return rc; +} + +int jt_obd_disable_recovery(int argc, char **argv) +{ + return do_control_recovery(argc, argv, 1); +} + +int jt_obd_enable_recovery(int argc, char **argv) +{ + return do_control_recovery(argc, argv, 0); +} + int jt_obd_recover(int argc, char **argv) { int rc; diff --git a/lustre/utils/obdctl.h b/lustre/utils/obdctl.h index 7944081..02fbe8a 100644 --- a/lustre/utils/obdctl.h +++ b/lustre/utils/obdctl.h @@ -70,6 +70,8 @@ int jt_obd_test_ldlm(int argc, char **argv); int jt_obd_ldlm_regress_start(int argc, char **argv); int jt_obd_ldlm_regress_stop(int argc, char **argv); int jt_obd_dump_ldlm(int argc, char **argv); +int jt_obd_disable_recovery(int argc, char **argv); +int jt_obd_enable_recovery(int argc, char **argv); int jt_obd_activate(int argc, char **argv); int jt_obd_deactivate(int argc, char **argv); int jt_obd_recover(int argc, char **argv);