Whamcloud - gitweb
b=6326
authoralex <alex>
Sat, 14 May 2005 11:46:09 +0000 (11:46 +0000)
committeralex <alex>
Sat, 14 May 2005 11:46:09 +0000 (11:46 +0000)
 - testing infrastructure to control order in which clients recover

lustre/include/linux/lustre_ha.h
lustre/include/linux/obd.h
lustre/mdc/mdc_request.c
lustre/osc/osc_request.c
lustre/ptlrpc/ptlrpc_module.c
lustre/ptlrpc/recover.c
lustre/utils/lctl.c
lustre/utils/obd.c
lustre/utils/obdctl.h

index ecc6543..7016274 100644 (file)
@@ -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_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
 
 #endif
index 0b581eb..3032372 100644 (file)
@@ -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_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'
 #define IOC_OSC_MAX_NR       50
 
 #define IOC_MDC_TYPE         'i'
index 3da3334..260c0c7 100644 (file)
@@ -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_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);
         case OBD_IOC_PARSE: {
                 ctxt = llog_get_context(&exp->exp_obd->obd_llogs,
                                         LLOG_CONFIG_REPL_CTXT);
index 6ffede7..2eb95bc 100644 (file)
@@ -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);
                 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);
         default:
                 CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n", cmd, current->comm);
                 GOTO(out, err = -ENOTTY);
index 2e5ba9d..786bdce 100644 (file)
@@ -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_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);
 
 /* service.c */
 EXPORT_SYMBOL(ptlrpc_require_repack);
index a09c8a2..6faea9b 100644 (file)
@@ -354,6 +354,24 @@ int ptlrpc_import_in_recovery(struct obd_import *imp)
         return in_recovery;
 }
 
         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)
 {
 static int ptlrpc_recover_import_no_retry(struct obd_import *imp,
                                           char *new_uuid)
 {
index 879237c..e2e9e73 100644 (file)
@@ -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)"},
          "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>]"},
         {"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>]"},
index 03864ca..c56ae41 100644 (file)
@@ -1938,6 +1938,37 @@ int jt_obd_activate(int argc, char **argv)
         return do_activate(argc, argv, 1);
 }
 
         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;
 int jt_obd_recover(int argc, char **argv)
 {
         int rc;
index 7944081..02fbe8a 100644 (file)
@@ -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_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);
 int jt_obd_activate(int argc, char **argv);
 int jt_obd_deactivate(int argc, char **argv);
 int jt_obd_recover(int argc, char **argv);