From 14bb468ab404228cae34809420ef0763d3d54482 Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Thu, 13 Jun 2019 15:31:24 +0200
Subject: [PATCH] Fix: fence-history: fail leftover pending-actions after
fenced-restart
---
daemons/fenced/fenced_history.c | 15 +++++++++++++++
daemons/fenced/fenced_remote.c | 6 +++---
daemons/fenced/pacemaker-fenced.h | 8 ++++++++
3 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/daemons/fenced/fenced_history.c b/daemons/fenced/fenced_history.c
index 7c129cc..b65b64c 100644
--- a/daemons/fenced/fenced_history.c
+++ b/daemons/fenced/fenced_history.c
@@ -347,6 +347,21 @@ stonith_merge_in_history_list(GHashTable *history)
updated = TRUE;
g_hash_table_iter_steal(&iter);
+
+ if ((op->state != st_failed) &&
+ (op->state != st_done) &&
+ safe_str_eq(op->originator, stonith_our_uname)) {
+ crm_warn("received pending action we are supposed to be the "
+ "owner but it's not in our records -> fail it");
+ op->state = st_failed;
+ op->completed = time(NULL);
+ /* use -EHOSTUNREACH to not introduce a new return-code that might
+ trigger unexpected results at other places and to prevent
+ remote_op_done from setting the delegate if not present
+ */
+ stonith_bcast_result_to_peers(op, -EHOSTUNREACH);
+ }
+
g_hash_table_insert(stonith_remote_op_list, op->id, op);
/* we could trim the history here but if we bail
* out after trim we might miss more recent entries
diff --git a/daemons/fenced/fenced_remote.c b/daemons/fenced/fenced_remote.c
index 7d61249..5b86f0f 100644
--- a/daemons/fenced/fenced_remote.c
+++ b/daemons/fenced/fenced_remote.c
@@ -369,8 +369,8 @@ create_op_done_notify(remote_fencing_op_t * op, int rc)
return notify_data;
}
-static void
-bcast_result_to_peers(remote_fencing_op_t * op, int rc)
+void
+stonith_bcast_result_to_peers(remote_fencing_op_t * op, int rc)
{
static int count = 0;
xmlNode *bcast = create_xml_node(NULL, T_STONITH_REPLY);
@@ -509,7 +509,7 @@ remote_op_done(remote_fencing_op_t * op, xmlNode * data, int rc, int dup)
subt = crm_element_value(data, F_SUBTYPE);
if (dup == FALSE && safe_str_neq(subt, "broadcast")) {
/* Defer notification until the bcast message arrives */
- bcast_result_to_peers(op, rc);
+ stonith_bcast_result_to_peers(op, rc);
goto remote_op_done_cleanup;
}
diff --git a/daemons/fenced/pacemaker-fenced.h b/daemons/fenced/pacemaker-fenced.h
index 3a2edbb..a8531a6 100644
--- a/daemons/fenced/pacemaker-fenced.h
+++ b/daemons/fenced/pacemaker-fenced.h
@@ -149,6 +149,14 @@ typedef struct remote_fencing_op_s {
} remote_fencing_op_t;
+/*!
+ * \internal
+ * \brief Broadcast the result of an operation to the peers.
+ * \param op, Operation whose result should be broadcast
+ * \param rc, Result of the operation
+ */
+void stonith_bcast_result_to_peers(remote_fencing_op_t * op, int rc);
+
enum st_callback_flags {
st_callback_unknown = 0x0000,
st_callback_notify_fence = 0x0001,
--
1.8.3.1
From a0bc0d3ab5aed64e37b1caae746f5c421696df1b Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Fri, 14 Jun 2019 13:41:43 +0200
Subject: [PATCH] Fix: controld-fencing: remove-notifications upon
connection-destroy
---
daemons/controld/controld_fencing.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c
index 92336e9..b925bc5 100644
--- a/daemons/controld/controld_fencing.c
+++ b/daemons/controld/controld_fencing.c
@@ -403,7 +403,14 @@ tengine_stonith_connection_destroy(stonith_t *st, stonith_event_t *e)
}
if (stonith_api) {
- stonith_api->state = stonith_disconnected;
+ /* the client API won't properly reconnect notifications
+ * if they are still in the table - so remove them
+ */
+ stonith_api->cmds->remove_notification(st, T_STONITH_NOTIFY_DISCONNECT);
+ stonith_api->cmds->remove_notification(st, T_STONITH_NOTIFY_FENCE);
+ if (stonith_api->state != stonith_disconnected) {
+ stonith_api->cmds->disconnect(st);
+ }
}
if (AM_I_DC) {
--
1.8.3.1
From 487cdd9e3ec6ab47fde5074acbb2ff564047d59c Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Tue, 18 Jun 2019 14:09:20 +0200
Subject: [PATCH] Feature: fence-history: add notification upon history-synced
---
daemons/fenced/fenced_history.c | 5 +++++
daemons/fenced/pacemaker-fenced.c | 3 +++
daemons/fenced/pacemaker-fenced.h | 11 ++++++-----
include/crm/stonith-ng.h | 1 +
4 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/daemons/fenced/fenced_history.c b/daemons/fenced/fenced_history.c
index b65b64c..cd08d74 100644
--- a/daemons/fenced/fenced_history.c
+++ b/daemons/fenced/fenced_history.c
@@ -420,6 +420,11 @@ stonith_fence_history(xmlNode *msg, xmlNode **output,
stonith_fence_history_cleanup(target,
crm_element_value(msg, F_STONITH_CALLID) != NULL);
} else if (options & st_opt_broadcast) {
+ /* there is no clear sign atm for when a history sync
+ is done so send a notification for anything
+ that smells like history-sync
+ */
+ do_stonith_notify(0, T_STONITH_NOTIFY_HISTORY_SYNCED, 0, NULL);
if (crm_element_value(msg, F_STONITH_CALLID)) {
/* this is coming from the stonith-API
*
diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
index 7e9bb07..7a87f93 100644
--- a/daemons/fenced/pacemaker-fenced.c
+++ b/daemons/fenced/pacemaker-fenced.c
@@ -279,6 +279,9 @@ get_stonith_flag(const char *name)
} else if (safe_str_eq(name, T_STONITH_NOTIFY_HISTORY)) {
return st_callback_notify_history;
+ } else if (safe_str_eq(name, T_STONITH_NOTIFY_HISTORY_SYNCED)) {
+ return st_callback_notify_history_synced;
+
}
return st_callback_unknown;
}
diff --git a/daemons/fenced/pacemaker-fenced.h b/daemons/fenced/pacemaker-fenced.h
index a8531a6..583cb47 100644
--- a/daemons/fenced/pacemaker-fenced.h
+++ b/daemons/fenced/pacemaker-fenced.h
@@ -158,11 +158,12 @@ typedef struct remote_fencing_op_s {
void stonith_bcast_result_to_peers(remote_fencing_op_t * op, int rc);
enum st_callback_flags {
- st_callback_unknown = 0x0000,
- st_callback_notify_fence = 0x0001,
- st_callback_device_add = 0x0004,
- st_callback_device_del = 0x0010,
- st_callback_notify_history = 0x0020
+ st_callback_unknown = 0x0000,
+ st_callback_notify_fence = 0x0001,
+ st_callback_device_add = 0x0004,
+ st_callback_device_del = 0x0010,
+ st_callback_notify_history = 0x0020,
+ st_callback_notify_history_synced = 0x0040
};
/*
diff --git a/include/crm/stonith-ng.h b/include/crm/stonith-ng.h
index b640732..418a03c 100644
--- a/include/crm/stonith-ng.h
+++ b/include/crm/stonith-ng.h
@@ -29,6 +29,7 @@ extern "C" {
# define T_STONITH_NOTIFY_DISCONNECT "st_notify_disconnect"
# define T_STONITH_NOTIFY_FENCE "st_notify_fence"
# define T_STONITH_NOTIFY_HISTORY "st_notify_history"
+# define T_STONITH_NOTIFY_HISTORY_SYNCED "st_notify_history_synced"
/* *INDENT-OFF* */
enum stonith_state {
--
1.8.3.1
From 03c4455fced74f093deb782198b1ba3076e52015 Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Tue, 18 Jun 2019 14:12:27 +0200
Subject: [PATCH] Fix: fence-history: resync fence-history after fenced crash
Setting up a 30s fallback timer to trigger history-sync if the
sync via DC doesn't happen
---
daemons/controld/controld_callbacks.c | 2 +-
daemons/controld/controld_control.c | 2 +
daemons/controld/controld_fencing.c | 86 ++++++++++++++++++++++++++++++-----
daemons/controld/controld_fencing.h | 3 +-
4 files changed, 79 insertions(+), 14 deletions(-)
diff --git a/daemons/controld/controld_callbacks.c b/daemons/controld/controld_callbacks.c
index 3ce7470..48225ac 100644
--- a/daemons/controld/controld_callbacks.c
+++ b/daemons/controld/controld_callbacks.c
@@ -211,7 +211,7 @@ peer_update_callback(enum crm_status_type type, crm_node_t * node, const void *d
} else if(AM_I_DC) {
if (appeared) {
- te_trigger_stonith_history_sync();
+ te_trigger_stonith_history_sync(FALSE);
} else {
erase_status_tag(node->uname, XML_TAG_TRANSIENT_NODEATTRS, cib_scope_local);
}
diff --git a/daemons/controld/controld_control.c b/daemons/controld/controld_control.c
index e99d605..f3bb20f 100644
--- a/daemons/controld/controld_control.c
+++ b/daemons/controld/controld_control.c
@@ -259,6 +259,8 @@ crmd_exit(crm_exit_t exit_code)
crm_timer_stop(wait_timer);
crm_timer_stop(recheck_timer);
+ te_cleanup_stonith_history_sync(NULL, TRUE);
+
free(transition_timer); transition_timer = NULL;
free(integration_timer); integration_timer = NULL;
free(finalization_timer); finalization_timer = NULL;
diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c
index b925bc5..22fa727 100644
--- a/daemons/controld/controld_fencing.c
+++ b/daemons/controld/controld_fencing.c
@@ -20,6 +20,9 @@
# include <sys/reboot.h>
#endif
+static void
+tengine_stonith_history_synced(stonith_t *st, stonith_event_t *st_event);
+
/*
* stonith failure counting
*
@@ -394,6 +397,8 @@ fail_incompletable_stonith(crm_graph_t *graph)
static void
tengine_stonith_connection_destroy(stonith_t *st, stonith_event_t *e)
{
+ te_cleanup_stonith_history_sync(st, FALSE);
+
if (is_set(fsa_input_register, R_ST_REQUIRED)) {
crm_crit("Fencing daemon connection failed");
mainloop_set_trigger(stonith_reconnect);
@@ -406,11 +411,12 @@ tengine_stonith_connection_destroy(stonith_t *st, stonith_event_t *e)
/* the client API won't properly reconnect notifications
* if they are still in the table - so remove them
*/
- stonith_api->cmds->remove_notification(st, T_STONITH_NOTIFY_DISCONNECT);
- stonith_api->cmds->remove_notification(st, T_STONITH_NOTIFY_FENCE);
if (stonith_api->state != stonith_disconnected) {
stonith_api->cmds->disconnect(st);
}
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_DISCONNECT);
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_FENCE);
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_HISTORY_SYNCED);
}
if (AM_I_DC) {
@@ -622,7 +628,12 @@ te_connect_stonith(gpointer user_data)
stonith_api->cmds->register_notification(stonith_api,
T_STONITH_NOTIFY_FENCE,
tengine_stonith_notify);
+ stonith_api->cmds->register_notification(stonith_api,
+ T_STONITH_NOTIFY_HISTORY_SYNCED,
+ tengine_stonith_history_synced);
+ te_trigger_stonith_history_sync(TRUE);
}
+
return TRUE;
}
@@ -649,7 +660,12 @@ controld_disconnect_fencer(bool destroy)
// Prevent fencer connection from coming up again
clear_bit(fsa_input_register, R_ST_REQUIRED);
- stonith_api->cmds->disconnect(stonith_api);
+ if (stonith_api->state != stonith_disconnected) {
+ stonith_api->cmds->disconnect(stonith_api);
+ }
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_DISCONNECT);
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_FENCE);
+ stonith_api->cmds->remove_notification(stonith_api, T_STONITH_NOTIFY_HISTORY_SYNCED);
}
if (destroy) {
if (stonith_api) {
@@ -673,6 +689,7 @@ do_stonith_history_sync(gpointer user_data)
if (stonith_api && (stonith_api->state != stonith_disconnected)) {
stonith_history_t *history = NULL;
+ te_cleanup_stonith_history_sync(stonith_api, FALSE);
stonith_api->cmds->history(stonith_api,
st_opt_sync_call | st_opt_broadcast,
NULL, &history, 5);
@@ -845,7 +862,33 @@ te_fence_node(crm_graph_t *graph, crm_action_t *action)
*/
static crm_trigger_t *stonith_history_sync_trigger = NULL;
-static mainloop_timer_t *stonith_history_sync_timer = NULL;
+static mainloop_timer_t *stonith_history_sync_timer_short = NULL;
+static mainloop_timer_t *stonith_history_sync_timer_long = NULL;
+
+void
+te_cleanup_stonith_history_sync(stonith_t *st, bool free_timers)
+{
+ if (free_timers) {
+ mainloop_timer_del(stonith_history_sync_timer_short);
+ stonith_history_sync_timer_short = NULL;
+ mainloop_timer_del(stonith_history_sync_timer_long);
+ stonith_history_sync_timer_long = NULL;
+ } else {
+ mainloop_timer_stop(stonith_history_sync_timer_short);
+ mainloop_timer_stop(stonith_history_sync_timer_long);
+ }
+
+ if (st) {
+ st->cmds->remove_notification(st, T_STONITH_NOTIFY_HISTORY_SYNCED);
+ }
+}
+
+static void
+tengine_stonith_history_synced(stonith_t *st, stonith_event_t *st_event)
+{
+ te_cleanup_stonith_history_sync(st, FALSE);
+ crm_debug("Fence-history synced - cancel all timers");
+}
static gboolean
stonith_history_sync_set_trigger(gpointer user_data)
@@ -855,11 +898,18 @@ stonith_history_sync_set_trigger(gpointer user_data)
}
void
-te_trigger_stonith_history_sync(void)
+te_trigger_stonith_history_sync(bool long_timeout)
{
/* trigger a sync in 5s to give more nodes the
* chance to show up so that we don't create
* unnecessary stonith-history-sync traffic
+ *
+ * the long timeout of 30s is there as a fallback
+ * so that after a successful connection to fenced
+ * we will wait for 30s for the DC to trigger a
+ * history-sync
+ * if this doesn't happen we trigger a sync locally
+ * (e.g. fenced segfaults and is restarted by pacemakerd)
*/
/* as we are finally checking the stonith-connection
@@ -873,14 +923,26 @@ te_trigger_stonith_history_sync(void)
do_stonith_history_sync, NULL);
}
- if(stonith_history_sync_timer == NULL) {
- stonith_history_sync_timer =
- mainloop_timer_add("history_sync", 5000,
- FALSE, stonith_history_sync_set_trigger,
- NULL);
+ if (long_timeout) {
+ if(stonith_history_sync_timer_long == NULL) {
+ stonith_history_sync_timer_long =
+ mainloop_timer_add("history_sync_long", 30000,
+ FALSE, stonith_history_sync_set_trigger,
+ NULL);
+ }
+ crm_info("Fence history will be synchronized cluster-wide within 30 seconds");
+ mainloop_timer_start(stonith_history_sync_timer_long);
+ } else {
+ if(stonith_history_sync_timer_short == NULL) {
+ stonith_history_sync_timer_short =
+ mainloop_timer_add("history_sync_short", 5000,
+ FALSE, stonith_history_sync_set_trigger,
+ NULL);
+ }
+ crm_info("Fence history will be synchronized cluster-wide within 5 seconds");
+ mainloop_timer_start(stonith_history_sync_timer_short);
}
- crm_info("Fence history will be synchronized cluster-wide within 5 seconds");
- mainloop_timer_start(stonith_history_sync_timer);
+
}
/* end stonith history synchronization functions */
diff --git a/daemons/controld/controld_fencing.h b/daemons/controld/controld_fencing.h
index 8f7f19b..2fe6d88 100644
--- a/daemons/controld/controld_fencing.h
+++ b/daemons/controld/controld_fencing.h
@@ -29,6 +29,7 @@ void purge_stonith_cleanup(void);
void execute_stonith_cleanup(void);
// stonith history synchronization
-void te_trigger_stonith_history_sync(void);
+void te_trigger_stonith_history_sync(bool long_timeout);
+void te_cleanup_stonith_history_sync(stonith_t *st, bool free_timers);
#endif
--
1.8.3.1
From 2b038831edf6dd345c3f39f0fc27cfbf9503f512 Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Tue, 18 Jun 2019 21:54:49 +0200
Subject: [PATCH] Fix: st_client: make safe to remove notifications from
notifications
While cycling over the notification-list just mark for deletion
and delete afterwards.
---
lib/fencing/st_client.c | 58 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 54 insertions(+), 4 deletions(-)
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
index 629887a..ba23ac5 100644
--- a/lib/fencing/st_client.c
+++ b/lib/fencing/st_client.c
@@ -67,6 +67,8 @@ typedef struct stonith_private_s {
mainloop_io_t *source;
GHashTable *stonith_op_callback_table;
GList *notify_list;
+ int notify_refcnt;
+ bool notify_deletes;
void (*op_callback) (stonith_t * st, stonith_callback_data_t * data);
@@ -77,6 +79,7 @@ typedef struct stonith_notify_client_s {
const char *obj_id; /* implement one day */
const char *obj_type; /* implement one day */
void (*notify) (stonith_t * st, stonith_event_t * e);
+ bool delete;
} stonith_notify_client_t;
@@ -211,6 +214,38 @@ log_action(stonith_action_t *action, pid_t pid)
}
}
+/* when cycling through the list we don't want to delete items
+ so just mark them and when we know nobody is using the list
+ loop over it to remove the marked items
+ */
+static void
+foreach_notify_entry (stonith_private_t *private,
+ GFunc func,
+ gpointer user_data)
+{
+ private->notify_refcnt++;
+ g_list_foreach(private->notify_list, func, user_data);
+ private->notify_refcnt--;
+ if ((private->notify_refcnt == 0) &&
+ private->notify_deletes) {
+ GList *list_item = private->notify_list;
+
+ private->notify_deletes = FALSE;
+ while (list_item != NULL)
+ {
+ stonith_notify_client_t *list_client = list_item->data;
+ GList *next = g_list_next(list_item);
+
+ if (list_client->delete) {
+ free(list_client);
+ private->notify_list =
+ g_list_delete_link(private->notify_list, list_item);
+ }
+ list_item = next;
+ }
+ }
+}
+
static void
stonith_connection_destroy(gpointer user_data)
{
@@ -230,7 +265,7 @@ stonith_connection_destroy(gpointer user_data)
crm_xml_add(blob.xml, F_TYPE, T_STONITH_NOTIFY);
crm_xml_add(blob.xml, F_SUBTYPE, T_STONITH_NOTIFY_DISCONNECT);
- g_list_foreach(native->notify_list, stonith_send_notification, &blob);
+ foreach_notify_entry(native, stonith_send_notification, &blob);
free_xml(blob.xml);
}
@@ -1140,6 +1175,10 @@ stonithlib_GCompareFunc(gconstpointer a, gconstpointer b)
const stonith_notify_client_t *a_client = a;
const stonith_notify_client_t *b_client = b;
+ if (a_client->delete || b_client->delete) {
+ /* make entries marked for deletion not findable */
+ return -1;
+ }
CRM_CHECK(a_client->event != NULL && b_client->event != NULL, return 0);
rc = strcmp(a_client->event, b_client->event);
if (rc == 0) {
@@ -1394,7 +1433,7 @@ stonith_dispatch_internal(const char *buffer, ssize_t length, gpointer userdata)
stonith_perform_callback(st, blob.xml, 0, 0);
} else if (safe_str_eq(type, T_STONITH_NOTIFY)) {
- g_list_foreach(private->notify_list, stonith_send_notification, &blob);
+ foreach_notify_entry(private, stonith_send_notification, &blob);
} else if (safe_str_eq(type, T_STONITH_TIMEOUT_VALUE)) {
int call_id = 0;
int timeout = 0;
@@ -1592,8 +1631,13 @@ stonith_api_del_notification(stonith_t * stonith, const char *event)
if (list_item != NULL) {
stonith_notify_client_t *list_client = list_item->data;
- private->notify_list = g_list_remove(private->notify_list, list_client);
- free(list_client);
+ if (private->notify_refcnt) {
+ list_client->delete = TRUE;
+ private->notify_deletes = TRUE;
+ } else {
+ private->notify_list = g_list_remove(private->notify_list, list_client);
+ free(list_client);
+ }
crm_trace("Removed callback");
@@ -1754,6 +1798,10 @@ stonith_send_notification(gpointer data, gpointer user_data)
crm_warn("Skipping callback - NULL callback client");
return;
+ } else if (entry->delete) {
+ crm_trace("Skipping callback - marked for deletion");
+ return;
+
} else if (entry->notify == NULL) {
crm_warn("Skipping callback - NULL callback");
return;
@@ -2037,6 +2085,8 @@ stonith_api_new(void)
private->stonith_op_callback_table = g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, stonith_destroy_op_callback);
private->notify_list = NULL;
+ private->notify_refcnt = 0;
+ private->notify_deletes = FALSE;
new_stonith->call_id = 1;
new_stonith->state = stonith_disconnected;
--
1.8.3.1
From 03765b7803f935f0db149843a0b90aa9c872d922 Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Fri, 21 Jun 2019 14:13:10 +0200
Subject: [PATCH] Test: CTS: new pattern to identify fenced reconnected
Now that we are removing notifications upon disconnect a duplicate
notification can't be used as sign for reconnection any more.
---
cts/patterns.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cts/patterns.py b/cts/patterns.py
index 1b86ee7..8de67b1 100644
--- a/cts/patterns.py
+++ b/cts/patterns.py
@@ -303,7 +303,7 @@ class crm_corosync(BasePatterns):
self.components["pacemaker-fenced"] = [
r"error:.*Connection to (fencer|stonith-ng).* (closed|failed|lost)",
r"Fencing daemon connection failed",
- r"pacemaker-controld.*:\s*warn.*:\s*Callback already present",
+ r"pacemaker-controld.*Fencer successfully connected",
]
self.components["pacemaker-fenced-ignore"] = [
r"error:.*Connection to (fencer|stonith-ng).* (closed|failed|lost)",
--
1.8.3.1
From c45c98cd77cb3e0913bcdb18fd6b116c3a25285d Mon Sep 17 00:00:00 2001
From: Klaus Wenninger <klaus.wenninger@aon.at>
Date: Fri, 21 Jun 2019 16:40:47 +0200
Subject: [PATCH] Fix: controld-fencing: add notice-log for successful
fencer-connect
---
daemons/controld/controld_fencing.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c
index 22fa727..2428168 100644
--- a/daemons/controld/controld_fencing.c
+++ b/daemons/controld/controld_fencing.c
@@ -632,6 +632,7 @@ te_connect_stonith(gpointer user_data)
T_STONITH_NOTIFY_HISTORY_SYNCED,
tengine_stonith_history_synced);
te_trigger_stonith_history_sync(TRUE);
+ crm_notice("Fencer successfully connected");
}
return TRUE;
--
1.8.3.1