Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=444a46c80e3ee…
Commit: 444a46c80e3ee12544eb8960fdea9f7cefc78d1e
Parent: a1e906313b85a6d0451feda7a6222cfd4386caf5
Author: Christine Caulfield <ccaulfie(a)redhat.com>
AuthorDate: Fri Jan 11 13:45:50 2013 +0000
Committer: Fabio M. Di Nitto <fdinitto(a)redhat.com>
CommitterDate: Wed Mar 20 17:25:16 2013 +0100
cman|fenced: Fix node killing in case of a 2node cluster that suffers brief network outage
This patch fixes a rare but nasty condition in cman and fenced. In a 2node cluster
if the network splits for a period of time longer than the token timeout but
shorter than the time needed to fence a node then both nodes can send 'kill'
packets to the other with the effect that both nodes' cmans will quit
leaving no operational cluster.
This patch adds a check for a 2node cluster and only sends a 'kill' packet
to the node with the higher nodeid thus ensuring a predictable response
to such events and ensuring that services can continue to run.
rhbz#923861
Signed-off-by: Christine Caulfield <ccaulfie(a)redhat.com>
Acked-By: Fabio M. Di Nitto <fdinitto(a)redhat.com>
---
cman/daemon/commands.c | 27 ++++++++++++++++++++++++---
1 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/cman/daemon/commands.c b/cman/daemon/commands.c
index 1fafdac..6f3ec4e 100644
--- a/cman/daemon/commands.c
+++ b/cman/daemon/commands.c
@@ -1829,10 +1829,31 @@ static void do_process_transition(int nodeid, char *data, int len)
/* Don't duplicate messages */
if (node->state != NODESTATE_AISONLY) {
if (cluster_is_quorate) {
- P_MEMB("Killing node %s because it has rejoined the cluster with existing state", node->name);
- log_printf(LOG_CRIT, "Killing node %s because it has rejoined the cluster with existing state", node->name);
node->state = NODESTATE_AISONLY;
- send_kill(nodeid, CLUSTER_KILL_REJOIN);
+ /* Oh, this gets even more complicated. Don't send a KILL message if we are in a two_node
+ * cluster and that node has a lower node ID than us.
+ * This allows fencing time to startup and caters for the situation where
+ * a node rejoins REALLY quickly, before fencing has had time to work.
+ * I've split this up a bit partly for clarity, but mainly so allow us to
+ * print out helpful messages as to what we are up to here.
+ */
+ if (two_node) {
+ if (node->node_id > us->node_id) {
+ log_printf(LOG_CRIT, "Killing node %s because it has rejoined the cluster with existing state and has higher node ID", node->name);
+ P_MEMB("Killing node %s because it has rejoined the cluster with existing state and has higher node ID", node->name);
+ send_kill(nodeid, CLUSTER_KILL_REJOIN);
+ }
+ else {
+ log_printf(LOG_CRIT, "Not killing node %s despite it rejoining the cluster with existing state, it has a lower node ID", node->name);
+ P_MEMB("Not killing node %s despite it rejoining the cluster with existing state, it has a lower node ID", node->name);
+ }
+ }
+ else {
+ log_printf(LOG_CRIT, "Killing node %s because it has rejoined the cluster with existing state", node->name);
+ P_MEMB("Killing node %s because it has rejoined the cluster with existing state", node->name);
+ send_kill(nodeid, CLUSTER_KILL_REJOIN);
+ }
+
}
else {
P_MEMB("Node %s not joined to cman because it has existing state", node->name);
Gitweb: http://git.fedorahosted.org/git/?p=dlm.git;a=commitdiff;h=a83408ad8ee91a3f5…
Commit: a83408ad8ee91a3f5d0416dcc3b7e8c50c47c7b9
Parent: ee11f54d5448447505239fdff4a68b3922d97f4e
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Mar 5 13:36:38 2013 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Tue Mar 5 13:36:38 2013 -0600
dlm_controld: even partition merges
When a cluster partitions and merges evenly,
e.g. 2/2, both sides were killing/fencing each
other. In this case, wait for stateful merged
nodes to be cleared before fencing. The side
with the low nodeid will kill the stateful nodes
(from its perspective).
Signed-off-by: David Teigland <teigland(a)redhat.com>
---
dlm_controld/daemon_cpg.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-
dlm_controld/fence.c | 2 +-
2 files changed, 82 insertions(+), 2 deletions(-)
diff --git a/dlm_controld/daemon_cpg.c b/dlm_controld/daemon_cpg.c
index b3c543d..8c4cff2 100644
--- a/dlm_controld/daemon_cpg.c
+++ b/dlm_controld/daemon_cpg.c
@@ -72,6 +72,7 @@ struct node_daemon {
int need_fence_clear;
int need_fencing;
int delay_fencing;
+ int stateful_merge;
int fence_pid;
int fence_pid_wait;
int fence_result_wait;
@@ -657,6 +658,20 @@ static void fence_pid_cancel(int nodeid, int pid)
nodeid, pid, rv, result);
}
+static void kick_stateful_merge_members(void)
+{
+ struct node_daemon *node;
+
+ list_for_each_entry(node, &daemon_nodes, list) {
+ if (!node->killed && node->stateful_merge) {
+ log_error("daemon node %d kill stateful merge member",
+ node->nodeid);
+ kick_node_from_cluster(node->nodeid);
+ node->killed = 1;
+ }
+ }
+}
+
/*
* fence_in_progress_unknown (fipu)
*
@@ -746,7 +761,8 @@ static void fence_pid_cancel(int nodeid, int pid)
static void daemon_fence_work(void)
{
struct node_daemon *node, *safe;
- int rv, nodeid, pid, need, low, actor, result;
+ int gone_count = 0, part_count = 0, merge_count = 0, clean_count = 0;
+ int rv, nodeid, pid, need, low = 0, actor, result;
int retry = 0;
uint32_t flags;
@@ -774,6 +790,67 @@ static void daemon_fence_work(void)
}
/*
+ * Count different types of nodes
+ * gone: node not a member
+ * part: member we've not received a proto message from
+ * merge: member we received a stateful proto message from
+ * clean: member we received a clean/new proto message from
+ *
+ * A node always views itself as a clean member, not a merge member.
+ */
+
+ list_for_each_entry(node, &daemon_nodes, list) {
+ if (!node->daemon_member) {
+ gone_count++;
+ } else {
+ if (!low || node->nodeid < low)
+ low = node->nodeid;
+
+ if (node->stateful_merge)
+ merge_count++;
+ else if (!node->proto.daemon_max[0])
+ part_count++;
+ else
+ clean_count++;
+ }
+ }
+
+ /*
+ * Wait for stateful merged members to be removed before moving
+ * on to fencing. Kill stateful merged members to clear them.
+ * This section is only relevant to non-two-node, even splits.
+ *
+ * With two node splits, they race to fence each other and
+ * whichever fences successfully then kills corosync on the other
+ * (in the case where corosync is still running on the fenced node).
+ *
+ * With an odd split, the partition that maintained quorum will
+ * kill stateful merged nodes when their proto message is received.
+ *
+ * With an even split, e.g. 2/2, we don't want both sets to
+ * be fencing each other right after merge, when both sides
+ * have quorum again and see the other side as statefully merged.
+ * So, delay fencing until the stateful nodes are cleared on one
+ * side (by way of the low nodeid killing stateful merged members).
+ *
+ * When there are 3 or more partitions that merge, none may see
+ * enough clean nodes, so the cluster would be stuck here waiting
+ * for someone to manually reset/restart enough nodes to produce
+ * sufficient clean nodes (>= merged).
+ */
+
+ if (!cluster_two_node && merge_count) {
+ log_retry(retry_fencing, "fence work wait to clear merge %d clean %d part %d gone %d",
+ merge_count, clean_count, part_count, gone_count);
+
+ if ((clean_count >= merge_count) && !part_count && (low == our_nodeid))
+ kick_stateful_merge_members();
+
+ retry = 1;
+ goto out;
+ }
+
+ /*
* startup fencing
*/
@@ -1608,6 +1685,8 @@ static void receive_protocol(struct dlm_header *hd, int len)
(unsigned long long)cluster_quorate_monotime,
node->killed);
+ node->stateful_merge = 1;
+
if (cluster_quorate && node->daemon_rem_time &&
cluster_quorate_monotime < node->daemon_rem_time) {
if (!node->killed) {
@@ -1960,6 +2039,7 @@ static void confchg_cb_daemon(cpg_handle_t handle,
node->daemon_member = 0;
node->daemon_rem_time = now;
node->killed = 0;
+ node->stateful_merge = 0;
/* If we never accepted a valid proto from this node,
then it never fully joined and there's no need to
diff --git a/dlm_controld/fence.c b/dlm_controld/fence.c
index 0094b3a..e4c67e9 100644
--- a/dlm_controld/fence.c
+++ b/dlm_controld/fence.c
@@ -138,7 +138,7 @@ int fence_result(int nodeid, int pid, int *result)
if (rv < 0) {
/* shouldn't happen */
log_error("fence result %d pid %d waitpid %d errno %d",
- pid, nodeid, rv, errno);
+ nodeid, pid, rv, errno);
return rv;
}
Gitweb: http://git.fedorahosted.org/git/?p=dlm.git;a=commitdiff;h=ee11f54d544844750…
Commit: ee11f54d5448447505239fdff4a68b3922d97f4e
Parent: 16ddbe2d61b4edbed4d911c523a82bcf5f325b70
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Thu Feb 28 15:12:33 2013 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Thu Feb 28 15:12:33 2013 -0600
dlm_controld: partition merge handling
Fix/improve the handling of partition merge cases.
This includes fencing and killing merged nodes.
Signed-off-by: David Teigland <teigland(a)redhat.com>
---
dlm_controld/daemon_cpg.c | 159 +++++++++++++++++++++++++++++++++++----------
dlm_controld/dlm_daemon.h | 1 +
dlm_controld/member.c | 15 ++++
3 files changed, 141 insertions(+), 34 deletions(-)
diff --git a/dlm_controld/daemon_cpg.c b/dlm_controld/daemon_cpg.c
index 641b189..b3c543d 100644
--- a/dlm_controld/daemon_cpg.c
+++ b/dlm_controld/daemon_cpg.c
@@ -369,6 +369,18 @@ static int nodes_need_fencing(void)
return 0;
}
+static int nodeid_needs_fencing(int nodeid)
+{
+ struct node_daemon *node;
+
+ node = get_node_daemon(nodeid);
+ if (!node) {
+ log_error("nodeid_needs_fencing %d not found", nodeid);
+ return 0;
+ }
+ return node->need_fencing;
+}
+
static int all_daemon_members_fipu(void)
{
struct node_daemon *node;
@@ -839,7 +851,7 @@ static void daemon_fence_work(void)
/*
* node has rejoined in clean state
*/
- log_debug("fence request %d skip member", node->nodeid);
+ log_debug("fence request %d skip for is_clean_daemon_member", node->nodeid);
node->need_fencing = 0;
node->delay_fencing = 0;
@@ -858,6 +870,10 @@ static void daemon_fence_work(void)
continue;
}
+ /* use post_join_delay to avoid fencing a node in the short
+ time between it joining the cluster (giving cluster quorum)
+ and joining the daemon cpg, which allows it to bypass fencing */
+
if (monotime() - cluster_last_join_monotime < opt(post_join_delay_ind)) {
log_debug("fence request %d delay %d from %llu",
node->nodeid, opt(post_join_delay_ind),
@@ -945,7 +961,7 @@ static void daemon_fence_work(void)
* will see and do this, so we don't need to send
* a fence result.
*/
- log_debug("fence wait %d pid %d skip member", nodeid, pid);
+ log_debug("fence wait %d pid %d skip for is_clean_daemon_member", nodeid, pid);
node->need_fencing = 0;
node->delay_fencing = 0;
@@ -1262,7 +1278,8 @@ static void receive_fence_result(struct dlm_header *hd, int len)
}
if (!node->need_fencing) {
- /* should never happen */
+ /* should never happen ... will happen if a manual fence_ack is
+ done for a node that doesn't need it */
log_error("receive_fence_result %d from %d result %d no need_fencing",
fr->nodeid, hd->nodeid, fr->result);
return;
@@ -1275,20 +1292,23 @@ static void receive_fence_result(struct dlm_header *hd, int len)
/* should we ignore and return here? */
}
- if (!fr->result && node->daemon_member) {
+ if (node->daemon_member &&
+ (!fr->result || (fr->result == -ECANCELED))) {
/*
- * the only time I think this can happen is if there is a
- * manual dlm_tool fence_ack for a node that is a member,
- * e.g. partition, merge, fence_ack while it's a merged member.
- * Ideally it would be killed after merging with state, but
- * not necessarily, i.e. it's start message can't be sent or
- * received.
+ * The node was successfully fenced, but is still a member.
+ * This will happen when there is a partition, storage fencing
+ * is started, a merge causes the node to become a member
+ * again, and storage fencing completes successfully. If we
+ * received a proto message from the node after the merge, then
+ * we will have detected a stateful merge, and we may have
+ * already killed it.
*/
- log_error("receive_fence_result %d from %d result %d node not dead",
+ log_error("receive_fence_result %d from %d result %d node is daemon_member",
fr->nodeid, hd->nodeid, fr->result);
- return;
+
+ kick_node_from_cluster(fr->nodeid);
}
if ((hd->nodeid == our_nodeid) && (fr->result != -ECANCELED))
@@ -1580,18 +1600,62 @@ static void receive_protocol(struct dlm_header *hd, int len)
(p->dr_ver.flags & PV_STATEFUL) &&
(our_protocol.dr_ver.flags & PV_STATEFUL)) {
- log_debug("daemon node %d stateful merge", hd->nodeid);
- log_debug("daemon node %d join %llu left %llu local quorum %llu",
+ log_error("daemon node %d stateful merge", hd->nodeid);
+ log_debug("daemon node %d join %llu left %llu local quorum %llu killed %d",
hd->nodeid,
(unsigned long long)node->daemon_add_time,
(unsigned long long)node->daemon_rem_time,
- (unsigned long long)cluster_quorate_monotime);
+ (unsigned long long)cluster_quorate_monotime,
+ node->killed);
if (cluster_quorate && node->daemon_rem_time &&
cluster_quorate_monotime < node->daemon_rem_time) {
- log_debug("daemon node %d kill due to stateful merge", hd->nodeid);
- if (!node->killed)
- kick_node_from_cluster(hd->nodeid);
+ if (!node->killed) {
+ if (cluster_two_node) {
+ /*
+ * When there are two nodes and two_node mode
+ * is used, both will have quorum throughout
+ * the partition and subsequent stateful merge.
+ *
+ * - both will race to fence each other in
+ * response to the partition
+ *
+ * - both can attempt to kill the cluster
+ * on the other in response to the stateful
+ * merge here
+ *
+ * - we don't want both nodes to kill the cluster
+ * on the other, which can happen if the merge
+ * occurs before power fencing is successful,
+ * or can happen before/during/after storage
+ * fencing
+ *
+ * - if nodeA successfully fences nodeB (due
+ * to the partition), we want nodeA to kill
+ * the cluster on nodeB in response to the
+ * merge (we don't want nodeB to kill nodeA
+ * in response to the merge).
+ *
+ * So, a node that has successfully fenced the
+ * other will kill the cluster on it. If fencing
+ * is still running, we wait until it's
+ * successfull to kill the cluster on the node
+ * being fenced.
+ */
+ if (nodeid_needs_fencing(hd->nodeid)) {
+ /* when fencing completes successfully,
+ we'll see the node is a daemon member
+ and kill it */
+ log_debug("daemon node %d delay kill for stateful merge", hd->nodeid);
+ } else {
+ log_error("daemon node %d kill due to stateful merge", hd->nodeid);
+ kick_node_from_cluster(hd->nodeid);
+ }
+ } else {
+ log_error("daemon node %d kill due to stateful merge", hd->nodeid);
+ kick_node_from_cluster(hd->nodeid);
+ }
+ }
node->killed = 1;
}
@@ -1808,6 +1872,7 @@ static void confchg_cb_daemon(cpg_handle_t handle,
struct node_daemon *node;
uint64_t now, now_wall;
int nodedown = 0, procdown = 0, leave = 0;
+ int check_joined_count = 0, check_remove_count = 0, check_member_count = 0;
int we_joined = 0;
int i, reason, low;
@@ -1851,7 +1916,7 @@ static void confchg_cb_daemon(cpg_handle_t handle,
}
if (nodedown || procdown || leave)
- log_debug("%s left nodedown %d procdown %d leave %d",
+ log_debug("%s left reason nodedown %d procdown %d leave %d",
group_name->value, nodedown, procdown, leave);
if (nodedown)
@@ -1865,6 +1930,8 @@ static void confchg_cb_daemon(cpg_handle_t handle,
if (node->daemon_member)
continue;
+ check_joined_count++;
+
/* node joined daemon cpg */
node->daemon_member = 1;
node->daemon_add_time = now;
@@ -1878,31 +1945,56 @@ static void confchg_cb_daemon(cpg_handle_t handle,
if (node->need_fencing) {
/* need_fencing will be cleared if we accept a
- valid proto from it */
- log_error("daemon new nodeid %d needs fencing",
- node->nodeid);
+ valid proto from it (is_clean_daemon_member) */
+ log_error("daemon joined %d needs fencing", node->nodeid);
+ } else {
+ log_debug("daemon joined %d");
}
-
} else {
if (!node->daemon_member)
continue;
+ check_remove_count++;
+
/* node left daemon cpg */
node->daemon_member = 0;
- node->killed = 0;
- memset(&node->proto, 0, sizeof(struct protocol));
node->daemon_rem_time = now;
+ node->killed = 0;
- /* tell loop below to look at this node */
- node->recover_setup = 1;
+ /* If we never accepted a valid proto from this node,
+ then it never fully joined and there's no need to
+ recover it. Similary, node_history_lockspace_fail
+ only sets need_fencing in the lockspace if
+ node->start_time was non-zero. */
+
+ if (node->proto.daemon_max[0]) {
+ /* tell loop below to look at this node */
+ node->recover_setup = 1;
+ } else {
+ log_debug("daemon remove %d no proto skip recover", node->nodeid);
+ }
+
+ memset(&node->proto, 0, sizeof(struct protocol));
}
}
- /* set up recovery work for nodes that just failed */
+ list_for_each_entry(node, &daemon_nodes, list) {
+ if (node->daemon_member)
+ check_member_count++;
+ }
+
+ /* when we join, all previous members look like they are joining */
+ if (!we_joined &&
+ (daemon_joined_count != check_joined_count ||
+ daemon_remove_count != check_remove_count ||
+ daemon_member_count != check_member_count)) {
+ log_error("daemon counts joined %d check %d remove %d check %d member %d check %d",
+ daemon_joined_count, check_joined_count,
+ daemon_remove_count, check_remove_count,
+ daemon_member_count, check_member_count);
+ }
- /* TODO: limit to nodes with a valid proto?
- * node_history_lockspace_fail() would only set
- * need_fencing if node->start_time was non-zero. */
+ /* set up recovery work for nodes that just failed (recover_setup set above) */
list_for_each_entry(node, &daemon_nodes, list) {
if (!node->recover_setup)
@@ -1916,8 +2008,7 @@ static void confchg_cb_daemon(cpg_handle_t handle,
continue;
if (node->need_fencing) {
- log_error("daemon remove nodeid %d already needs fencing",
- node->nodeid);
+ log_error("daemon remove %d already needs fencing", node->nodeid);
continue;
}
@@ -1931,7 +2022,7 @@ static void confchg_cb_daemon(cpg_handle_t handle,
if (reason == CPG_REASON_NODEDOWN || reason == CPG_REASON_PROCDOWN) {
if (node->fence_pid_wait || node->fence_pid) {
/* sanity check, should never happen */
- log_error("daemon remove nodeid %d pid_wait %d pid %d",
+ log_error("daemon remove %d pid_wait %d pid %d",
node->nodeid, node->fence_pid_wait, node->fence_pid);
}
diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h
index 60d3d46..11a4777 100644
--- a/dlm_controld/dlm_daemon.h
+++ b/dlm_controld/dlm_daemon.h
@@ -169,6 +169,7 @@ EXTERN int plock_fd;
EXTERN int plock_ci;
EXTERN struct list_head lockspaces;
EXTERN int cluster_quorate;
+EXTERN int cluster_two_node;
EXTERN uint64_t cluster_last_join_monotime;
EXTERN uint64_t cluster_quorate_monotime;
EXTERN uint64_t cluster_joined_monotime;
diff --git a/dlm_controld/member.c b/dlm_controld/member.c
index d195ab1..fca3248 100644
--- a/dlm_controld/member.c
+++ b/dlm_controld/member.c
@@ -348,6 +348,8 @@ int setup_node_config(void)
cmap_handle_t h;
cs_error_t err;
uint32_t nodeid;
+ uint8_t two_node = 0;
+ int node_count = 0;
int i;
err = cmap_initialize(&h);
@@ -365,10 +367,23 @@ int setup_node_config(void)
log_debug("node_config %d", nodeid);
+ node_count++;
+
if (opt(enable_fencing_ind) && opt(enable_startup_fencing_ind))
add_startup_node(nodeid);
}
+ memset(key, 0, sizeof(key));
+ snprintf(key, CMAP_KEYNAME_MAXLEN, "quorum.two_node");
+
+ err = cmap_get_uint8(h, key, &two_node);
+ if (err != CS_OK)
+ goto out;
+
+ if (node_count == 2 && two_node)
+ cluster_two_node = 1;
+
+ out:
cmap_finalize(h);
return 0;
}
Gitweb: http://git.fedorahosted.org/git/?p=dlm.git;a=commitdiff;h=16ddbe2d61b4edbed…
Commit: 16ddbe2d61b4edbed4d911c523a82bcf5f325b70
Parent: f65f3f67b0f87f52398ff1100aaede36e254abda
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Feb 6 14:11:15 2013 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Wed Feb 6 14:11:15 2013 -0600
dlm_controld: ignore fence_ack for member
When a node is still a member of the daemon cpg,
ignore a fence_ack for it. Either it never failed
and the ack is pointless, or it merged after a
partition, fencing hasn't completed and it's still
a merged member that needs to be reset.
Signed-off-by: David Teigland <teigland(a)redhat.com>
---
dlm_controld/daemon_cpg.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/dlm_controld/daemon_cpg.c b/dlm_controld/daemon_cpg.c
index af9b91d..641b189 100644
--- a/dlm_controld/daemon_cpg.c
+++ b/dlm_controld/daemon_cpg.c
@@ -1251,6 +1251,7 @@ static void receive_fence_result(struct dlm_header *hd, int len)
if (count) {
log_debug("receive_fence_result %d from %d clear startup",
fr->nodeid, hd->nodeid);
+ return;
}
node = get_node_daemon(fr->nodeid);
@@ -1274,6 +1275,22 @@ static void receive_fence_result(struct dlm_header *hd, int len)
/* should we ignore and return here? */
}
+ if (!fr->result && node->daemon_member) {
+
+ /*
+ * the only time I think this can happen is if there is a
+ * manual dlm_tool fence_ack for a node that is a member,
+ * e.g. partition, merge, fence_ack while it's a merged member.
+ * Ideally it would be killed after merging with state, but
+ * not necessarily, i.e. it's start message can't be sent or
+ * received.
+ */
+
+ log_error("receive_fence_result %d from %d result %d node not dead",
+ fr->nodeid, hd->nodeid, fr->result);
+ return;
+ }
+
if ((hd->nodeid == our_nodeid) && (fr->result != -ECANCELED))
node->fence_result_wait = 0;
Gitweb: http://git.fedorahosted.org/git/?p=fence-agents.git;a=commitdiff;h=c58fc667…
Commit: c58fc667bab72b03527cc95bf791ae36af0fab02
Parent: 0000000000000000000000000000000000000000
Author: Marek 'marx' Grac <mgrac(a)redhat.com>
AuthorDate: 2013-03-06 15:16 +0000
Committer: Marek 'marx' Grac <mgrac(a)redhat.com>
CommitterDate: 2013-03-06 15:16 +0000
annotated tag: v4.0.0 has been created
at c58fc667bab72b03527cc95bf791ae36af0fab02 (tag)
tagging 06f7d26340d8f700dc834e8ce5495bf156e20d2e (commit)
replaces v3.1.12
v4.0.0 release
Jan Pokorný (2):
lib: remove static metadata from fence.rng.head
fence2rng.xsl: parametrize and make more flexible
Marek 'marx' Grac (28):
COMPATIBILITY BREAK: remove option -T / --test / test
COMPATIBILITY BREAK: fence_drac5 replace --m / --modulename / modulename / module_name with standard -n / --plug / port
COMPATIBILITY BREAK: fence_lpar replace --n / --partition / partition with standard -n / --plug / port
COMPATIBILITY BREAK: fence_rsb replace -n / telnet_port with standard --ipport / ipport
COMPATIBILITY BREAK: Remove obsolete options from STDIN
COMPATIBILITY BREAK: replace udpport with ipport, make ipport dependent on ipaddress
COMPATIBILITY BREAK: remove -q / quiet
fencing: Text in help is changed from foo=<value> to foo=[value]
fence agents: Text in help is changed from foo=<value> to foo=[value]
fence_vmnware_soap: Fix traceback when hostname cannot be resolved to IP address
fence_vmware_soap: Fix previous patch - fix traceback when hostname cannot be resolved
fence_cisco_ucs: fence agent does not respect "delay" attribute
fence_cisco_ucs: Fix traceback when hostname cannot be resolved to IP address
fence_virsh: Replace constant (1) with variable from --power-wait
fencing: Testing tool and dummy fence agent
fence agents: Fence agents errors are logged to syslog
COMPATIBILITY BREAK: remove support for Dell DRAC III and older
testing: Add test suite for fence_drac on Dell DRAC IV
testing: Add verbose mode to testing library
fence_apc: Add support for firmware 5.x
COMPATIBILITY BREAK: remove --uuid (use standard -n / --plug instead)
fencing: Fix documentation for action 'monitor'
fencing: present default values for --ipport in --help
fencing: Fix indentation in --help message
fencing: All command prompt defaults should be list
fencing: Support multiple plugs for actions (e.g. --n 2,3,4)
testing: Add test for multiple ports feature
fencing: Install non-fence agents to libexec