From d9248bdc874f71141b2f48cacc351bfc8622773b Mon Sep 17 00:00:00 2001 From: alex <alex> Date: Sat, 14 May 2005 11:46:09 +0000 Subject: [PATCH] b=6326 - testing infrastructure to control order in which clients recover --- lustre/include/linux/lustre_ha.h | 1 + lustre/include/linux/obd.h | 1 + lustre/mdc/mdc_request.c | 3 +++ lustre/osc/osc_request.c | 4 ++++ lustre/ptlrpc/ptlrpc_module.c | 1 + lustre/ptlrpc/recover.c | 18 ++++++++++++++++++ lustre/utils/lctl.c | 2 ++ lustre/utils/obd.c | 31 +++++++++++++++++++++++++++++++ lustre/utils/obdctl.h | 2 ++ 9 files changed, 63 insertions(+) diff --git a/lustre/include/linux/lustre_ha.h b/lustre/include/linux/lustre_ha.h index ecc6543cbc..7016274ce3 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 0b581eb2c6..30323721ff 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 3da3334d85..260c0c7df8 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 6ffede7a3d..2eb95bc82f 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 2e5ba9d692..786bdceaaf 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 a09c8a2f1a..6faea9bc62 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 879237cf65..e2e9e73759 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 [<connection UUID>]"}, diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 03864ca61c..c56ae41c9e 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 79440811fa..02fbe8aea6 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); -- GitLab