[linux-lvm] Re: [LVM2 PATCH] mirror force resync option
Jonathan E Brassow
jbrassow at redhat.com
Wed Sep 13 14:44:39 UTC 2006
Looks pretty clean to me... much like the --nosync option. However, it
doesn't look like you considered cluster mirroring. I don't see
anything in lvm-functions.c and no corresponding LCK_ (locking.h) flag
to help inform other cluster members of the force resync option.
brassow
On Sep 12, 2006, at 3:14 PM, Jun'ichi "Nick" Nomura wrote:
> Hi,
>
> Attached is a patch implementing "--forcesync" option of lvchange
> to start resync regardless of current log status.
> If the LV is created with "--nosync" option, the volume type flag
> of lvs changes from "M" to "m".
>
> This is useful to ensure mirrors are resynced after failure in corner
> case.
>
> Comments are welcome.
>
> Thanks,
> --
> Jun'ichi "Nick" Nomura / On-site engineer from NEC
> Add --forcesync option to lvchange to force resync mirror LV.
> It also turns 'M' (without initial sync) flag into 'm' (normal mirror)
> if the LV is created with --nosync.
>
> Applicable to LVM2 2.02.09.
>
> diff -X dontdiff -urp LVM2/include/log.h
> LVM2.forcesync-global/include/log.h
> --- LVM2/include/log.h 2006-08-17 23:42:36.000000000 -0400
> +++ LVM2.forcesync-global/include/log.h 2006-09-11 22:17:01.000000000
> -0400
> @@ -75,6 +75,7 @@ void init_ignorelockingfailure(int level
> void init_lockingfailed(int level);
> void init_security_level(int level);
> void init_mirror_in_sync(int in_sync);
> +void init_mirror_force_sync(int force_sync);
> void init_dmeventd_register(int reg);
>
> void set_cmd_name(const char *cmd_name);
> @@ -90,6 +91,7 @@ int ignorelockingfailure(void);
> int lockingfailed(void);
> int security_level(void);
> int mirror_in_sync(void);
> +int mirror_force_sync(void);
> int dmeventd_register_mode(void);
>
> /* Suppress messages to stdout/stderr (1) or everywhere (2) */
> diff -X dontdiff -urp LVM2/lib/log/log.c
> LVM2.forcesync-global/lib/log/log.c
> --- LVM2/lib/log/log.c 2006-08-23 04:18:58.000000000 -0400
> +++ LVM2.forcesync-global/lib/log/log.c 2006-09-11 21:22:23.000000000
> -0400
> @@ -48,6 +48,7 @@ static char _cmd_name[30] = "";
> static char _msg_prefix[30] = " ";
> static int _already_logging = 0;
> static int _mirror_in_sync = 0;
> +static int _mirror_force_sync = 0;
> static int _dmeventd_register = DEFAULT_DMEVENTD_MONITOR;
>
> static lvm2_log_fn_t _lvm2_log_fn = NULL;
> @@ -189,6 +190,11 @@ void init_mirror_in_sync(int in_sync)
> _mirror_in_sync = in_sync;
> }
>
> +void init_mirror_force_sync(int force_sync)
> +{
> + _mirror_force_sync = force_sync;
> +}
> +
> void init_dmeventd_register(int reg)
> {
> _dmeventd_register = reg;
> @@ -268,6 +274,11 @@ int mirror_in_sync(void)
> return _mirror_in_sync;
> }
>
> +int mirror_force_sync(void)
> +{
> + return _mirror_force_sync;
> +}
> +
> int dmeventd_register_mode(void)
> {
> return _dmeventd_register;
> diff -X dontdiff -urp LVM2/lib/log/log.h
> LVM2.forcesync-global/lib/log/log.h
> --- LVM2/lib/log/log.h 2006-08-17 23:42:36.000000000 -0400
> +++ LVM2.forcesync-global/lib/log/log.h 2006-09-11 22:17:01.000000000
> -0400
> @@ -75,6 +75,7 @@ void init_ignorelockingfailure(int level
> void init_lockingfailed(int level);
> void init_security_level(int level);
> void init_mirror_in_sync(int in_sync);
> +void init_mirror_force_sync(int force_sync);
> void init_dmeventd_register(int reg);
>
> void set_cmd_name(const char *cmd_name);
> @@ -90,6 +91,7 @@ int ignorelockingfailure(void);
> int lockingfailed(void);
> int security_level(void);
> int mirror_in_sync(void);
> +int mirror_force_sync(void);
> int dmeventd_register_mode(void);
>
> /* Suppress messages to stdout/stderr (1) or everywhere (2) */
> diff -X dontdiff -urp LVM2/lib/mirror/mirrored.c
> LVM2.forcesync-global/lib/mirror/mirrored.c
> --- LVM2/lib/mirror/mirrored.c 2006-07-29 00:46:10.000000000 -0400
> +++ LVM2.forcesync-global/lib/mirror/mirrored.c 2006-09-11
> 21:28:16.000000000 -0400
> @@ -255,7 +255,9 @@ static int _add_log(struct dev_manager *
> log_flags |= DM_CORELOG;
> }
>
> - if (mirror_in_sync() && !(seg->status & PVMOVE))
> + if (mirror_force_sync())
> + log_flags |= DM_FORCESYNC;
> + else if (mirror_in_sync() && !(seg->status & PVMOVE))
> log_flags |= DM_NOSYNC;
>
> if (_block_on_error_available && !(seg->status & PVMOVE))
> diff -X dontdiff -urp LVM2/tools/args.h
> LVM2.forcesync-global/tools/args.h
> --- LVM2/tools/args.h 2006-08-17 23:42:36.000000000 -0400
> +++ LVM2.forcesync-global/tools/args.h 2006-09-11 21:23:28.000000000
> -0400
> @@ -46,6 +46,7 @@ arg(alloc_ARG, '\0', "alloc", alloc_arg)
> arg(separator_ARG, '\0', "separator", string_arg)
> arg(mirrorsonly_ARG, '\0', "mirrorsonly", NULL)
> arg(nosync_ARG, '\0', "nosync", NULL)
> +arg(forcesync_ARG, '\0', "forcesync", NULL)
> arg(corelog_ARG, '\0', "corelog", NULL)
> arg(monitor_ARG, '\0', "monitor", yes_no_arg)
> arg(config_ARG, '\0', "config", string_arg)
> diff -X dontdiff -urp LVM2/tools/commands.h
> LVM2.forcesync-global/tools/commands.h
> --- LVM2/tools/commands.h 2006-08-17 23:42:36.000000000 -0400
> +++ LVM2.forcesync-global/tools/commands.h 2006-09-11
> 21:23:04.000000000 -0400
> @@ -61,6 +61,7 @@ xx(lvchange,
> "\t[-d|--debug]\n"
> "\t[--deltag Tag]\n"
> "\t[-f|--force]\n"
> + "\t[--forcesync]\n"
> "\t[-h|--help]\n"
> "\t[--ignorelockingfailure]\n"
> "\t[--monitor {y|n}]\n"
> @@ -75,7 +76,7 @@ xx(lvchange,
> "\tLogicalVolume[Path] [LogicalVolume[Path]...]\n",
>
> alloc_ARG, autobackup_ARG, available_ARG, contiguous_ARG,
> force_ARG,
> - ignorelockingfailure_ARG, major_ARG, minor_ARG, monitor_ARG,
> + forcesync_ARG, ignorelockingfailure_ARG, major_ARG, minor_ARG,
> monitor_ARG,
> partial_ARG, permission_ARG, persistent_ARG, readahead_ARG,
> refresh_ARG, addtag_ARG, deltag_ARG, test_ARG)
>
> diff -X dontdiff -urp LVM2/tools/lvchange.c
> LVM2.forcesync-global/tools/lvchange.c
> --- LVM2/tools/lvchange.c 2006-07-29 02:20:07.000000000 -0400
> +++ LVM2.forcesync-global/tools/lvchange.c 2006-09-13
> 01:19:02.000000000 -0400
> @@ -175,6 +175,63 @@ static int lvchange_refresh(struct cmd_c
> return 1;
> }
>
> +static int lvchange_syncstatus(struct cmd_context *cmd,
> + struct logical_volume *lv)
> +{
> + struct lvinfo info;
> +
> + if (!(lv->status & MIRRORED))
> + return 1;
> +
> + if (!lv_info(cmd, lv, &info, 0) || !info.exists) {
> + log_error("Logical volume, %s, is not active", lv->name);
> + return 0;
> + }
> +
> + init_mirror_force_sync(1);
> +
> + if (!(lv->status & MIRROR_NOTSYNCED))
> + return lvchange_refresh(cmd, lv);
> +
> + /*
> + * We need to drop MIRROR_NOTSYNCED flag in metadata.
> + * We can do it only after the logical volume once has been
> + * activated with force sync to ensure disk log is updated by kernel.
> + */
> + if (!lvchange_refresh(cmd, lv)) {
> + log_error("Failed to unmark %s not-synced", lv->name);
> + return 0;
> + }
> +
> + lv->status &= ~MIRROR_NOTSYNCED;
> +
> + log_very_verbose("Updating logical volume \"%s\" on disk(s)",
> lv->name);
> + if (!vg_write(lv->vg)) {
> + stack;
> + return 0;
> + }
> +
> + backup(lv->vg);
> +
> + if (!suspend_lv(cmd, lv)) {
> + log_error("Failed to lock %s", lv->name);
> + vg_revert(lv->vg);
> + return 0;
> + }
> +
> + if (!vg_commit(lv->vg)) {
> + resume_lv(cmd, lv);
> + return 0;
> + }
> +
> + if (!resume_lv(cmd, lv)) {
> + log_error("Problem reactivating %s", lv->name);
> + return 0;
> + }
> +
> + return 1;
> +}
> +
> static int lvchange_alloc(struct cmd_context *cmd, struct
> logical_volume *lv)
> {
> int want_contiguous = 0;
> @@ -502,6 +559,10 @@ static int lvchange_single(struct cmd_co
> return ECMD_FAILED;
> }
>
> + if (arg_count(cmd, forcesync_ARG))
> + if (!lvchange_syncstatus(cmd, lv))
> + return ECMD_FAILED;
> +
> if (arg_count(cmd, refresh_ARG))
> if (!lvchange_refresh(cmd, lv))
> return ECMD_FAILED;
> @@ -523,9 +584,10 @@ int lvchange(struct cmd_context *cmd, in
> && !arg_count(cmd, minor_ARG) && !arg_count(cmd, major_ARG)
> && !arg_count(cmd, persistent_ARG) && !arg_count(cmd, addtag_ARG)
> && !arg_count(cmd, deltag_ARG) && !arg_count(cmd, refresh_ARG)
> - && !arg_count(cmd, alloc_ARG) && !arg_count(cmd, monitor_ARG)) {
> + && !arg_count(cmd, alloc_ARG) && !arg_count(cmd, monitor_ARG)
> + && !arg_count(cmd, forcesync_ARG)) {
> log_error("Need 1 or more of -a, -C, -j, -m, -M, -p, -r, "
> - "--refresh, --alloc, --addtag, --deltag "
> + "--forcesync, --refresh, --alloc, --addtag, --deltag "
> "or --monitor");
> return EINVALID_CMD_LINE;
> }
More information about the linux-lvm
mailing list