From: Vladislav Bogdanov <bubble@hoster-ok.com>
To: linux-lvm@redhat.com
Subject: [linux-lvm] [PATCH 08/10] lvchange: implement remote lock management
Date: Tue, 19 Mar 2013 13:32:48 +0000 [thread overview]
Message-ID: <1363699970-10002-9-git-send-email-bubble@hoster-ok.com> (raw)
In-Reply-To: <1363699970-10002-1-git-send-email-bubble@hoster-ok.com>
Signed-off-by: Vladislav Bogdanov <bubble@hoster-ok.com>
---
lib/commands/toolcontext.h | 1 +
tools/args.h | 1 +
tools/commands.h | 3 +-
tools/lvchange.c | 98 ++++++++++++++++++++++++++++++++++++--------
tools/pvmove.c | 2 +-
tools/vgchange.c | 2 +-
6 files changed, 87 insertions(+), 20 deletions(-)
diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h
index 6e5803f..136ef53 100644
--- a/lib/commands/toolcontext.h
+++ b/lib/commands/toolcontext.h
@@ -112,6 +112,7 @@ struct cmd_context {
char dev_dir[PATH_MAX];
char proc_dir[PATH_MAX];
char sysfs_dir[PATH_MAX]; /* FIXME Use global value instead. */
+ const char *node;
};
/*
diff --git a/tools/args.h b/tools/args.h
index 0d9605a..7c75cff 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -76,6 +76,7 @@ arg(discards_ARG, '\0', "discards", discards_arg, 0)
arg(stripes_long_ARG, '\0', "stripes", int_arg, 0)
arg(sysinit_ARG, '\0', "sysinit", NULL, 0)
arg(thinpool_ARG, '\0', "thinpool", string_arg, 0)
+arg(node_ARG, '\0', "node", string_arg, 0)
/* Allow some variations */
arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
diff --git a/tools/commands.h b/tools/commands.h
index 6415d34..555ff87 100644
--- a/tools/commands.h
+++ b/tools/commands.h
@@ -87,6 +87,7 @@ xx(lvchange,
"\t[-y|--yes]\n"
"\t[--version]\n"
"\t[-Z|--zero {y|n}]\n"
+ "\t[--node Node ]\n"
"\tLogicalVolume[Path] [LogicalVolume[Path]...]\n",
alloc_ARG, autobackup_ARG, activate_ARG, available_ARG, contiguous_ARG,
@@ -94,7 +95,7 @@ xx(lvchange,
major_ARG, minor_ARG, monitor_ARG, noudevsync_ARG, partial_ARG,
permission_ARG, persistent_ARG, poll_ARG, readahead_ARG, resync_ARG,
refresh_ARG, addtag_ARG, deltag_ARG, sysinit_ARG, test_ARG, yes_ARG,
- zero_ARG)
+ zero_ARG, node_ARG)
xx(lvconvert,
"Change logical volume layout",
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 5740bea..e136eab 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -226,11 +226,30 @@ static int _lvchange_activate(struct cmd_context *cmd, struct logical_volume *lv
}
if (activate == CHANGE_ALN) {
- log_verbose("Deactivating logical volume \"%s\" locally",
- lv->name);
- if (!deactivate_lv_local(cmd, lv))
- return_0;
+ if (cmd->node) {
+ log_verbose("Deactivating logical volume \"%s\" locally on node %s",
+ lv->name, cmd->node);
+ if (!deactivate_lv_remote(cmd, lv))
+ return_0;
+ } else {
+ log_verbose("Deactivating logical volume \"%s\" locally",
+ lv->name);
+ if (!deactivate_lv_local(cmd, lv))
+ return_0;
+ }
} else if (activate == CHANGE_AN) {
+ if (cmd->node) {
+ log_error("Use -aln to deactivate volume on a remote node");
+ return_0;
+ }
+ if (vg_is_clustered(lv->vg)) {
+ if (!arg_count(cmd, force_ARG)) {
+ if (lv_is_active_exclusive(lv) && ! lv_is_active_exclusive_locally(lv)) {
+ log_error("Failed to deactivate %s: exclusively activated on a remote node. Use -aln --node Node.", lv->name);
+ return_0;
+ }
+ }
+ }
log_verbose("Deactivating logical volume \"%s\"", lv->name);
if (!deactivate_lv(cmd, lv))
return_0;
@@ -239,29 +258,55 @@ static int _lvchange_activate(struct cmd_context *cmd, struct logical_volume *lv
lv_is_origin(lv) ||
lv_is_thin_type(lv)) {
if (arg_count(cmd, force_ARG)) {
- log_verbose("Activating logical volume \"%s\" "
- "exclusively (forced)", lv->name);
+ if (cmd->node)
+ log_verbose("Activating logical volume \"%s\" "
+ "exclusively on node %s (forced)", lv->name, cmd->node);
+ else
+ log_verbose("Activating logical volume \"%s\" "
+ "exclusively (forced)", lv->name);
if (!activate_lv_excl_force(cmd, lv))
return_0;
} else {
- log_verbose("Activating logical volume \"%s\" "
- "exclusively", lv->name);
+ if (cmd->node)
+ log_verbose("Activating logical volume \"%s\" "
+ "exclusively on node %s", lv->name, cmd->node);
+ else
+ log_verbose("Activating logical volume \"%s\" "
+ "exclusively", lv->name);
if (!activate_lv_excl(cmd, lv))
return_0;
}
} else if (activate == CHANGE_ALY) {
- if (arg_count(cmd, force_ARG)) {
- log_verbose("Activating logical volume \"%s\" locally (forced)",
- lv->name);
- if (!activate_lv_local_force(cmd, lv))
- return_0;
+ if (cmd->node) {
+ if (arg_count(cmd, force_ARG)) {
+ log_verbose("Activating logical volume \"%s\" locally on node %s (forced)",
+ lv->name, cmd->node);
+ if (!activate_lv_remote_force(cmd, lv))
+ return_0;
+ } else {
+ log_verbose("Activating logical volume \"%s\" locally on node %s",
+ lv->name, cmd->node);
+ if (!activate_lv_remote(cmd, lv))
+ return_0;
+ }
} else {
- log_verbose("Activating logical volume \"%s\" locally",
- lv->name);
- if (!activate_lv_local(cmd, lv))
- return_0;
+ if (arg_count(cmd, force_ARG)) {
+ log_verbose("Activating logical volume \"%s\" locally (forced)",
+ lv->name);
+ if (!activate_lv_local_force(cmd, lv))
+ return_0;
+ } else {
+ log_verbose("Activating logical volume \"%s\" locally",
+ lv->name);
+ if (!activate_lv_local(cmd, lv))
+ return_0;
+ }
}
} else {
+ if (cmd->node) {
+ log_error("Use -aly or -aey to activate volume on a remote node");
+ return_0;
+ }
log_verbose("Activating logical volume \"%s\"",
lv->name);
if (!activate_lv(cmd, lv))
@@ -808,6 +853,25 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
return ECMD_FAILED;
}
+ switch (arg_count(cmd, node_ARG)) {
+ case 1:
+ if (!arg_count(cmd, activate_ARG)) {
+ log_error("--node argument may be used only with -a");
+ return ECMD_FAILED;
+ }
+ if (!vg_is_clustered(lv->vg)) {
+ log_error("--node argument may be used only with clustered volume groups");
+ return ECMD_FAILED;
+ }
+ cmd->node = arg_str_value(cmd, node_ARG, NULL);
+ break;
+ case 0:
+ break;
+ default:
+ log_error("Only one --node argument is supported");
+ return ECMD_FAILED;
+ break;
+ }
/*
* FIXME: DEFAULT_BACKGROUND_POLLING should be "unspecified".
* If --poll is explicitly provided use it; otherwise polling
diff --git a/tools/pvmove.c b/tools/pvmove.c
index 9649f11..65718b1 100644
--- a/tools/pvmove.c
+++ b/tools/pvmove.c
@@ -240,7 +240,7 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
}
if (vg_is_clustered(vg) &&
- lv_is_active_exclusive_remotely(lv)) {
+ lv_is_active_exclusive_remotely(lv, NULL)) {
lv_skipped = 1;
log_print_unless_silent("Skipping LV %s which is activated "
"exclusively on remote node.", lv->name);
diff --git a/tools/vgchange.c b/tools/vgchange.c
index a897a85..2d2b37f 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -125,7 +125,7 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd, struct volume_group *vg,
* If the LV is active exclusive remotely,
* then ignore it here
*/
- if (lv_is_active_exclusive_remotely(lv)) {
+ if (lv_is_active_exclusive_remotely(lv, NULL)) {
log_verbose("%s/%s is exclusively active on"
" a remote node", vg->name, lv->name);
continue;
--
1.7.1
next prev parent reply other threads:[~2013-03-19 13:32 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-19 13:32 [linux-lvm] [PATCH 00/10] Enhancements to a clustered logical volume activation Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 01/10] lvchange: Allow cluster lock conversion Vladislav Bogdanov
2013-03-19 15:23 ` David Teigland
2013-03-19 15:33 ` Vladislav Bogdanov
2013-03-19 15:44 ` Vladislav Bogdanov
2013-03-19 16:03 ` David Teigland
2013-03-19 16:36 ` Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 02/10] clvmd: Fix buffer size Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 03/10] clvmd: Allow node names to be obtained from corosync's CMAP Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 04/10] clvmd: fix positive return value is not an error in csid->name translation Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 05/10] clvmd: use correct flags for local command execution Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 06/10] clvmd: additional debugging - print message bodies Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 07/10] locking: Allow lock management (activation, deactivation, conversion) on a remote nodes Vladislav Bogdanov
2013-03-19 13:32 ` Vladislav Bogdanov [this message]
2013-03-19 13:32 ` [linux-lvm] [PATCH 09/10] man: document --force option to lvchange, provide examples Vladislav Bogdanov
2013-03-19 13:32 ` [linux-lvm] [PATCH 10/10] man: document --node option to lvchange Vladislav Bogdanov
2013-03-19 15:32 ` David Teigland
2013-03-19 15:42 ` Vladislav Bogdanov
2013-03-19 15:54 ` David Teigland
2013-03-19 16:52 ` Vladislav Bogdanov
2013-03-19 17:16 ` David Teigland
2013-03-19 17:36 ` Vladislav Bogdanov
2013-03-20 8:45 ` Zdenek Kabelac
2013-03-20 12:12 ` Vladislav Bogdanov
2013-03-21 18:31 ` Vladislav Bogdanov
2013-03-21 19:01 ` Zdenek Kabelac
2013-03-21 19:16 ` Vladislav Bogdanov
2013-03-21 18:23 ` Vladislav Bogdanov
2013-03-19 16:42 ` [linux-lvm] [PATCH 00/10] Enhancements to a clustered logical volume activation Alasdair G Kergon
2013-03-19 17:42 ` Vladislav Bogdanov
2013-06-05 13:23 ` [linux-lvm] clvmd leaving kernel dlm uncontrolled lockspace Andreas Pflug
2013-06-05 15:13 ` David Teigland
2013-06-05 17:29 ` Andreas Pflug
2013-06-06 6:17 ` Andreas Pflug
2013-06-06 11:06 ` matthew patton
2013-06-06 17:54 ` Andreas Pflug
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1363699970-10002-9-git-send-email-bubble@hoster-ok.com \
--to=bubble@hoster-ok.com \
--cc=linux-lvm@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).