import sbd-1.3.1-18.el8_0.3
This commit is contained in:
commit
c30f7b670b
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
SOURCES/sbd-a74b4d25a3eb93fe1abbe6e3ebfd2b16cf48873f.tar.gz
|
1
.sbd.metadata
Normal file
1
.sbd.metadata
Normal file
@ -0,0 +1 @@
|
|||||||
|
c7d993891714de43c052a87b0165a97a6e27cfb5 SOURCES/sbd-a74b4d25a3eb93fe1abbe6e3ebfd2b16cf48873f.tar.gz
|
43
SOURCES/0001-make-pacemaker-dlm-wait-for-sbd-start.patch
Normal file
43
SOURCES/0001-make-pacemaker-dlm-wait-for-sbd-start.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
From 5f1ac8f07fd81a2c60db39dd5a28debbadfe3ec5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Thu, 14 Dec 2017 17:32:08 +0100
|
||||||
|
Subject: [PATCH] Fix: systemd: make pacemaker & dlm wait for sbd-start to
|
||||||
|
complete
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd.service.in | 4 +++-
|
||||||
|
src/sbd_remote.service.in | 2 +-
|
||||||
|
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd.service.in b/src/sbd.service.in
|
||||||
|
index ef1bd16..401c2d6 100644
|
||||||
|
--- a/src/sbd.service.in
|
||||||
|
+++ b/src/sbd.service.in
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Shared-storage based fencing daemon
|
||||||
|
Before=pacemaker.service
|
||||||
|
+Before=dlm.service
|
||||||
|
After=systemd-modules-load.service iscsi.service
|
||||||
|
PartOf=corosync.service
|
||||||
|
RefuseManualStop=true
|
||||||
|
@@ -22,4 +23,5 @@ Restart=on-abort
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
RequiredBy=corosync.service
|
||||||
|
-
|
||||||
|
+RequiredBy=pacemaker.service
|
||||||
|
+RequiredBy=dlm.service
|
||||||
|
diff --git a/src/sbd_remote.service.in b/src/sbd_remote.service.in
|
||||||
|
index e05f80e..cefd511 100644
|
||||||
|
--- a/src/sbd_remote.service.in
|
||||||
|
+++ b/src/sbd_remote.service.in
|
||||||
|
@@ -21,4 +21,4 @@ Restart=on-abort
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
RequiredBy=pacemaker_remote.service
|
||||||
|
-
|
||||||
|
+RequiredBy=dlm.service
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From f79d09ec8dd744f69d87008e868297b308043b56 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Thu, 14 Dec 2017 18:21:07 +0100
|
||||||
|
Subject: [PATCH] Doc: sbd.sysconfig: mention timeout caveat with
|
||||||
|
SBD_DELAY_START
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd.sysconfig | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/sbd.sysconfig b/src/sbd.sysconfig
|
||||||
|
index cbc1501..75ff980 100644
|
||||||
|
--- a/src/sbd.sysconfig
|
||||||
|
+++ b/src/sbd.sysconfig
|
||||||
|
@@ -31,6 +31,9 @@ SBD_STARTMODE=always
|
||||||
|
# other nodes are still waiting in the fence acknowledgement phase.
|
||||||
|
# This is an occasional issue with virtual machines.
|
||||||
|
#
|
||||||
|
+# Consider that you might have to adapt the startup-timeout accordingly
|
||||||
|
+# if the default isn't sufficient. (TimeoutStartSec for systemd)
|
||||||
|
+#
|
||||||
|
# This option may be ignored at a later point, once pacemaker handles
|
||||||
|
# this case better.
|
||||||
|
#
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
48
SOURCES/0003-Doc-sbd.8.pod-add-query-test-watchdog.patch
Normal file
48
SOURCES/0003-Doc-sbd.8.pod-add-query-test-watchdog.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
From e073271f53583f2d0cf2675ea665ed50712b65dd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Mon, 8 Jan 2018 12:07:33 +0100
|
||||||
|
Subject: [PATCH] Doc: sbd.8.pod: add sections for query-watchdog &
|
||||||
|
test-watchdog
|
||||||
|
|
||||||
|
---
|
||||||
|
man/sbd.8.pod | 24 ++++++++++++++++++++++++
|
||||||
|
1 file changed, 24 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/man/sbd.8.pod b/man/sbd.8.pod
|
||||||
|
index c1bf67a..ffd01c2 100644
|
||||||
|
--- a/man/sbd.8.pod
|
||||||
|
+++ b/man/sbd.8.pod
|
||||||
|
@@ -394,6 +394,30 @@ a fencing message by the cluster.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
+=head2 query-watchdog
|
||||||
|
+
|
||||||
|
+Example usage:
|
||||||
|
+
|
||||||
|
+ sbd query-watchdog
|
||||||
|
+
|
||||||
|
+Check for available watchdog devices and print some info.
|
||||||
|
+
|
||||||
|
+B<Warning>: This command will arm the watchdog during query, and if your
|
||||||
|
+watchdog refuses disarming (for example, if its kernel module has the
|
||||||
|
+'nowayout' parameter set) this will reset your system.
|
||||||
|
+
|
||||||
|
+=head2 test-watchdog
|
||||||
|
+
|
||||||
|
+Example usage:
|
||||||
|
+
|
||||||
|
+ sbd test-watchdog [-w /dev/watchdog3]
|
||||||
|
+
|
||||||
|
+Test specified watchdog device (/dev/watchdog by default).
|
||||||
|
+
|
||||||
|
+B<Warning>: This command will arm the watchdog and have your system reset
|
||||||
|
+in case your watchdog is working properly! If issued from an interactive
|
||||||
|
+session, it will prompt for confirmation.
|
||||||
|
+
|
||||||
|
=head1 Base system configuration
|
||||||
|
|
||||||
|
=head2 Configure a watchdog
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,86 @@
|
|||||||
|
From ef40f6a0fdc178828fbde6f1303e5ee58bfb822a Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Gao,Yan" <ygao@suse.com>
|
||||||
|
Date: Wed, 7 Mar 2018 17:50:29 +0100
|
||||||
|
Subject: [PATCH] Build: sbd-pacemaker: Query CIB directly with the API instead
|
||||||
|
of get_cib_copy()
|
||||||
|
|
||||||
|
get_cib_copy() has been dropped from pacemaker 2.0 branch as of:
|
||||||
|
https://github.com/ClusterLabs/pacemaker/commit/32c75b7be
|
||||||
|
---
|
||||||
|
src/sbd-pacemaker.c | 39 +++++++++++++++++++++++++++++++++++----
|
||||||
|
1 file changed, 35 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index b6a8fb6..2f06109 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -109,6 +109,38 @@ mon_cib_connection_destroy(gpointer user_data)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+mon_retrieve_current_cib()
|
||||||
|
+{
|
||||||
|
+ xmlNode *xml_cib = NULL;
|
||||||
|
+ int options = cib_scope_local | cib_sync_call;
|
||||||
|
+ int rc = pcmk_ok;
|
||||||
|
+
|
||||||
|
+ free_xml(current_cib);
|
||||||
|
+ current_cib = NULL;
|
||||||
|
+
|
||||||
|
+ rc = cib->cmds->query(cib, NULL, &xml_cib, options);
|
||||||
|
+
|
||||||
|
+ if (rc != pcmk_ok) {
|
||||||
|
+ crm_err("Couldn't retrieve the CIB: %s (%d)", pcmk_strerror(rc), rc);
|
||||||
|
+ free_xml(xml_cib);
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ } else if (xml_cib == NULL) {
|
||||||
|
+ crm_err("Couldn't retrieve the CIB: empty result");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (safe_str_eq(crm_element_name(xml_cib), XML_TAG_CIB)) {
|
||||||
|
+ current_cib = xml_cib;
|
||||||
|
+
|
||||||
|
+ } else {
|
||||||
|
+ free_xml(xml_cib);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static gboolean
|
||||||
|
mon_timer_notify(gpointer data)
|
||||||
|
{
|
||||||
|
@@ -121,8 +153,7 @@ mon_timer_notify(gpointer data)
|
||||||
|
|
||||||
|
if (cib_connected) {
|
||||||
|
if (counter == counter_max) {
|
||||||
|
- free_xml(current_cib);
|
||||||
|
- current_cib = get_cib_copy(cib);
|
||||||
|
+ mon_retrieve_current_cib();
|
||||||
|
mon_refresh_state(NULL);
|
||||||
|
counter = 0;
|
||||||
|
} else {
|
||||||
|
@@ -163,7 +194,7 @@ cib_connect(gboolean full)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- current_cib = get_cib_copy(cib);
|
||||||
|
+ mon_retrieve_current_cib();
|
||||||
|
mon_refresh_state(NULL);
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
@@ -308,7 +339,7 @@ crm_diff_update(const char *event, xmlNode * msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_cib == NULL) {
|
||||||
|
- current_cib = get_cib_copy(cib);
|
||||||
|
+ mon_retrieve_current_cib();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Refresh
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
33
SOURCES/0005-Fix-build-error-with-glibc-2.25.patch
Normal file
33
SOURCES/0005-Fix-build-error-with-glibc-2.25.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From ba3b4127f658cb59ff09939e8de93a06a138dddb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Valentin Vidic <Valentin.Vidic@CARNet.hr>
|
||||||
|
Date: Sat, 25 Nov 2017 09:18:41 +0100
|
||||||
|
Subject: [PATCH] Fix: build error with glibc 2.25
|
||||||
|
|
||||||
|
Add include for makedev, major and minor
|
||||||
|
|
||||||
|
sbd-common.c:268:13: error: In the GNU C Library, "makedev" is defined
|
||||||
|
by <sys/sysmacros.h>. For historical compatibility, it is
|
||||||
|
currently defined by <sys/types.h> as well, but we plan to
|
||||||
|
remove this soon. To use "makedev", include <sys/sysmacros.h>
|
||||||
|
directly. If you did not intend to use a system-defined macro
|
||||||
|
"makedev", you should undefine it after including <sys/types.h>. [-Werror]
|
||||||
|
{makedev(10,130), 0};
|
||||||
|
---
|
||||||
|
src/sbd-common.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index 1d7dbc2..25aaeae 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -19,6 +19,7 @@
|
||||||
|
#include "sbd.h"
|
||||||
|
#include <sys/reboot.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
+#include <sys/sysmacros.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
25
SOURCES/0006-Fix-gcc-format-string-error.patch
Normal file
25
SOURCES/0006-Fix-gcc-format-string-error.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From ee232b251c7072935d0507dc0bad27f375a12492 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Valentin Vidic <Valentin.Vidic@CARNet.hr>
|
||||||
|
Date: Wed, 8 Nov 2017 22:02:29 +0100
|
||||||
|
Subject: [PATCH] Fix: gcc format string error
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd-common.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index 803bc3a..1d7dbc2 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -268,7 +268,7 @@ watchdog_populate_list(void)
|
||||||
|
{makedev(10,130), 0};
|
||||||
|
int num_watchdogs = 1;
|
||||||
|
struct dirent *entry;
|
||||||
|
- char entry_name[64];
|
||||||
|
+ char entry_name[280];
|
||||||
|
DIR *dp;
|
||||||
|
char buf[256] = "";
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,51 @@
|
|||||||
|
From 04d32266b378f5f47088e8f34703bdd9c95f5a4c Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Gao,Yan" <ygao@suse.com>
|
||||||
|
Date: Thu, 30 Nov 2017 16:11:00 +0100
|
||||||
|
Subject: [PATCH] Build: cluster-servant: Compile with pacemaker-2.0
|
||||||
|
|
||||||
|
Pacemaker-2.0 removed support for corosync 1 cluster layer:
|
||||||
|
https://github.com/ClusterLabs/pacemaker/commit/7a9891f29
|
||||||
|
---
|
||||||
|
configure.ac | 4 ++++
|
||||||
|
src/sbd-cluster.c | 4 ++++
|
||||||
|
2 files changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 1eb8758..1f328c2 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -72,6 +72,10 @@ AC_CHECK_HEADERS(pacemaker/crm/cluster.h)
|
||||||
|
AC_CHECK_LIB(crmcommon, pcmk_strerror, , missing="yes")
|
||||||
|
AC_CHECK_LIB(cib, cib_apply_patch_event, , missing="yes")
|
||||||
|
|
||||||
|
+dnl pacemaker-2.0 removed support for corosync 1 cluster layer
|
||||||
|
+AC_CHECK_DECLS([pcmk_cluster_classic_ais, pcmk_cluster_cman],,,
|
||||||
|
+ [#include <pacemaker/crm/cluster.h>])
|
||||||
|
+
|
||||||
|
if test "$missing" = "yes"; then
|
||||||
|
AC_MSG_ERROR([Missing required libraries or functions.])
|
||||||
|
fi
|
||||||
|
diff --git a/src/sbd-cluster.c b/src/sbd-cluster.c
|
||||||
|
index de99d0c..ae4750e 100644
|
||||||
|
--- a/src/sbd-cluster.c
|
||||||
|
+++ b/src/sbd-cluster.c
|
||||||
|
@@ -238,12 +238,16 @@ notify_timer_cb(gpointer data)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (get_cluster_type()) {
|
||||||
|
+#if HAVE_DECL_PCMK_CLUSTER_CLASSIC_AIS
|
||||||
|
case pcmk_cluster_classic_ais:
|
||||||
|
send_cluster_text(crm_class_quorum, NULL, TRUE, NULL, crm_msg_ais);
|
||||||
|
break;
|
||||||
|
|
||||||
|
+#endif
|
||||||
|
case pcmk_cluster_corosync:
|
||||||
|
+#if HAVE_DECL_PCMK_CLUSTER_CMAN
|
||||||
|
case pcmk_cluster_cman:
|
||||||
|
+#endif
|
||||||
|
/* TODO - Make a CPG call and only call notify_parent() when we get a reply */
|
||||||
|
notify_parent();
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
From 1d8fd2540ccf254d90e831f612415226043fc5b3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Gao,Yan" <ygao@suse.com>
|
||||||
|
Date: Fri, 27 Apr 2018 13:41:00 +0200
|
||||||
|
Subject: [PATCH] Log: change sbd's default logging level to LOG_NOTICE
|
||||||
|
|
||||||
|
With the refactoring of logging parts and 1ee3503c, sbd became too
|
||||||
|
silent given the default logging level LOG_WARNING, even under the
|
||||||
|
situations where it's supposed to tell something.
|
||||||
|
|
||||||
|
This commit changes sbd's default logging level to LOG_NOTICE.
|
||||||
|
Meanwhile pacemaker library's logging level remains at LOG_WARNING.
|
||||||
|
With "-v", sbd's logging level is set to LOG_INFO.
|
||||||
|
With "-vv", sbd's logging level is set to LOG_DEBUG.
|
||||||
|
With "-vvv", both sbd's and pacemaker library's logging levels are set
|
||||||
|
to LOG_DEBUG.
|
||||||
|
---
|
||||||
|
src/sbd-inquisitor.c | 28 ++++++++++++++++++++++------
|
||||||
|
1 file changed, 22 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-inquisitor.c b/src/sbd-inquisitor.c
|
||||||
|
index 59408b3..237bf43 100644
|
||||||
|
--- a/src/sbd-inquisitor.c
|
||||||
|
+++ b/src/sbd-inquisitor.c
|
||||||
|
@@ -803,6 +803,19 @@ parse_device_line(const char *line)
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define SBD_SOURCE_FILES "sbd-cluster.c,sbd-common.c,sbd-inquisitor.c,sbd-md.c,sbd-pacemaker.c,setproctitle.c"
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+sbd_log_filter_ctl(const char *files, uint8_t priority)
|
||||||
|
+{
|
||||||
|
+ if (files == NULL) {
|
||||||
|
+ files = SBD_SOURCE_FILES;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, files, priority);
|
||||||
|
+ qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, files, priority);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
arg_enabled(int arg_count)
|
||||||
|
{
|
||||||
|
@@ -834,6 +847,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
|
||||||
|
qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE);
|
||||||
|
qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_FALSE);
|
||||||
|
+ sbd_log_filter_ctl(NULL, LOG_NOTICE);
|
||||||
|
|
||||||
|
sbd_get_uname();
|
||||||
|
|
||||||
|
@@ -926,15 +940,17 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
case 'v':
|
||||||
|
debug++;
|
||||||
|
if(debug == 1) {
|
||||||
|
- qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, "sbd-common.c,sbd-inquisitor.c,sbd-md.c,sbd-pacemaker.c", LOG_DEBUG);
|
||||||
|
- qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, "sbd-common.c,sbd-inquisitor.c,sbd-md.c,sbd-pacemaker.c", LOG_DEBUG);
|
||||||
|
- cl_log(LOG_INFO, "Verbose mode enabled.");
|
||||||
|
+ sbd_log_filter_ctl(NULL, LOG_INFO);
|
||||||
|
+ cl_log(LOG_INFO, "Verbose mode enabled.");
|
||||||
|
|
||||||
|
} else if(debug == 2) {
|
||||||
|
+ sbd_log_filter_ctl(NULL, LOG_DEBUG);
|
||||||
|
+ cl_log(LOG_INFO, "Debug mode enabled.");
|
||||||
|
+
|
||||||
|
+ } else if(debug == 3) {
|
||||||
|
/* Go nuts, turn on pacemaker's logging too */
|
||||||
|
- qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, "*", LOG_DEBUG);
|
||||||
|
- qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD, QB_LOG_FILTER_FILE, "*", LOG_DEBUG);
|
||||||
|
- cl_log(LOG_INFO, "Verbose library mode enabled.");
|
||||||
|
+ sbd_log_filter_ctl("*", LOG_DEBUG);
|
||||||
|
+ cl_log(LOG_INFO, "Debug library mode enabled.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,161 @@
|
|||||||
|
From 2dbdee29736fcbf0fe1d41c306959b22d05f72b0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Gao,Yan" <ygao@suse.com>
|
||||||
|
Date: Mon, 30 Apr 2018 18:02:04 +0200
|
||||||
|
Subject: [PATCH] Log: upgrade important messages and downgrade unimportant
|
||||||
|
ones
|
||||||
|
|
||||||
|
It also fixes a message that's supposed to be "quorum.two_node not
|
||||||
|
present in cmap".
|
||||||
|
---
|
||||||
|
src/sbd-cluster.c | 11 ++++++-----
|
||||||
|
src/sbd-common.c | 4 ++--
|
||||||
|
src/sbd-inquisitor.c | 6 +++---
|
||||||
|
src/sbd-md.c | 6 +++---
|
||||||
|
src/sbd-pacemaker.c | 2 +-
|
||||||
|
5 files changed, 15 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-cluster.c b/src/sbd-cluster.c
|
||||||
|
index ae4750e..c7328af 100644
|
||||||
|
--- a/src/sbd-cluster.c
|
||||||
|
+++ b/src/sbd-cluster.c
|
||||||
|
@@ -201,10 +201,11 @@ sbd_get_two_node(void)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmap_get_uint8(cmap_handle, "quorum.two_node", &two_node_u8) == CS_OK) {
|
||||||
|
- cl_log(LOG_NOTICE, "Corosync is%s in 2Node-mode", two_node_u8?"":" not");
|
||||||
|
+ cl_log(two_node_u8? LOG_NOTICE : LOG_INFO,
|
||||||
|
+ "Corosync is%s in 2Node-mode", two_node_u8?"":" not");
|
||||||
|
two_node = two_node_u8;
|
||||||
|
} else {
|
||||||
|
- cl_log(LOG_NOTICE, "quorum.two_node present in cmap\n");
|
||||||
|
+ cl_log(LOG_INFO, "quorum.two_node not present in cmap\n");
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
@@ -264,7 +265,7 @@ sbd_membership_connect(void)
|
||||||
|
{
|
||||||
|
bool connected = false;
|
||||||
|
|
||||||
|
- cl_log(LOG_NOTICE, "Attempting cluster connection");
|
||||||
|
+ cl_log(LOG_INFO, "Attempting cluster connection");
|
||||||
|
|
||||||
|
cluster.destroy = sbd_membership_destroy;
|
||||||
|
|
||||||
|
@@ -308,7 +309,7 @@ sbd_membership_connect(void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- set_servant_health(pcmk_health_transient, LOG_NOTICE, "Connected, waiting for initial membership");
|
||||||
|
+ set_servant_health(pcmk_health_transient, LOG_INFO, "Connected, waiting for initial membership");
|
||||||
|
notify_parent();
|
||||||
|
|
||||||
|
notify_timer_cb(NULL);
|
||||||
|
@@ -530,7 +531,7 @@ servant_cluster(const char *diskname, int mode, const void* argp)
|
||||||
|
enum cluster_type_e cluster_stack = get_cluster_type();
|
||||||
|
|
||||||
|
crm_system_name = strdup("sbd:cluster");
|
||||||
|
- cl_log(LOG_INFO, "Monitoring %s cluster health", name_for_cluster_type(cluster_stack));
|
||||||
|
+ cl_log(LOG_NOTICE, "Monitoring %s cluster health", name_for_cluster_type(cluster_stack));
|
||||||
|
set_proc_title("sbd: watcher: Cluster");
|
||||||
|
|
||||||
|
sbd_membership_connect();
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index f22c4f2..0ce6478 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -893,7 +893,7 @@ notify_parent(void)
|
||||||
|
case pcmk_health_pending:
|
||||||
|
case pcmk_health_shutdown:
|
||||||
|
case pcmk_health_transient:
|
||||||
|
- DBGLOG(LOG_INFO, "Not notifying parent: state transient (%d)", servant_health);
|
||||||
|
+ DBGLOG(LOG_DEBUG, "Not notifying parent: state transient (%d)", servant_health);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pcmk_health_unknown:
|
||||||
|
@@ -904,7 +904,7 @@ notify_parent(void)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pcmk_health_online:
|
||||||
|
- DBGLOG(LOG_INFO, "Notifying parent: healthy");
|
||||||
|
+ DBGLOG(LOG_DEBUG, "Notifying parent: healthy");
|
||||||
|
sigqueue(ppid, SIG_LIVENESS, signal_value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
diff --git a/src/sbd-inquisitor.c b/src/sbd-inquisitor.c
|
||||||
|
index 237bf43..90c7d26 100644
|
||||||
|
--- a/src/sbd-inquisitor.c
|
||||||
|
+++ b/src/sbd-inquisitor.c
|
||||||
|
@@ -64,7 +64,7 @@ void recruit_servant(const char *devname, pid_t pid)
|
||||||
|
|
||||||
|
servant_count++;
|
||||||
|
if(sbd_is_disk(newbie)) {
|
||||||
|
- cl_log(LOG_NOTICE, "Monitoring %s", devname);
|
||||||
|
+ cl_log(LOG_INFO, "Monitoring %s", devname);
|
||||||
|
disk_count++;
|
||||||
|
} else {
|
||||||
|
newbie->outdated = 1;
|
||||||
|
@@ -565,7 +565,7 @@ void inquisitor_child(void)
|
||||||
|
if(cluster_alive(true)) {
|
||||||
|
/* We LIVE! */
|
||||||
|
if(cluster_appeared == false) {
|
||||||
|
- cl_log(LOG_NOTICE, "Active cluster detected");
|
||||||
|
+ cl_log(LOG_INFO, "Active cluster detected");
|
||||||
|
}
|
||||||
|
tickle = 1;
|
||||||
|
can_detach = 1;
|
||||||
|
@@ -574,7 +574,7 @@ void inquisitor_child(void)
|
||||||
|
} else if(cluster_alive(false)) {
|
||||||
|
if(!decoupled) {
|
||||||
|
/* On the way up, detach and arm the watchdog */
|
||||||
|
- cl_log(LOG_NOTICE, "Partial cluster detected, detaching");
|
||||||
|
+ cl_log(LOG_INFO, "Partial cluster detected, detaching");
|
||||||
|
}
|
||||||
|
|
||||||
|
can_detach = 1;
|
||||||
|
diff --git a/src/sbd-md.c b/src/sbd-md.c
|
||||||
|
index 6a964dd..6f152c4 100644
|
||||||
|
--- a/src/sbd-md.c
|
||||||
|
+++ b/src/sbd-md.c
|
||||||
|
@@ -1097,7 +1097,7 @@ int servant(const char *diskname, int mode, const void* argp)
|
||||||
|
exit(EXIT_MD_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- DBGLOG(LOG_INFO, "Monitoring slot %d on disk %s", mbox, diskname);
|
||||||
|
+ cl_log(LOG_NOTICE, "Monitoring slot %d on disk %s", mbox, diskname);
|
||||||
|
if (s_header->minor_version == 0) {
|
||||||
|
set_proc_title("sbd: watcher: %s - slot: %d", diskname, mbox);
|
||||||
|
} else {
|
||||||
|
@@ -1180,7 +1180,7 @@ int servant(const char *diskname, int mode, const void* argp)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_mbox->cmd > 0) {
|
||||||
|
- cl_log(LOG_INFO,
|
||||||
|
+ cl_log(LOG_NOTICE,
|
||||||
|
"Received command %s from %s on disk %s",
|
||||||
|
char2cmd(s_mbox->cmd), s_mbox->from, diskname);
|
||||||
|
|
||||||
|
@@ -1222,7 +1222,7 @@ int servant(const char *diskname, int mode, const void* argp)
|
||||||
|
(int)latency, (int)timeout_watchdog_warn,
|
||||||
|
diskname);
|
||||||
|
} else if (debug) {
|
||||||
|
- DBGLOG(LOG_INFO, "Latency: %d on disk %s", (int)latency,
|
||||||
|
+ DBGLOG(LOG_DEBUG, "Latency: %d on disk %s", (int)latency,
|
||||||
|
diskname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index 2f06109..a435d01 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -416,7 +416,7 @@ servant_pcmk(const char *diskname, int mode, const void* argp)
|
||||||
|
int exit_code = 0;
|
||||||
|
|
||||||
|
crm_system_name = strdup("sbd:pcmk");
|
||||||
|
- cl_log(LOG_INFO, "Monitoring Pacemaker health");
|
||||||
|
+ cl_log(LOG_NOTICE, "Monitoring Pacemaker health");
|
||||||
|
set_proc_title("sbd: watcher: Pacemaker");
|
||||||
|
setenv("PCMK_watchdog", "true", 1);
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,54 @@
|
|||||||
|
From 13295dec0f567d6795522241fff6817a68b02033 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Wed, 2 May 2018 20:07:12 +0200
|
||||||
|
Subject: [PATCH] Refactor: sbd-cluster: let scan do the job of proc-parsing
|
||||||
|
|
||||||
|
Now it would as well parse names containing spaces properly.
|
||||||
|
---
|
||||||
|
src/sbd-cluster.c | 9 ++++-----
|
||||||
|
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-cluster.c b/src/sbd-cluster.c
|
||||||
|
index 8512f23..f5e9ff0 100644
|
||||||
|
--- a/src/sbd-cluster.c
|
||||||
|
+++ b/src/sbd-cluster.c
|
||||||
|
@@ -338,7 +338,7 @@ sbd_membership_destroy(gpointer user_data)
|
||||||
|
* \brief Get process ID and name associated with a /proc directory entry
|
||||||
|
*
|
||||||
|
* \param[in] entry Directory entry (must be result of readdir() on /proc)
|
||||||
|
- * \param[out] name If not NULL, a char[64] to hold the process name
|
||||||
|
+ * \param[out] name If not NULL, a char[16] to hold the process name
|
||||||
|
* \param[out] pid If not NULL, will be set to process ID of entry
|
||||||
|
*
|
||||||
|
* \return 0 on success, -1 if entry is not for a process or info not found
|
||||||
|
@@ -353,7 +353,7 @@ sbd_procfs_process_info(struct dirent *entry, char *name, int *pid)
|
||||||
|
int fd, local_pid;
|
||||||
|
FILE *file;
|
||||||
|
struct stat statbuf;
|
||||||
|
- char key[16] = { 0 }, procpath[128] = { 0 };
|
||||||
|
+ char procpath[128] = { 0 };
|
||||||
|
|
||||||
|
/* We're only interested in entries whose name is a PID,
|
||||||
|
* so skip anything non-numeric or that is too long.
|
||||||
|
@@ -396,8 +396,7 @@ sbd_procfs_process_info(struct dirent *entry, char *name, int *pid)
|
||||||
|
if (!file) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- if ((fscanf(file, "%15s%63s", key, name) != 2)
|
||||||
|
- || safe_str_neq(key, "Name:")) {
|
||||||
|
+ if (fscanf(file, "Name:\t%15[a-zA-Z0-9 _-]", name) != 1) {
|
||||||
|
fclose(file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -484,7 +483,7 @@ static long unsigned int
|
||||||
|
find_pacemaker_remote(void)
|
||||||
|
{
|
||||||
|
DIR *dp;
|
||||||
|
- char entry_name[64];
|
||||||
|
+ char entry_name[16];
|
||||||
|
struct dirent *entry;
|
||||||
|
|
||||||
|
dp = opendir("/proc");
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,61 @@
|
|||||||
|
From a6acd38756fc7f93afcf5c08b8cdf139a3e354e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Wed, 2 May 2018 13:30:42 +0200
|
||||||
|
Subject: [PATCH] Fix: sbd-cluster: search for pacemaker-remoted with
|
||||||
|
pcmk-2.0.0rc3
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd-cluster.c | 16 ++++++++++------
|
||||||
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-cluster.c b/src/sbd-cluster.c
|
||||||
|
index ae4750e..8512f23 100644
|
||||||
|
--- a/src/sbd-cluster.c
|
||||||
|
+++ b/src/sbd-cluster.c
|
||||||
|
@@ -42,6 +42,13 @@
|
||||||
|
//undef SUPPORT_PLUGIN
|
||||||
|
//define SUPPORT_PLUGIN 1
|
||||||
|
|
||||||
|
+/* binary for pacemaker-remote has changed with pacemaker 2 */
|
||||||
|
+#ifdef CRM_SCORE_INFINITY
|
||||||
|
+#define PACEMAKER_REMOTE_BINARY "pacemaker-remoted"
|
||||||
|
+#else
|
||||||
|
+#define PACEMAKER_REMOTE_BINARY "pacemaker_remoted"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static bool remote_node = false;
|
||||||
|
static pid_t remoted_pid = 0;
|
||||||
|
static int reconnect_msec = 1000;
|
||||||
|
@@ -435,7 +442,7 @@ sbd_remote_check(gpointer user_data)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int rc = 0;
|
||||||
|
- char proc_path[PATH_MAX], exe_path[PATH_MAX], expected_path[PATH_MAX];
|
||||||
|
+ char proc_path[PATH_MAX], exe_path[PATH_MAX];
|
||||||
|
|
||||||
|
/* check to make sure pid hasn't been reused by another process */
|
||||||
|
snprintf(proc_path, sizeof(proc_path), "/proc/%lu/exe", (long unsigned int)remoted_pid);
|
||||||
|
@@ -447,10 +454,7 @@ sbd_remote_check(gpointer user_data)
|
||||||
|
}
|
||||||
|
exe_path[rc] = 0;
|
||||||
|
|
||||||
|
- rc = snprintf(expected_path, sizeof(proc_path), "%s/pacemaker_remoted", SBINDIR);
|
||||||
|
- expected_path[rc] = 0;
|
||||||
|
-
|
||||||
|
- if (strcmp(exe_path, expected_path) == 0) {
|
||||||
|
+ if (strcmp(exe_path, SBINDIR "/" PACEMAKER_REMOTE_BINARY) == 0) {
|
||||||
|
cl_log(LOG_DEBUG, "Process %s (%ld) is active",
|
||||||
|
exe_path, (long)remoted_pid);
|
||||||
|
running = 1;
|
||||||
|
@@ -499,7 +503,7 @@ find_pacemaker_remote(void)
|
||||||
|
|
||||||
|
/* entry_name is truncated to 16 characters including the nul terminator */
|
||||||
|
cl_log(LOG_DEBUG, "Found %s at %u", entry_name, pid);
|
||||||
|
- if (strcmp(entry_name, "pacemaker_remot") == 0) {
|
||||||
|
+ if (strncmp(entry_name, PACEMAKER_REMOTE_BINARY, 15) == 0) {
|
||||||
|
cl_log(LOG_NOTICE, "Found Pacemaker Remote at PID %u", pid);
|
||||||
|
remoted_pid = pid;
|
||||||
|
remote_node = true;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
From 5d52fa8c3c903df4be0e4e954fbca9b3b15285c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Fri, 14 Sep 2018 17:51:50 +0200
|
||||||
|
Subject: [PATCH] Fix: sbd-common: don't follow symlinks outside /dev for
|
||||||
|
watchdog
|
||||||
|
|
||||||
|
This makes it easier to define a SELinux-policy that keeps
|
||||||
|
avc-log clean on /dev traversal triggered by query-watchdog.
|
||||||
|
---
|
||||||
|
src/sbd-common.c | 42 ++++++++++++++++++++++++++++++++++++++----
|
||||||
|
1 file changed, 38 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index 0ce6478..fcb7a31 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -251,7 +251,8 @@ watchdog_close(bool disarm)
|
||||||
|
#define MAX_WATCHDOGS 64
|
||||||
|
#define SYS_CLASS_WATCHDOG "/sys/class/watchdog"
|
||||||
|
#define SYS_CHAR_DEV_DIR "/sys/dev/char"
|
||||||
|
-#define WATCHDOG_NODEDIR "/dev"
|
||||||
|
+#define WATCHDOG_NODEDIR "/dev/"
|
||||||
|
+#define WATCHDOG_NODEDIR_LEN 5
|
||||||
|
|
||||||
|
struct watchdog_list_item {
|
||||||
|
dev_t dev;
|
||||||
|
@@ -273,7 +274,7 @@ watchdog_populate_list(void)
|
||||||
|
struct dirent *entry;
|
||||||
|
char entry_name[280];
|
||||||
|
DIR *dp;
|
||||||
|
- char buf[256] = "";
|
||||||
|
+ char buf[280] = "";
|
||||||
|
|
||||||
|
if (watchdog_list != NULL) {
|
||||||
|
return;
|
||||||
|
@@ -313,7 +314,38 @@ watchdog_populate_list(void)
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
- WATCHDOG_NODEDIR "/%s", entry->d_name);
|
||||||
|
+ WATCHDOG_NODEDIR "%s", entry->d_name);
|
||||||
|
+ if (entry->d_type == DT_LNK) {
|
||||||
|
+ int len;
|
||||||
|
+
|
||||||
|
+ /* !realpath(entry_name, buf) unfortunately does a stat on
|
||||||
|
+ * target so we can't really use it to check if links stay
|
||||||
|
+ * within /dev without triggering e.g. AVC-logs (with
|
||||||
|
+ * SELinux policy that just allows stat within /dev).
|
||||||
|
+ * Without canonicalization that doesn't actually touch the
|
||||||
|
+ * filesystem easily available introduce some limitations
|
||||||
|
+ * for simplicity:
|
||||||
|
+ * - just simple path without '..'
|
||||||
|
+ * - just one level of symlinks (avoid e.g. loop-checking)
|
||||||
|
+ */
|
||||||
|
+ len = readlink(entry_name, buf, sizeof(buf) - 1);
|
||||||
|
+ if ((len < 1) ||
|
||||||
|
+ (len > sizeof(buf) - WATCHDOG_NODEDIR_LEN - 1)) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ buf[len] = '\0';
|
||||||
|
+ if (buf[0] != '/') {
|
||||||
|
+ memmove(&buf[WATCHDOG_NODEDIR_LEN], buf, len+1);
|
||||||
|
+ memcpy(buf, WATCHDOG_NODEDIR, WATCHDOG_NODEDIR_LEN);
|
||||||
|
+ len += WATCHDOG_NODEDIR_LEN;
|
||||||
|
+ }
|
||||||
|
+ if (strstr(buf, "/../") ||
|
||||||
|
+ strncmp(WATCHDOG_NODEDIR, buf, WATCHDOG_NODEDIR_LEN) ||
|
||||||
|
+ lstat(buf, &statbuf) ||
|
||||||
|
+ !S_ISCHR(statbuf.st_mode)) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
if(!stat(entry_name, &statbuf) && S_ISCHR(statbuf.st_mode)) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
@@ -322,6 +354,7 @@ watchdog_populate_list(void)
|
||||||
|
int wdfd = watchdog_init_fd(entry_name, -1);
|
||||||
|
struct watchdog_list_item *wdg =
|
||||||
|
calloc(1, sizeof(struct watchdog_list_item));
|
||||||
|
+ int len;
|
||||||
|
|
||||||
|
wdg->dev = watchdogs[i];
|
||||||
|
wdg->dev_node = strdup(entry_name);
|
||||||
|
@@ -343,7 +376,8 @@ watchdog_populate_list(void)
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
SYS_CHAR_DEV_DIR "/%d:%d/device/driver",
|
||||||
|
major(watchdogs[i]), minor(watchdogs[i]));
|
||||||
|
- if (readlink(entry_name, buf, sizeof(buf)) > 0) {
|
||||||
|
+ if ((len = readlink(entry_name, buf, sizeof(buf) - 1)) > 0) {
|
||||||
|
+ buf[len] = '\0';
|
||||||
|
wdg->dev_driver = strdup(basename(buf));
|
||||||
|
} else if ((wdg->dev_ident) &&
|
||||||
|
(strcmp(wdg->dev_ident,
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,33 @@
|
|||||||
|
From e13297f45b4c5868800b1d3fc359bfd0723fcc5f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Mon, 17 Sep 2018 23:13:37 +0200
|
||||||
|
Subject: [PATCH] Refactor: sbd-common: separate assignment and comparison
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd-common.c | 7 ++++---
|
||||||
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index fcb7a31..679f946 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -376,12 +376,13 @@ watchdog_populate_list(void)
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
SYS_CHAR_DEV_DIR "/%d:%d/device/driver",
|
||||||
|
major(watchdogs[i]), minor(watchdogs[i]));
|
||||||
|
- if ((len = readlink(entry_name, buf, sizeof(buf) - 1)) > 0) {
|
||||||
|
+ len = readlink(entry_name, buf, sizeof(buf) - 1);
|
||||||
|
+ if (len > 0) {
|
||||||
|
buf[len] = '\0';
|
||||||
|
wdg->dev_driver = strdup(basename(buf));
|
||||||
|
} else if ((wdg->dev_ident) &&
|
||||||
|
- (strcmp(wdg->dev_ident,
|
||||||
|
- "Software Watchdog") == 0)) {
|
||||||
|
+ (strcmp(wdg->dev_ident,
|
||||||
|
+ "Software Watchdog") == 0)) {
|
||||||
|
wdg->dev_driver = strdup("softdog");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
214
SOURCES/0014-Fix-sbd-common-avoid-statting-potential-links.patch
Normal file
214
SOURCES/0014-Fix-sbd-common-avoid-statting-potential-links.patch
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
From 5b4c866f7c0b4ef8061e131a1ee0d1c608d35054 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Wed, 19 Sep 2018 16:15:27 +0200
|
||||||
|
Subject: [PATCH] Fix: sbd-common: avoid statting potential links
|
||||||
|
|
||||||
|
These potential links might be anything and statting - if just
|
||||||
|
allowed to stat chr-nodes (e.g. SELinux) - them would lead
|
||||||
|
to avc-logs in the SELinux case.
|
||||||
|
---
|
||||||
|
src/sbd-common.c | 133 +++++++++++++++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 96 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index 679f946..cc84cd0 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -262,6 +262,12 @@ struct watchdog_list_item {
|
||||||
|
struct watchdog_list_item *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct link_list_item {
|
||||||
|
+ char *dev_node;
|
||||||
|
+ char *link_name;
|
||||||
|
+ struct link_list_item *next;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct watchdog_list_item *watchdog_list = NULL;
|
||||||
|
static int watchdog_list_items = 0;
|
||||||
|
|
||||||
|
@@ -275,6 +281,7 @@ watchdog_populate_list(void)
|
||||||
|
char entry_name[280];
|
||||||
|
DIR *dp;
|
||||||
|
char buf[280] = "";
|
||||||
|
+ struct link_list_item *link_list = NULL;
|
||||||
|
|
||||||
|
if (watchdog_list != NULL) {
|
||||||
|
return;
|
||||||
|
@@ -288,7 +295,7 @@ watchdog_populate_list(void)
|
||||||
|
FILE *file;
|
||||||
|
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
- SYS_CLASS_WATCHDOG "/%s/dev", entry->d_name);
|
||||||
|
+ SYS_CLASS_WATCHDOG "/%s/dev", entry->d_name);
|
||||||
|
file = fopen(entry_name, "r");
|
||||||
|
if (file) {
|
||||||
|
int major, minor;
|
||||||
|
@@ -309,43 +316,59 @@ watchdog_populate_list(void)
|
||||||
|
/* search for watchdog nodes in /dev */
|
||||||
|
dp = opendir(WATCHDOG_NODEDIR);
|
||||||
|
if (dp) {
|
||||||
|
+ /* first go for links and memorize them */
|
||||||
|
while ((entry = readdir(dp))) {
|
||||||
|
- if ((entry->d_type == DT_CHR) || (entry->d_type == DT_LNK)) {
|
||||||
|
- struct stat statbuf;
|
||||||
|
+ if (entry->d_type == DT_LNK) {
|
||||||
|
+ int len;
|
||||||
|
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
- WATCHDOG_NODEDIR "%s", entry->d_name);
|
||||||
|
- if (entry->d_type == DT_LNK) {
|
||||||
|
- int len;
|
||||||
|
-
|
||||||
|
- /* !realpath(entry_name, buf) unfortunately does a stat on
|
||||||
|
- * target so we can't really use it to check if links stay
|
||||||
|
- * within /dev without triggering e.g. AVC-logs (with
|
||||||
|
- * SELinux policy that just allows stat within /dev).
|
||||||
|
- * Without canonicalization that doesn't actually touch the
|
||||||
|
- * filesystem easily available introduce some limitations
|
||||||
|
- * for simplicity:
|
||||||
|
- * - just simple path without '..'
|
||||||
|
- * - just one level of symlinks (avoid e.g. loop-checking)
|
||||||
|
- */
|
||||||
|
- len = readlink(entry_name, buf, sizeof(buf) - 1);
|
||||||
|
- if ((len < 1) ||
|
||||||
|
- (len > sizeof(buf) - WATCHDOG_NODEDIR_LEN - 1)) {
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- buf[len] = '\0';
|
||||||
|
- if (buf[0] != '/') {
|
||||||
|
- memmove(&buf[WATCHDOG_NODEDIR_LEN], buf, len+1);
|
||||||
|
- memcpy(buf, WATCHDOG_NODEDIR, WATCHDOG_NODEDIR_LEN);
|
||||||
|
- len += WATCHDOG_NODEDIR_LEN;
|
||||||
|
- }
|
||||||
|
- if (strstr(buf, "/../") ||
|
||||||
|
- strncmp(WATCHDOG_NODEDIR, buf, WATCHDOG_NODEDIR_LEN) ||
|
||||||
|
- lstat(buf, &statbuf) ||
|
||||||
|
- !S_ISCHR(statbuf.st_mode)) {
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
+ WATCHDOG_NODEDIR "%s", entry->d_name);
|
||||||
|
+
|
||||||
|
+ /* !realpath(entry_name, buf) unfortunately does a stat on
|
||||||
|
+ * target so we can't really use it to check if links stay
|
||||||
|
+ * within /dev without triggering e.g. AVC-logs (with
|
||||||
|
+ * SELinux policy that just allows stat within /dev).
|
||||||
|
+ * Without canonicalization that doesn't actually touch the
|
||||||
|
+ * filesystem easily available introduce some limitations
|
||||||
|
+ * for simplicity:
|
||||||
|
+ * - just simple path without '..'
|
||||||
|
+ * - just one level of symlinks (avoid e.g. loop-checking)
|
||||||
|
+ */
|
||||||
|
+ len = readlink(entry_name, buf, sizeof(buf) - 1);
|
||||||
|
+ if ((len < 1) ||
|
||||||
|
+ (len > sizeof(buf) - WATCHDOG_NODEDIR_LEN - 1)) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ buf[len] = '\0';
|
||||||
|
+ if (buf[0] != '/') {
|
||||||
|
+ memmove(&buf[WATCHDOG_NODEDIR_LEN], buf, len+1);
|
||||||
|
+ memcpy(buf, WATCHDOG_NODEDIR, WATCHDOG_NODEDIR_LEN);
|
||||||
|
+ len += WATCHDOG_NODEDIR_LEN;
|
||||||
|
+ }
|
||||||
|
+ if (strstr(buf, "/../") ||
|
||||||
|
+ strncmp(WATCHDOG_NODEDIR, buf, WATCHDOG_NODEDIR_LEN)) {
|
||||||
|
+ continue;
|
||||||
|
+ } else {
|
||||||
|
+ /* just memorize to avoid statting the target - SELinux */
|
||||||
|
+ struct link_list_item *lli =
|
||||||
|
+ calloc(1, sizeof(struct link_list_item));
|
||||||
|
+
|
||||||
|
+ lli->dev_node = strdup(buf);
|
||||||
|
+ lli->link_name = strdup(entry_name);
|
||||||
|
+ lli->next = link_list;
|
||||||
|
+ link_list = lli;
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rewinddir(dp);
|
||||||
|
+
|
||||||
|
+ while ((entry = readdir(dp))) {
|
||||||
|
+ if (entry->d_type == DT_CHR) {
|
||||||
|
+ struct stat statbuf;
|
||||||
|
+
|
||||||
|
+ snprintf(entry_name, sizeof(entry_name),
|
||||||
|
+ WATCHDOG_NODEDIR "%s", entry->d_name);
|
||||||
|
if(!stat(entry_name, &statbuf) && S_ISCHR(statbuf.st_mode)) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
@@ -353,8 +376,9 @@ watchdog_populate_list(void)
|
||||||
|
if (statbuf.st_rdev == watchdogs[i]) {
|
||||||
|
int wdfd = watchdog_init_fd(entry_name, -1);
|
||||||
|
struct watchdog_list_item *wdg =
|
||||||
|
- calloc(1, sizeof(struct watchdog_list_item));
|
||||||
|
+ calloc(1, sizeof(struct watchdog_list_item));
|
||||||
|
int len;
|
||||||
|
+ struct link_list_item *tmp_list = NULL;
|
||||||
|
|
||||||
|
wdg->dev = watchdogs[i];
|
||||||
|
wdg->dev_node = strdup(entry_name);
|
||||||
|
@@ -374,8 +398,8 @@ watchdog_populate_list(void)
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(entry_name, sizeof(entry_name),
|
||||||
|
- SYS_CHAR_DEV_DIR "/%d:%d/device/driver",
|
||||||
|
- major(watchdogs[i]), minor(watchdogs[i]));
|
||||||
|
+ SYS_CHAR_DEV_DIR "/%d:%d/device/driver",
|
||||||
|
+ major(watchdogs[i]), minor(watchdogs[i]));
|
||||||
|
len = readlink(entry_name, buf, sizeof(buf) - 1);
|
||||||
|
if (len > 0) {
|
||||||
|
buf[len] = '\0';
|
||||||
|
@@ -385,14 +409,49 @@ watchdog_populate_list(void)
|
||||||
|
"Software Watchdog") == 0)) {
|
||||||
|
wdg->dev_driver = strdup("softdog");
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* create dupes if we have memorized links
|
||||||
|
+ * to this node
|
||||||
|
+ */
|
||||||
|
+ for (tmp_list = link_list; tmp_list;
|
||||||
|
+ tmp_list = tmp_list->next) {
|
||||||
|
+ if (!strcmp(tmp_list->dev_node,
|
||||||
|
+ wdg->dev_node)) {
|
||||||
|
+ struct watchdog_list_item *dupe_wdg =
|
||||||
|
+ calloc(1, sizeof(struct watchdog_list_item));
|
||||||
|
+
|
||||||
|
+ /* as long as we never purge watchdog_list
|
||||||
|
+ * there is no need to dupe strings
|
||||||
|
+ */
|
||||||
|
+ *dupe_wdg = *wdg;
|
||||||
|
+ dupe_wdg->dev_node = strdup(tmp_list->link_name);
|
||||||
|
+ dupe_wdg->next = watchdog_list;
|
||||||
|
+ watchdog_list = dupe_wdg;
|
||||||
|
+ watchdog_list_items++;
|
||||||
|
+ }
|
||||||
|
+ /* for performance reasons we could remove
|
||||||
|
+ * the link_list entry
|
||||||
|
+ */
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
closedir(dp);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* cleanup link list */
|
||||||
|
+ while (link_list) {
|
||||||
|
+ struct link_list_item *tmp_list = link_list;
|
||||||
|
+
|
||||||
|
+ link_list = link_list->next;
|
||||||
|
+ free(tmp_list->dev_node);
|
||||||
|
+ free(tmp_list->link_name);
|
||||||
|
+ free(tmp_list);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
int watchdog_info(void)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,139 @@
|
|||||||
|
From a34cafa9d69194e3cbfe3af20ceb2d08848c483c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Mon, 19 Nov 2018 20:56:35 +0100
|
||||||
|
Subject: [PATCH] Refactor: use pacemaker's new pe api with
|
||||||
|
constructors/destructors
|
||||||
|
|
||||||
|
For backward compatibility add some compatibility code
|
||||||
|
for if pe_new_working_set isn't available.
|
||||||
|
---
|
||||||
|
configure.ac | 3 +++
|
||||||
|
src/sbd-pacemaker.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++------
|
||||||
|
2 files changed, 57 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 1f328c2..1dc273b 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -76,6 +76,9 @@ dnl pacemaker-2.0 removed support for corosync 1 cluster layer
|
||||||
|
AC_CHECK_DECLS([pcmk_cluster_classic_ais, pcmk_cluster_cman],,,
|
||||||
|
[#include <pacemaker/crm/cluster.h>])
|
||||||
|
|
||||||
|
+dnl check for new pe-API
|
||||||
|
+AC_CHECK_FUNCS(pe_new_working_set)
|
||||||
|
+
|
||||||
|
if test "$missing" = "yes"; then
|
||||||
|
AC_MSG_ERROR([Missing required libraries or functions.])
|
||||||
|
fi
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index a435d01..aac355a 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -58,6 +58,31 @@
|
||||||
|
|
||||||
|
#include "sbd.h"
|
||||||
|
|
||||||
|
+#ifndef HAVE_PE_NEW_WORKING_SET
|
||||||
|
+
|
||||||
|
+#define pe_reset_working_set(data_set) cleanup_calculations(data_set)
|
||||||
|
+
|
||||||
|
+static pe_working_set_t *
|
||||||
|
+pe_new_working_set()
|
||||||
|
+{
|
||||||
|
+ pe_working_set_t *data_set = calloc(1, sizeof(pe_working_set_t));
|
||||||
|
+ if (data_set != NULL) {
|
||||||
|
+ set_working_set_defaults(data_set);
|
||||||
|
+ }
|
||||||
|
+ return data_set;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+pe_free_working_set(pe_working_set_t *data_set)
|
||||||
|
+{
|
||||||
|
+ if (data_set != NULL) {
|
||||||
|
+ pe_reset_working_set(data_set);
|
||||||
|
+ free(data_set);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
extern int disk_count;
|
||||||
|
|
||||||
|
static void clean_up(int rc);
|
||||||
|
@@ -74,6 +99,7 @@ static int cib_connected = 0;
|
||||||
|
|
||||||
|
static cib_t *cib = NULL;
|
||||||
|
static xmlNode *current_cib = NULL;
|
||||||
|
+static pe_working_set_t *data_set = NULL;
|
||||||
|
|
||||||
|
static long last_refresh = 0;
|
||||||
|
|
||||||
|
@@ -361,7 +387,6 @@ static gboolean
|
||||||
|
mon_refresh_state(gpointer user_data)
|
||||||
|
{
|
||||||
|
xmlNode *cib_copy = NULL;
|
||||||
|
- pe_working_set_t data_set;
|
||||||
|
|
||||||
|
if(current_cib == NULL) {
|
||||||
|
return FALSE;
|
||||||
|
@@ -382,14 +407,13 @@ mon_refresh_state(gpointer user_data)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
last_refresh = time(NULL);
|
||||||
|
- set_working_set_defaults(&data_set);
|
||||||
|
- data_set.input = cib_copy;
|
||||||
|
- data_set.flags |= pe_flag_have_stonith_resource;
|
||||||
|
- cluster_status(&data_set);
|
||||||
|
+ data_set->input = cib_copy;
|
||||||
|
+ data_set->flags |= pe_flag_have_stonith_resource;
|
||||||
|
+ cluster_status(data_set);
|
||||||
|
|
||||||
|
- compute_status(&data_set);
|
||||||
|
+ compute_status(data_set);
|
||||||
|
|
||||||
|
- cleanup_calculations(&data_set);
|
||||||
|
+ pe_reset_working_set(data_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
@@ -398,6 +422,21 @@ mon_refresh_state(gpointer user_data)
|
||||||
|
static void
|
||||||
|
clean_up(int rc)
|
||||||
|
{
|
||||||
|
+ if (timer_id_reconnect > 0) {
|
||||||
|
+ g_source_remove(timer_id_reconnect);
|
||||||
|
+ timer_id_reconnect = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (timer_id_notify > 0) {
|
||||||
|
+ g_source_remove(timer_id_notify);
|
||||||
|
+ timer_id_notify = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (data_set != NULL) {
|
||||||
|
+ pe_free_working_set(data_set);
|
||||||
|
+ data_set = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (cib != NULL) {
|
||||||
|
cib->cmds->signoff(cib);
|
||||||
|
cib_delete(cib);
|
||||||
|
@@ -425,6 +464,14 @@ servant_pcmk(const char *diskname, int mode, const void* argp)
|
||||||
|
set_crm_log_level(LOG_CRIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+ if (data_set == NULL) {
|
||||||
|
+ data_set = pe_new_working_set();
|
||||||
|
+ }
|
||||||
|
+ if (data_set == NULL) {
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (current_cib == NULL) {
|
||||||
|
cib = cib_new();
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,294 @@
|
|||||||
|
From b64c30af56e7eabd63ce1db25bc5ed9b953485af Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Fri, 23 Nov 2018 14:09:22 +0100
|
||||||
|
Subject: [PATCH] Feature: make timeout-action executed by sbd configurable
|
||||||
|
|
||||||
|
---
|
||||||
|
man/sbd.8.pod | 19 +++++++++++++++++++
|
||||||
|
src/sbd-common.c | 22 ++++++++++++++++------
|
||||||
|
src/sbd-inquisitor.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---
|
||||||
|
src/sbd-md.c | 2 +-
|
||||||
|
src/sbd.h | 3 +++
|
||||||
|
src/sbd.sysconfig | 18 ++++++++++++++++++
|
||||||
|
6 files changed, 107 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/sbd.8.pod b/man/sbd.8.pod
|
||||||
|
index ffd01c2..dbb3855 100644
|
||||||
|
--- a/man/sbd.8.pod
|
||||||
|
+++ b/man/sbd.8.pod
|
||||||
|
@@ -333,6 +333,23 @@ prevent a successful crashdump from ever being written.
|
||||||
|
|
||||||
|
Defaults to 240 seconds. Set to zero to disable.
|
||||||
|
|
||||||
|
+=item B<-r> I<N>
|
||||||
|
+
|
||||||
|
+Actions to be executed when the watchers don't timely report to the sbd
|
||||||
|
+master process or one of the watchers detects that the master process
|
||||||
|
+has died.
|
||||||
|
+
|
||||||
|
+Set timeout-action to comma-separated combination of
|
||||||
|
+noflush|flush plus reboot|crashdump|off.
|
||||||
|
+If just one of both is given the other stays at the default.
|
||||||
|
+
|
||||||
|
+This doesn't affect actions like off, crashdump, reboot explicitly
|
||||||
|
+triggered via message slots.
|
||||||
|
+And it does as well not configure the action a watchdog would
|
||||||
|
+trigger should it run off (there is no generic interface).
|
||||||
|
+
|
||||||
|
+Defaults to flush,reboot.
|
||||||
|
+
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 allocate
|
||||||
|
@@ -552,6 +569,8 @@ options to pass to the daemon:
|
||||||
|
|
||||||
|
C<sbd> will fail to start if no C<SBD_DEVICE> is specified. See the
|
||||||
|
installed template for more options that can be configured here.
|
||||||
|
+In general configuration done via parameters takes precedence over
|
||||||
|
+the configuration from the configuration file.
|
||||||
|
|
||||||
|
=head2 Testing the sbd installation
|
||||||
|
|
||||||
|
diff --git a/src/sbd-common.c b/src/sbd-common.c
|
||||||
|
index cc84cd0..0e8be65 100644
|
||||||
|
--- a/src/sbd-common.c
|
||||||
|
+++ b/src/sbd-common.c
|
||||||
|
@@ -98,6 +98,8 @@ usage(void)
|
||||||
|
" (default is 1, set to 0 to disable)\n"
|
||||||
|
"-P Check Pacemaker quorum and node health (optional, watch only)\n"
|
||||||
|
"-Z Enable trace mode. WARNING: UNSAFE FOR PRODUCTION!\n"
|
||||||
|
+"-r Set timeout-action to comma-separated combination of\n"
|
||||||
|
+" noflush|flush plus reboot|crashdump|off (default is flush,reboot)\n"
|
||||||
|
"Commands:\n"
|
||||||
|
#if SUPPORT_SHARED_DISK
|
||||||
|
"create initialize N slots on <dev> - OVERWRITES DEVICE!\n"
|
||||||
|
@@ -769,7 +771,7 @@ sysrq_trigger(char t)
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
-do_exit(char kind)
|
||||||
|
+do_exit(char kind, bool do_flush)
|
||||||
|
{
|
||||||
|
/* TODO: Turn debug_mode into a bit field? Delay + kdump for example */
|
||||||
|
const char *reason = NULL;
|
||||||
|
@@ -814,7 +816,9 @@ do_exit(char kind)
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_log(LOG_EMERG, "Rebooting system: %s", reason);
|
||||||
|
- sync();
|
||||||
|
+ if (do_flush) {
|
||||||
|
+ sync();
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if(kind == 'c') {
|
||||||
|
watchdog_close(true);
|
||||||
|
@@ -834,19 +838,25 @@ do_exit(char kind)
|
||||||
|
void
|
||||||
|
do_crashdump(void)
|
||||||
|
{
|
||||||
|
- do_exit('c');
|
||||||
|
+ do_exit('c', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
do_reset(void)
|
||||||
|
{
|
||||||
|
- do_exit('b');
|
||||||
|
+ do_exit('b', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
do_off(void)
|
||||||
|
{
|
||||||
|
- do_exit('o');
|
||||||
|
+ do_exit('o', true);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+do_timeout_action(void)
|
||||||
|
+{
|
||||||
|
+ do_exit(timeout_sysrq_char, do_flush);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -980,7 +990,7 @@ notify_parent(void)
|
||||||
|
/* Our parent died unexpectedly. Triggering
|
||||||
|
* self-fence. */
|
||||||
|
cl_log(LOG_WARNING, "Our parent is dead.");
|
||||||
|
- do_reset();
|
||||||
|
+ do_timeout_action();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (servant_health) {
|
||||||
|
diff --git a/src/sbd-inquisitor.c b/src/sbd-inquisitor.c
|
||||||
|
index 9b193d4..8e0bc87 100644
|
||||||
|
--- a/src/sbd-inquisitor.c
|
||||||
|
+++ b/src/sbd-inquisitor.c
|
||||||
|
@@ -31,6 +31,8 @@ int servant_restart_interval = 5;
|
||||||
|
int servant_restart_count = 1;
|
||||||
|
int start_mode = 0;
|
||||||
|
char* pidfile = NULL;
|
||||||
|
+bool do_flush = true;
|
||||||
|
+char timeout_sysrq_char = 'b';
|
||||||
|
|
||||||
|
int parse_device_line(const char *line);
|
||||||
|
|
||||||
|
@@ -655,7 +657,7 @@ void inquisitor_child(void)
|
||||||
|
/* At level 2 or above, we do nothing, but expect
|
||||||
|
* things to eventually return to
|
||||||
|
* normal. */
|
||||||
|
- do_reset();
|
||||||
|
+ do_timeout_action();
|
||||||
|
} else {
|
||||||
|
cl_log(LOG_ERR, "SBD: DEBUG MODE: Would have fenced due to timeout!");
|
||||||
|
}
|
||||||
|
@@ -668,7 +670,7 @@ void inquisitor_child(void)
|
||||||
|
|
||||||
|
if (debug_mode && watchdog_use) {
|
||||||
|
/* In debug mode, trigger a reset before the watchdog can panic the machine */
|
||||||
|
- do_reset();
|
||||||
|
+ do_timeout_action();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -833,6 +835,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
int qb_facility;
|
||||||
|
const char *value = NULL;
|
||||||
|
int start_delay = 0;
|
||||||
|
+ char *timeout_action = NULL;
|
||||||
|
|
||||||
|
if ((cmdname = strrchr(argv[0], '/')) == NULL) {
|
||||||
|
cmdname = argv[0];
|
||||||
|
@@ -928,7 +931,12 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
}
|
||||||
|
cl_log(LOG_DEBUG, "Start delay: %d (%s)", (int)start_delay, value?value:"default");
|
||||||
|
|
||||||
|
- while ((c = getopt(argc, argv, "czC:DPRTWZhvw:d:n:p:1:2:3:4:5:t:I:F:S:s:")) != -1) {
|
||||||
|
+ value = getenv("SBD_TIMEOUT_ACTION");
|
||||||
|
+ if(value) {
|
||||||
|
+ timeout_action = strdup(value);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while ((c = getopt(argc, argv, "czC:DPRTWZhvw:d:n:p:1:2:3:4:5:t:I:F:S:s:r:")) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'D':
|
||||||
|
break;
|
||||||
|
@@ -1043,6 +1051,12 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
cl_log(LOG_INFO, "Servant restart count set to %d",
|
||||||
|
(int)servant_restart_count);
|
||||||
|
break;
|
||||||
|
+ case 'r':
|
||||||
|
+ if (timeout_action) {
|
||||||
|
+ free(timeout_action);
|
||||||
|
+ }
|
||||||
|
+ timeout_action = strdup(optarg);
|
||||||
|
+ break;
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
return (0);
|
||||||
|
@@ -1101,6 +1115,39 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (timeout_action) {
|
||||||
|
+ char *p[2];
|
||||||
|
+ int i;
|
||||||
|
+ char c;
|
||||||
|
+ int nrflags = sscanf(timeout_action, "%m[a-z],%m[a-z]%c", &p[0], &p[1], &c);
|
||||||
|
+ bool parse_error = (nrflags < 1) || (nrflags > 2);
|
||||||
|
+
|
||||||
|
+ for (i = 0; (i < nrflags) && (i < 2); i++) {
|
||||||
|
+ if (!strcmp(p[i], "reboot")) {
|
||||||
|
+ timeout_sysrq_char = 'b';
|
||||||
|
+ } else if (!strcmp(p[i], "crashdump")) {
|
||||||
|
+ timeout_sysrq_char = 'c';
|
||||||
|
+ } else if (!strcmp(p[i], "off")) {
|
||||||
|
+ timeout_sysrq_char = 'o';
|
||||||
|
+ } else if (!strcmp(p[i], "flush")) {
|
||||||
|
+ do_flush = true;
|
||||||
|
+ } else if (!strcmp(p[i], "noflush")) {
|
||||||
|
+ do_flush = false;
|
||||||
|
+ } else {
|
||||||
|
+ parse_error = true;
|
||||||
|
+ }
|
||||||
|
+ free(p[i]);
|
||||||
|
+ }
|
||||||
|
+ if (parse_error) {
|
||||||
|
+ fprintf(stderr, "Failed to parse timeout-action \"%s\".\n",
|
||||||
|
+ timeout_action);
|
||||||
|
+ exit_status = -1;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ cl_log(LOG_NOTICE, "%s flush + writing \'%c\' to sysrq on timeout",
|
||||||
|
+ do_flush?"Doing":"Skipping", timeout_sysrq_char);
|
||||||
|
+
|
||||||
|
#if SUPPORT_SHARED_DISK
|
||||||
|
if (strcmp(argv[optind], "create") == 0) {
|
||||||
|
exit_status = init_devices(servants_leader);
|
||||||
|
diff --git a/src/sbd-md.c b/src/sbd-md.c
|
||||||
|
index a736118..579d273 100644
|
||||||
|
--- a/src/sbd-md.c
|
||||||
|
+++ b/src/sbd-md.c
|
||||||
|
@@ -1149,7 +1149,7 @@ int servant(const char *diskname, int mode, const void* argp)
|
||||||
|
if (ppid == 1) {
|
||||||
|
/* Our parent died unexpectedly. Triggering
|
||||||
|
* self-fence. */
|
||||||
|
- do_reset();
|
||||||
|
+ do_timeout_action();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These attempts are, by definition, somewhat racy. If
|
||||||
|
diff --git a/src/sbd.h b/src/sbd.h
|
||||||
|
index 0f8847a..386c85c 100644
|
||||||
|
--- a/src/sbd.h
|
||||||
|
+++ b/src/sbd.h
|
||||||
|
@@ -130,6 +130,7 @@ void sysrq_trigger(char t);
|
||||||
|
void do_crashdump(void);
|
||||||
|
void do_reset(void);
|
||||||
|
void do_off(void);
|
||||||
|
+void do_timeout_action(void);
|
||||||
|
pid_t make_daemon(void);
|
||||||
|
void maximize_priority(void);
|
||||||
|
void sbd_get_uname(void);
|
||||||
|
@@ -153,6 +154,8 @@ extern int debug_mode;
|
||||||
|
extern char *watchdogdev;
|
||||||
|
extern bool watchdogdev_is_default;
|
||||||
|
extern char* local_uname;
|
||||||
|
+extern bool do_flush;
|
||||||
|
+extern char timeout_sysrq_char;
|
||||||
|
|
||||||
|
/* Global, non-tunable variables: */
|
||||||
|
extern int sector_size;
|
||||||
|
diff --git a/src/sbd.sysconfig b/src/sbd.sysconfig
|
||||||
|
index c6d7c07..8f38426 100644
|
||||||
|
--- a/src/sbd.sysconfig
|
||||||
|
+++ b/src/sbd.sysconfig
|
||||||
|
@@ -71,6 +71,24 @@ SBD_WATCHDOG_DEV=/dev/watchdog
|
||||||
|
SBD_WATCHDOG_TIMEOUT=5
|
||||||
|
|
||||||
|
## Type: string
|
||||||
|
+## Default: "flush,reboot"
|
||||||
|
+#
|
||||||
|
+# Actions to be executed when the watchers don't timely report to the sbd
|
||||||
|
+# master process or one of the watchers detects that the master process
|
||||||
|
+# has died.
|
||||||
|
+#
|
||||||
|
+# Set timeout-action to comma-separated combination of
|
||||||
|
+# noflush|flush plus reboot|crashdump|off.
|
||||||
|
+# If just one of both is given the other stays at the default.
|
||||||
|
+#
|
||||||
|
+# This doesn't affect actions like off, crashdump, reboot explicitly
|
||||||
|
+# triggered via message slots.
|
||||||
|
+# And it does as well not configure the action a watchdog would
|
||||||
|
+# trigger should it run off (there is no generic interface).
|
||||||
|
+#
|
||||||
|
+SBD_TIMEOUT_ACTION=flush,reboot
|
||||||
|
+
|
||||||
|
+## Type: string
|
||||||
|
## Default: ""
|
||||||
|
#
|
||||||
|
# Additional options for starting sbd
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,302 @@
|
|||||||
|
From a716a8ddd3df615009bcff3bd96dd9ae64cb5f68 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Tue, 19 Mar 2019 21:36:15 +0100
|
||||||
|
Subject: [PATCH] Fix: sbd-pacemaker: make handling of cib-connection loss more
|
||||||
|
robust
|
||||||
|
|
||||||
|
Exit pcmk-servant on graceful pacemaker shutdown and go back
|
||||||
|
to state before pacemaker was detected initially.
|
||||||
|
Purge all cib-traces otherwise and try to reconnect within timeout.
|
||||||
|
---
|
||||||
|
src/sbd-inquisitor.c | 24 ++++++++++++++++++++----
|
||||||
|
src/sbd-md.c | 30 +++++++++++++++---------------
|
||||||
|
src/sbd-pacemaker.c | 38 +++++++++++++++++++++++++++++---------
|
||||||
|
src/sbd.h | 11 +++++++----
|
||||||
|
4 files changed, 71 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-inquisitor.c b/src/sbd-inquisitor.c
|
||||||
|
index 9be6c99..77c6e4f 100644
|
||||||
|
--- a/src/sbd-inquisitor.c
|
||||||
|
+++ b/src/sbd-inquisitor.c
|
||||||
|
@@ -490,19 +490,19 @@ void inquisitor_child(void)
|
||||||
|
if (sbd_is_disk(s)) {
|
||||||
|
if (WIFEXITED(status)) {
|
||||||
|
switch(WEXITSTATUS(status)) {
|
||||||
|
- case EXIT_MD_IO_FAIL:
|
||||||
|
+ case EXIT_MD_SERVANT_IO_FAIL:
|
||||||
|
DBGLOG(LOG_INFO, "Servant for %s requests to be disowned",
|
||||||
|
s->devname);
|
||||||
|
break;
|
||||||
|
- case EXIT_MD_REQUEST_RESET:
|
||||||
|
+ case EXIT_MD_SERVANT_REQUEST_RESET:
|
||||||
|
cl_log(LOG_WARNING, "%s requested a reset", s->devname);
|
||||||
|
do_reset();
|
||||||
|
break;
|
||||||
|
- case EXIT_MD_REQUEST_SHUTOFF:
|
||||||
|
+ case EXIT_MD_SERVANT_REQUEST_SHUTOFF:
|
||||||
|
cl_log(LOG_WARNING, "%s requested a shutoff", s->devname);
|
||||||
|
do_off();
|
||||||
|
break;
|
||||||
|
- case EXIT_MD_REQUEST_CRASHDUMP:
|
||||||
|
+ case EXIT_MD_SERVANT_REQUEST_CRASHDUMP:
|
||||||
|
cl_log(LOG_WARNING, "%s requested a crashdump", s->devname);
|
||||||
|
do_crashdump();
|
||||||
|
break;
|
||||||
|
@@ -510,6 +510,22 @@ void inquisitor_child(void)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ } else if (sbd_is_pcmk(s)) {
|
||||||
|
+ if (WIFEXITED(status)) {
|
||||||
|
+ switch(WEXITSTATUS(status)) {
|
||||||
|
+ case EXIT_PCMK_SERVANT_GRACEFUL_SHUTDOWN:
|
||||||
|
+ DBGLOG(LOG_INFO, "PCMK-Servant has exited gracefully");
|
||||||
|
+ /* revert to state prior to pacemaker-detection */
|
||||||
|
+ s->restarts = 0;
|
||||||
|
+ s->restart_blocked = 0;
|
||||||
|
+ cluster_appeared = 0;
|
||||||
|
+ s->outdated = 1;
|
||||||
|
+ s->t_last.tv_sec = 0;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
cleanup_servant_by_pid(pid);
|
||||||
|
}
|
||||||
|
diff --git a/src/sbd-md.c b/src/sbd-md.c
|
||||||
|
index ba2c34d..c51d381 100644
|
||||||
|
--- a/src/sbd-md.c
|
||||||
|
+++ b/src/sbd-md.c
|
||||||
|
@@ -1061,19 +1061,19 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
|
||||||
|
st = open_device(diskname, LOG_WARNING);
|
||||||
|
if (!st) {
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
s_header = header_get(st);
|
||||||
|
if (!s_header) {
|
||||||
|
cl_log(LOG_ERR, "Not a valid header on %s", diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (servant_check_timeout_inconsistent(s_header) < 0) {
|
||||||
|
cl_log(LOG_ERR, "Timeouts on %s do not match first device",
|
||||||
|
diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_header->minor_version > 0) {
|
||||||
|
@@ -1086,14 +1086,14 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
cl_log(LOG_ERR,
|
||||||
|
"No slot allocated, and automatic allocation failed for disk %s.",
|
||||||
|
diskname);
|
||||||
|
- rc = EXIT_MD_IO_FAIL;
|
||||||
|
+ rc = EXIT_MD_SERVANT_IO_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
s_node = sector_alloc();
|
||||||
|
if (slot_read(st, mbox, s_node) < 0) {
|
||||||
|
cl_log(LOG_ERR, "Unable to read node entry on %s",
|
||||||
|
diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_log(LOG_NOTICE, "Monitoring slot %d on disk %s", mbox, diskname);
|
||||||
|
@@ -1109,7 +1109,7 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
if (mode > 0) {
|
||||||
|
if (mbox_read(st, mbox, s_mbox) < 0) {
|
||||||
|
cl_log(LOG_ERR, "mbox read failed during start-up in servant.");
|
||||||
|
- rc = EXIT_MD_IO_FAIL;
|
||||||
|
+ rc = EXIT_MD_SERVANT_IO_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (s_mbox->cmd != SBD_MSG_EXIT &&
|
||||||
|
@@ -1125,7 +1125,7 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
DBGLOG(LOG_INFO, "First servant start - zeroing inbox");
|
||||||
|
memset(s_mbox, 0, sizeof(*s_mbox));
|
||||||
|
if (mbox_write(st, mbox, s_mbox) < 0) {
|
||||||
|
- rc = EXIT_MD_IO_FAIL;
|
||||||
|
+ rc = EXIT_MD_SERVANT_IO_FAIL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1154,28 +1154,28 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
s_header_retry = header_get(st);
|
||||||
|
if (!s_header_retry) {
|
||||||
|
cl_log(LOG_ERR, "No longer found a valid header on %s", diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
if (memcmp(s_header, s_header_retry, sizeof(*s_header)) != 0) {
|
||||||
|
cl_log(LOG_ERR, "Header on %s changed since start-up!", diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
free(s_header_retry);
|
||||||
|
|
||||||
|
s_node_retry = sector_alloc();
|
||||||
|
if (slot_read(st, mbox, s_node_retry) < 0) {
|
||||||
|
cl_log(LOG_ERR, "slot read failed in servant.");
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
if (memcmp(s_node, s_node_retry, sizeof(*s_node)) != 0) {
|
||||||
|
cl_log(LOG_ERR, "Node entry on %s changed since start-up!", diskname);
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
free(s_node_retry);
|
||||||
|
|
||||||
|
if (mbox_read(st, mbox, s_mbox) < 0) {
|
||||||
|
cl_log(LOG_ERR, "mbox read failed in servant.");
|
||||||
|
- exit(EXIT_MD_IO_FAIL);
|
||||||
|
+ exit(EXIT_MD_SERVANT_IO_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_mbox->cmd > 0) {
|
||||||
|
@@ -1190,14 +1190,14 @@ int servant_md(const char *diskname, int mode, const void* argp)
|
||||||
|
sigqueue(ppid, SIG_TEST, signal_value);
|
||||||
|
break;
|
||||||
|
case SBD_MSG_RESET:
|
||||||
|
- exit(EXIT_MD_REQUEST_RESET);
|
||||||
|
+ exit(EXIT_MD_SERVANT_REQUEST_RESET);
|
||||||
|
case SBD_MSG_OFF:
|
||||||
|
- exit(EXIT_MD_REQUEST_SHUTOFF);
|
||||||
|
+ exit(EXIT_MD_SERVANT_REQUEST_SHUTOFF);
|
||||||
|
case SBD_MSG_EXIT:
|
||||||
|
sigqueue(ppid, SIG_EXITREQ, signal_value);
|
||||||
|
break;
|
||||||
|
case SBD_MSG_CRASHDUMP:
|
||||||
|
- exit(EXIT_MD_REQUEST_CRASHDUMP);
|
||||||
|
+ exit(EXIT_MD_SERVANT_REQUEST_CRASHDUMP);
|
||||||
|
default:
|
||||||
|
/* FIXME:
|
||||||
|
An "unknown" message might result
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index aac355a..c69fc55 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -103,6 +103,9 @@ static pe_working_set_t *data_set = NULL;
|
||||||
|
|
||||||
|
static long last_refresh = 0;
|
||||||
|
|
||||||
|
+static int pcmk_clean_shutdown = 0;
|
||||||
|
+static int pcmk_shutdown = 0;
|
||||||
|
+
|
||||||
|
static gboolean
|
||||||
|
mon_timer_reconnect(gpointer data)
|
||||||
|
{
|
||||||
|
@@ -128,10 +131,26 @@ mon_cib_connection_destroy(gpointer user_data)
|
||||||
|
{
|
||||||
|
if (cib) {
|
||||||
|
cib->cmds->signoff(cib);
|
||||||
|
+ /* retrigger as last one might have been skipped */
|
||||||
|
+ mon_refresh_state(NULL);
|
||||||
|
+ if (pcmk_clean_shutdown) {
|
||||||
|
+ /* assume a graceful pacemaker-shutdown */
|
||||||
|
+ clean_up(EXIT_PCMK_SERVANT_GRACEFUL_SHUTDOWN);
|
||||||
|
+ }
|
||||||
|
+ /* getting here we aren't sure about the pacemaker-state
|
||||||
|
+ so try to use the timeout to reconnect and get
|
||||||
|
+ everything sorted out again
|
||||||
|
+ */
|
||||||
|
+ pcmk_shutdown = 0;
|
||||||
|
set_servant_health(pcmk_health_transient, LOG_WARNING, "Disconnected from CIB");
|
||||||
|
timer_id_reconnect = g_timeout_add(reconnect_msec, mon_timer_reconnect, NULL);
|
||||||
|
}
|
||||||
|
cib_connected = 0;
|
||||||
|
+ /* no sense in looking into outdated cib, trying to apply patch, ... */
|
||||||
|
+ if (current_cib) {
|
||||||
|
+ free_xml(current_cib);
|
||||||
|
+ current_cib = NULL;
|
||||||
|
+ }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -171,7 +190,7 @@ static gboolean
|
||||||
|
mon_timer_notify(gpointer data)
|
||||||
|
{
|
||||||
|
static int counter = 0;
|
||||||
|
- int counter_max = timeout_watchdog / timeout_loop;
|
||||||
|
+ int counter_max = timeout_watchdog / timeout_loop / 2;
|
||||||
|
|
||||||
|
if (timer_id_notify > 0) {
|
||||||
|
g_source_remove(timer_id_notify);
|
||||||
|
@@ -280,11 +299,6 @@ compute_status(pe_working_set_t * data_set)
|
||||||
|
} else if (node->details->pending) {
|
||||||
|
set_servant_health(pcmk_health_pending, LOG_WARNING, "Node state: pending");
|
||||||
|
|
||||||
|
-#if 0
|
||||||
|
- } else if (node->details->shutdown) {
|
||||||
|
- set_servant_health(pcmk_health_shutdown, LOG_WARNING, "Node state: shutting down");
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
} else if (data_set->flags & pe_flag_have_quorum) {
|
||||||
|
set_servant_health(pcmk_health_online, LOG_INFO, "Node state: online");
|
||||||
|
ever_had_quorum = TRUE;
|
||||||
|
@@ -315,6 +329,12 @@ compute_status(pe_working_set_t * data_set)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (node->details->shutdown) {
|
||||||
|
+ pcmk_shutdown = 1;
|
||||||
|
+ }
|
||||||
|
+ if (pcmk_shutdown && !(node->details->running_rsc)) {
|
||||||
|
+ pcmk_clean_shutdown = 1;
|
||||||
|
+ }
|
||||||
|
notify_parent();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -339,7 +359,7 @@ crm_diff_update(const char *event, xmlNode * msg)
|
||||||
|
static mainloop_timer_t *refresh_timer = NULL;
|
||||||
|
|
||||||
|
if(refresh_timer == NULL) {
|
||||||
|
- refresh_timer = mainloop_timer_add("refresh", 2000, FALSE, mon_trigger_refresh, NULL);
|
||||||
|
+ refresh_timer = mainloop_timer_add("refresh", reconnect_msec, FALSE, mon_trigger_refresh, NULL);
|
||||||
|
refresh_trigger = mainloop_add_trigger(G_PRIORITY_LOW, mon_refresh_state, refresh_timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -369,9 +389,9 @@ crm_diff_update(const char *event, xmlNode * msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Refresh
|
||||||
|
- * - immediately if the last update was more than 5s ago
|
||||||
|
+ * - immediately if the last update was more than 1s ago
|
||||||
|
* - every 10 updates
|
||||||
|
- * - at most 2s after the last update
|
||||||
|
+ * - at most 1s after the last update
|
||||||
|
*/
|
||||||
|
if (updates > 10 || (now - last_refresh) > (reconnect_msec / 1000)) {
|
||||||
|
mon_refresh_state(refresh_timer);
|
||||||
|
diff --git a/src/sbd.h b/src/sbd.h
|
||||||
|
index 6fe07f9..3b05a11 100644
|
||||||
|
--- a/src/sbd.h
|
||||||
|
+++ b/src/sbd.h
|
||||||
|
@@ -54,10 +54,13 @@
|
||||||
|
/* FIXME: should add dynamic check of SIG_XX >= SIGRTMAX */
|
||||||
|
|
||||||
|
/* exit status for disk-servant */
|
||||||
|
-#define EXIT_MD_IO_FAIL 20
|
||||||
|
-#define EXIT_MD_REQUEST_RESET 21
|
||||||
|
-#define EXIT_MD_REQUEST_SHUTOFF 22
|
||||||
|
-#define EXIT_MD_REQUEST_CRASHDUMP 23
|
||||||
|
+#define EXIT_MD_SERVANT_IO_FAIL 20
|
||||||
|
+#define EXIT_MD_SERVANT_REQUEST_RESET 21
|
||||||
|
+#define EXIT_MD_SERVANT_REQUEST_SHUTOFF 22
|
||||||
|
+#define EXIT_MD_SERVANT_REQUEST_CRASHDUMP 23
|
||||||
|
+
|
||||||
|
+/* exit status for pcmk-servant */
|
||||||
|
+#define EXIT_PCMK_SERVANT_GRACEFUL_SHUTDOWN 30
|
||||||
|
|
||||||
|
#define HOG_CHAR 0xff
|
||||||
|
#define SECTOR_NAME_MAX 63
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
From 79b778debfee5b4ab2d099b2bfc7385f45597f70 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Tue, 26 Mar 2019 11:17:45 +0100
|
||||||
|
Subject: [PATCH] Fix: sbd-pacemaker: bail out of status earlier
|
||||||
|
|
||||||
|
Prevents possible subsequent null-pointer access and avoids
|
||||||
|
unnecessary search for node.
|
||||||
|
---
|
||||||
|
src/sbd-pacemaker.c | 10 +++++++---
|
||||||
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index c69fc55..9a8b95f 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -276,7 +276,7 @@ compute_status(pe_working_set_t * data_set)
|
||||||
|
static int updates = 0;
|
||||||
|
static int ever_had_quorum = FALSE;
|
||||||
|
|
||||||
|
- node_t *node = pe_find_node(data_set->nodes, local_uname);
|
||||||
|
+ node_t *node = NULL;
|
||||||
|
|
||||||
|
updates++;
|
||||||
|
|
||||||
|
@@ -286,11 +286,15 @@ compute_status(pe_working_set_t * data_set)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ node = pe_find_node(data_set->nodes, local_uname);
|
||||||
|
|
||||||
|
- if (node == NULL) {
|
||||||
|
+ if ((node == NULL) || (node->details == NULL)) {
|
||||||
|
set_servant_health(pcmk_health_unknown, LOG_WARNING, "Node state: %s is UNKNOWN", local_uname);
|
||||||
|
+ notify_parent();
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- } else if (node->details->online == FALSE) {
|
||||||
|
+ if (node->details->online == FALSE) {
|
||||||
|
set_servant_health(pcmk_health_unknown, LOG_WARNING, "Node state: OFFLINE");
|
||||||
|
|
||||||
|
} else if (node->details->unclean) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
From 824fe834c67fb7bae7feb87607381f9fa8fa2945 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Fri, 7 Jun 2019 19:09:06 +0200
|
||||||
|
Subject: [PATCH] Fix: sbd-pacemaker: assume graceful exit if leftovers are
|
||||||
|
unmanged
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd-pacemaker.c | 32 +++++++++++++++++++++++++++++++-
|
||||||
|
1 file changed, 31 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index 9a8b95f..2b35ff6 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -333,11 +333,41 @@ compute_status(pe_working_set_t * data_set)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* If we are in shutdown-state once this will go on till the end.
|
||||||
|
+ * If we've on top reached a state of 0 locally running resources
|
||||||
|
+ * we can assume a clean shutdown.
|
||||||
|
+ * Tricky are the situations where the node is in maintenance-mode
|
||||||
|
+ * or resources are unmanaged. So if the node is in maintenance or
|
||||||
|
+ * all left-over running resources are unmanaged we assume intention.
|
||||||
|
+ */
|
||||||
|
if (node->details->shutdown) {
|
||||||
|
pcmk_shutdown = 1;
|
||||||
|
}
|
||||||
|
- if (pcmk_shutdown && !(node->details->running_rsc)) {
|
||||||
|
+ if (pcmk_shutdown)
|
||||||
|
+ {
|
||||||
|
pcmk_clean_shutdown = 1;
|
||||||
|
+ if (!(node->details->maintenance)) {
|
||||||
|
+ GListPtr iter;
|
||||||
|
+
|
||||||
|
+ for (iter = node->details->running_rsc;
|
||||||
|
+ iter != NULL; iter = iter->next) {
|
||||||
|
+ resource_t *rsc = (resource_t *) iter->data;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ if (is_set(rsc->flags, pe_rsc_managed)) {
|
||||||
|
+ pcmk_clean_shutdown = 0;
|
||||||
|
+ crm_debug("not clean as %s managed and still running",
|
||||||
|
+ rsc->id);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (pcmk_clean_shutdown) {
|
||||||
|
+ crm_debug("pcmk_clean_shutdown because "
|
||||||
|
+ "all managed resources down");
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ crm_debug("pcmk_clean_shutdown because node is in maintenance");
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
notify_parent();
|
||||||
|
return;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -0,0 +1,54 @@
|
|||||||
|
From c8e3de2a7e98550ea9f27a0c59e13013ce02992d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Fri, 16 Aug 2019 12:07:32 +0200
|
||||||
|
Subject: [PATCH] Fix: sbd-pacemaker: check for shutdown attribute on every
|
||||||
|
cib-diff
|
||||||
|
|
||||||
|
---
|
||||||
|
src/sbd-pacemaker.c | 22 +++++++++++++++++++++-
|
||||||
|
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/sbd-pacemaker.c b/src/sbd-pacemaker.c
|
||||||
|
index 2b35ff6..1217acf 100644
|
||||||
|
--- a/src/sbd-pacemaker.c
|
||||||
|
+++ b/src/sbd-pacemaker.c
|
||||||
|
@@ -383,6 +383,24 @@ mon_trigger_refresh(gpointer user_data)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define XPATH_SHUTDOWN "//" XML_CIB_TAG_STATE "[@uname='%s']/" \
|
||||||
|
+ XML_TAG_TRANSIENT_NODEATTRS "/" XML_TAG_ATTR_SETS "/" \
|
||||||
|
+ XML_CIB_TAG_NVPAIR "[@name='" XML_CIB_ATTR_SHUTDOWN "']"
|
||||||
|
+
|
||||||
|
+static gboolean
|
||||||
|
+shutdown_attr_in_cib(void)
|
||||||
|
+{
|
||||||
|
+ xmlNode *match = NULL;
|
||||||
|
+ char *xpath_string;
|
||||||
|
+
|
||||||
|
+ xpath_string = crm_strdup_printf(XPATH_SHUTDOWN, local_uname);
|
||||||
|
+ if (xpath_string) {
|
||||||
|
+ match = get_xpath_object(xpath_string, current_cib, LOG_TRACE);
|
||||||
|
+ free(xpath_string);
|
||||||
|
+ }
|
||||||
|
+ return (match != NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
crm_diff_update(const char *event, xmlNode * msg)
|
||||||
|
{
|
||||||
|
@@ -426,8 +444,10 @@ crm_diff_update(const char *event, xmlNode * msg)
|
||||||
|
* - immediately if the last update was more than 1s ago
|
||||||
|
* - every 10 updates
|
||||||
|
* - at most 1s after the last update
|
||||||
|
+ * - shutdown attribute for our node set for the first time
|
||||||
|
*/
|
||||||
|
- if (updates > 10 || (now - last_refresh) > (reconnect_msec / 1000)) {
|
||||||
|
+ if ((!pcmk_shutdown && shutdown_attr_in_cib()) ||
|
||||||
|
+ (updates > 10 || (now - last_refresh) > (reconnect_msec / 1000))) {
|
||||||
|
mon_refresh_state(refresh_timer);
|
||||||
|
updates = 0;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
314
SPECS/sbd.spec
Normal file
314
SPECS/sbd.spec
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
#
|
||||||
|
# spec file for package sbd
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
|
# Copyright (c) 2013 Lars Marowsky-Bree
|
||||||
|
#
|
||||||
|
# All modifications and additions to the file contributed by third parties
|
||||||
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
|
# upon. The license for this file, and modifications and additions to the
|
||||||
|
# file, is the same license as for the pristine package itself (unless the
|
||||||
|
# license for the pristine package is not an Open Source License, in which
|
||||||
|
# case the license is the MIT License). An "Open Source License" is a
|
||||||
|
# license that conforms to the Open Source Definition (Version 1.9)
|
||||||
|
# published by the Open Source Initiative.
|
||||||
|
|
||||||
|
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
||||||
|
#
|
||||||
|
%global commit a74b4d25a3eb93fe1abbe6e3ebfd2b16cf48873f
|
||||||
|
%global shortcommit %(c=%{commit}; echo ${c:0:7})
|
||||||
|
%global github_owner Clusterlabs
|
||||||
|
%global buildnum 18
|
||||||
|
|
||||||
|
Name: sbd
|
||||||
|
Summary: Storage-based death
|
||||||
|
License: GPLv2+
|
||||||
|
Group: System Environment/Daemons
|
||||||
|
Version: 1.3.1
|
||||||
|
Release: %{buildnum}%{?dist}.3
|
||||||
|
Url: https://github.com/%{github_owner}/%{name}
|
||||||
|
Source0: https://github.com/%{github_owner}/%{name}/archive/%{commit}/%{name}-%{commit}.tar.gz
|
||||||
|
Patch0: 0001-make-pacemaker-dlm-wait-for-sbd-start.patch
|
||||||
|
Patch1: 0002-mention-timeout-caveat-with-SBD_DELAY_START.patch
|
||||||
|
Patch2: 0003-Doc-sbd.8.pod-add-query-test-watchdog.patch
|
||||||
|
Patch3: 0004-Build-sbd-pacemaker-Query-CIB-directly-with-the-API.patch
|
||||||
|
Patch4: 0005-Fix-build-error-with-glibc-2.25.patch
|
||||||
|
Patch5: 0006-Fix-gcc-format-string-error.patch
|
||||||
|
Patch6: 0007-Build-cluster-servant-Compile-with-pacemaker-2.0.patch
|
||||||
|
Patch7: 0008-Log-change-sbd-s-default-logging-level-to-LOG_NOTICE.patch
|
||||||
|
Patch8: 0009-Log-upgrade-important-messages-and-downgrade-unimpor.patch
|
||||||
|
Patch9: 0010-Refactor-sbd-cluster-let-scan-do-the-job-of-proc-par.patch
|
||||||
|
Patch10: 0011-Fix-search-for-pacemaker-remoted-with-pacemaker-2.0.patch
|
||||||
|
Patch11: 0012-Fix-sbd-common-don-t-follow-symlinks-outside-dev-for.patch
|
||||||
|
Patch12: 0013-Refactor-sbd-common-separate-assignment-and-comparis.patch
|
||||||
|
Patch13: 0014-Fix-sbd-common-avoid-statting-potential-links.patch
|
||||||
|
Patch14: 0015-Refactor-use-pacemaker-s-new-pe-api-with-constructor.patch
|
||||||
|
Patch15: 0016-Feature-make-timeout-action-executed-by-sbd-configur.patch
|
||||||
|
Patch16: 0017-Fix-sbd-pacemaker-make-handling-of-cib-connection-lo.patch
|
||||||
|
Patch17: 0018-Fix-sbd-pacemaker-bail-out-of-status-earlier.patch
|
||||||
|
Patch18: 0019-Fix-sbd-pacemaker-assume-graceful-exit-if-leftovers-.patch
|
||||||
|
Patch19: 0020-Fix-sbd-pacemaker-check-for-shutdown-attribute-on-ev.patch
|
||||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
BuildRequires: autoconf
|
||||||
|
BuildRequires: automake
|
||||||
|
BuildRequires: libuuid-devel
|
||||||
|
BuildRequires: glib2-devel
|
||||||
|
BuildRequires: libaio-devel
|
||||||
|
BuildRequires: corosynclib-devel
|
||||||
|
BuildRequires: pacemaker-libs-devel > 1.1.12
|
||||||
|
BuildRequires: libtool
|
||||||
|
BuildRequires: libuuid-devel
|
||||||
|
BuildRequires: libxml2-devel
|
||||||
|
BuildRequires: pkgconfig
|
||||||
|
BuildRequires: systemd
|
||||||
|
|
||||||
|
%if 0%{?rhel} > 0
|
||||||
|
ExclusiveArch: i686 x86_64 s390x ppc64le aarch64
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{defined systemd_requires}
|
||||||
|
%systemd_requires
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
|
||||||
|
This package contains the storage-based death functionality.
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -n %{name}-%{commit} -p1
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
|
||||||
|
%build
|
||||||
|
autoreconf -i
|
||||||
|
export CFLAGS="$RPM_OPT_FLAGS -Wall -Werror"
|
||||||
|
%configure
|
||||||
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
|
||||||
|
%install
|
||||||
|
|
||||||
|
make DESTDIR=$RPM_BUILD_ROOT LIBDIR=%{_libdir} install
|
||||||
|
rm -rf ${RPM_BUILD_ROOT}%{_libdir}/stonith
|
||||||
|
|
||||||
|
%if %{defined _unitdir}
|
||||||
|
install -D -m 0644 src/sbd.service $RPM_BUILD_ROOT/%{_unitdir}/sbd.service
|
||||||
|
install -D -m 0644 src/sbd_remote.service $RPM_BUILD_ROOT/%{_unitdir}/sbd_remote.service
|
||||||
|
%endif
|
||||||
|
|
||||||
|
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig
|
||||||
|
install -m 644 src/sbd.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/sbd
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
|
||||||
|
%clean
|
||||||
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
|
%if %{defined _unitdir}
|
||||||
|
%post
|
||||||
|
%systemd_post sbd.service
|
||||||
|
%systemd_post sbd_remote.service
|
||||||
|
if [ $1 -ne 1 ] ; then
|
||||||
|
if systemctl --quiet is-enabled sbd.service 2>/dev/null
|
||||||
|
then
|
||||||
|
systemctl --quiet reenable sbd.service 2>/dev/null || :
|
||||||
|
fi
|
||||||
|
if systemctl --quiet is-enabled sbd_remote.service 2>/dev/null
|
||||||
|
then
|
||||||
|
systemctl --quiet reenable sbd_remote.service 2>/dev/null || :
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
%preun
|
||||||
|
%systemd_preun sbd.service
|
||||||
|
%systemd_preun sbd_remote.service
|
||||||
|
|
||||||
|
%postun
|
||||||
|
%systemd_postun sbd.service
|
||||||
|
%systemd_postun sbd_remote.service
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%files
|
||||||
|
###########################################################
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%config(noreplace) %{_sysconfdir}/sysconfig/sbd
|
||||||
|
%{_sbindir}/sbd
|
||||||
|
#%{_datadir}/sbd
|
||||||
|
%doc %{_mandir}/man8/sbd*
|
||||||
|
%if %{defined _unitdir}
|
||||||
|
%{_unitdir}/sbd.service
|
||||||
|
%{_unitdir}/sbd_remote.service
|
||||||
|
%endif
|
||||||
|
%doc COPYING
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Mon Aug 26 2019 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-18.3
|
||||||
|
- added missing patch
|
||||||
|
|
||||||
|
Resolves: rhbz#1734061
|
||||||
|
|
||||||
|
* Fri Aug 16 2019 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-18.2
|
||||||
|
- check for shutdown attribute on every cib-diff
|
||||||
|
|
||||||
|
Resolves: rhbz#1734061
|
||||||
|
|
||||||
|
* Tue Jul 30 2019 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-18.1
|
||||||
|
- assume graceful pacemaker exit if leftovers are unmanaged
|
||||||
|
- make handling of cib-connection loss more robust
|
||||||
|
|
||||||
|
Resolves: rhbz#1734061
|
||||||
|
|
||||||
|
* Mon Dec 17 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-18
|
||||||
|
- make timeout-action executed by sbd configurable
|
||||||
|
|
||||||
|
Resolves: rhbz#1660147
|
||||||
|
|
||||||
|
* Mon Dec 3 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-17
|
||||||
|
- use pacemaker's new pe api with constructors/destructors
|
||||||
|
|
||||||
|
Resolves: rhbz#1650663
|
||||||
|
|
||||||
|
* Wed Sep 19 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-16
|
||||||
|
- avoid statting potential symlink-targets in /dev
|
||||||
|
|
||||||
|
Resolves: rhbz#1629020
|
||||||
|
|
||||||
|
* Wed Sep 19 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-15
|
||||||
|
- rebuild against new versions of libqb (1.0.3-7.el8),
|
||||||
|
corosync (2.99.3-4.el8) and pacemaker (2.0.0-9.el8)
|
||||||
|
|
||||||
|
Related: rhbz#1615945
|
||||||
|
|
||||||
|
* Fri Sep 14 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-14
|
||||||
|
- skip symlinks pointing to dev-nodes outside of /dev
|
||||||
|
|
||||||
|
Resolves: rhbz#1629020
|
||||||
|
|
||||||
|
* Wed Sep 5 2018 Klaus Wenninger <kwenning@redhat.com> - 1.3.1-13
|
||||||
|
- Require systemd-package during build to have the macros
|
||||||
|
|
||||||
|
Resolves: rhbz#1625553
|
||||||
|
|
||||||
|
* Mon Jul 30 2018 Florian Weimer <fweimer@redhat.com> - 1.3.1-12
|
||||||
|
- Rebuild with fixed binutils
|
||||||
|
|
||||||
|
* Tue Jul 3 2018 <kwenning@redhat.com> - 1.3.1-11
|
||||||
|
- replaced tarball by version downloaded from github
|
||||||
|
|
||||||
|
* Mon Jul 2 2018 <kwenning@redhat.com> - 1.3.1-10
|
||||||
|
- removed unneeded python build-dependency
|
||||||
|
- updated legacy corosync-devel to corosynclib-devel
|
||||||
|
|
||||||
|
Resolves: rhbz#1595856
|
||||||
|
|
||||||
|
* Fri May 4 2018 <kwenning@redhat.com> - 1.3.1-9
|
||||||
|
- use cib-api directly as get_cib_copy gone with
|
||||||
|
pacemaker 2.0.0
|
||||||
|
- add sys/sysmacros.h to build with glibc-2.25
|
||||||
|
- enlarge string buffer to satisfy newer gcc
|
||||||
|
- no corosync 1 support with pacemaker 2.0.0
|
||||||
|
- set default to LOG_NOTICE + overhaul levels
|
||||||
|
- refactor proc-parsing
|
||||||
|
- adaptions for daemon-names changed with
|
||||||
|
pacemaker 2.0.0 rc3
|
||||||
|
- added .do-not-sync-with-fedora
|
||||||
|
Resolves: rhbz#1571797
|
||||||
|
|
||||||
|
* Mon Apr 16 2018 <kwenning@redhat.com> - 1.3.1-8
|
||||||
|
- Added aarch64 target
|
||||||
|
|
||||||
|
Resolves: rhbz#1568029
|
||||||
|
|
||||||
|
* Mon Jan 15 2018 <kwenning@redhat.com> - 1.3.1-7
|
||||||
|
- reenable sbd on upgrade so that additional
|
||||||
|
links to make pacemaker properly depend on
|
||||||
|
sbd are created
|
||||||
|
|
||||||
|
Resolves: rhbz#1525981
|
||||||
|
|
||||||
|
* Wed Jan 10 2018 <kwenning@redhat.com> - 1.3.1-5
|
||||||
|
- add man sections for query- & test-watchdog
|
||||||
|
|
||||||
|
Resolves: rhbz#1462002
|
||||||
|
|
||||||
|
* Wed Dec 20 2017 <kwenning@redhat.com> - 1.3.1-3
|
||||||
|
- mention timeout caveat with SBD_DELAY_START
|
||||||
|
in configuration template
|
||||||
|
- make systemd wait for sbd-start to finish
|
||||||
|
before starting pacemaker or dlm
|
||||||
|
|
||||||
|
Resolves: rhbz#1525981
|
||||||
|
|
||||||
|
* Fri Nov 3 2017 <kwenning@redhat.com> - 1.3.1-2
|
||||||
|
- rebase to upstream v1.3.1
|
||||||
|
|
||||||
|
Resolves: rhbz#1499864
|
||||||
|
rhbz#1468580
|
||||||
|
rhbz#1462002
|
||||||
|
|
||||||
|
* Wed Jun 7 2017 <kwenning@redhat.com> - 1.3.0-3
|
||||||
|
- prevent creation of duplicate servants
|
||||||
|
- check 2Node flag in corosync to support
|
||||||
|
2-node-clusters with shared disk fencing
|
||||||
|
- move disk-triggered reboot/off/crashdump
|
||||||
|
to inquisitor to have sysrq observed by watchdog
|
||||||
|
|
||||||
|
Resolves: rhbz#1413951
|
||||||
|
|
||||||
|
* Sun Mar 26 2017 <kwenning@redhat.com> - 1.3.0-1
|
||||||
|
- rebase to upstream v1.3.0
|
||||||
|
- remove watchdog-limitation from description
|
||||||
|
Resolves: rhbz#1413951
|
||||||
|
|
||||||
|
* Mon Feb 27 2017 <kwenning@redhat.com> - 1.2.1-23
|
||||||
|
- if shared-storage enabled check for node-name <= 63 chars
|
||||||
|
Resolves: rhbz#1413951
|
||||||
|
|
||||||
|
* Tue Jan 31 2017 <kwenning@redhat.com> - 1.2.1-22
|
||||||
|
- Rebuild with shared-storage enabled
|
||||||
|
- Package original manpage
|
||||||
|
- Added ppc64le target
|
||||||
|
Resolves: rhbz#1413951
|
||||||
|
|
||||||
|
* Fri Apr 15 2016 <kwenning@redhat.com> - 1.2.1-21
|
||||||
|
- Rebuild for new pacemaker
|
||||||
|
Resolves: rhbz#1320400
|
||||||
|
|
||||||
|
* Fri Apr 15 2016 <kwenning@redhat.com> - 1.2.1-20
|
||||||
|
- tarball updated to c511b0692784a7085df4b1ae35748fb318fa79ee
|
||||||
|
from https://github.com/Clusterlabs/sbd
|
||||||
|
Resolves: rhbz#1324240
|
||||||
|
|
||||||
|
* Thu Jul 23 2015 <abeekhof@redhat.com> - 1.2.1-5
|
||||||
|
- Rebuild for pacemaker
|
||||||
|
|
||||||
|
* Tue Jun 02 2015 <abeekhof@redhat.com> - 1.2.1-4
|
||||||
|
- Include the dist tag in the release string
|
||||||
|
- Rebuild for new pacemaker
|
||||||
|
|
||||||
|
* Mon Jan 12 2015 <abeekhof@redhat.com> - 1.2.1-3
|
||||||
|
- Correctly parse SBD_WATCHDOG_TIMEOUT into seconds (not milliseconds)
|
||||||
|
|
||||||
|
* Mon Oct 27 2014 <abeekhof@redhat.com> - 1.2.1-2
|
||||||
|
- Correctly enable /proc/pid validation for sbd_lock_running()
|
||||||
|
|
||||||
|
* Fri Oct 24 2014 <abeekhof@redhat.com> - 1.2.1-1
|
||||||
|
- Further improve integration with the el7 environment
|
||||||
|
|
||||||
|
* Thu Oct 16 2014 <abeekhof@redhat.com> - 1.2.1-0.5.872e82f3.git
|
||||||
|
- Disable unsupported functionality (for now)
|
||||||
|
|
||||||
|
* Wed Oct 15 2014 <abeekhof@redhat.com> - 1.2.1-0.4.872e82f3.git
|
||||||
|
- Improved integration with the el7 environment
|
||||||
|
|
||||||
|
* Tue Sep 30 2014 <abeekhof@redhat.com> - 1.2.1-0.3.8f912945.git
|
||||||
|
- Only build on archs supported by the HA Add-on
|
||||||
|
|
||||||
|
* Fri Aug 29 2014 <abeekhof@redhat.com> - 1.2.1-0.2.8f912945.git
|
||||||
|
- Remove some additional SUSE-isms
|
||||||
|
|
||||||
|
* Fri Aug 29 2014 <abeekhof@redhat.com> - 1.2.1-0.1.8f912945.git
|
||||||
|
- Prepare for package review
|
Loading…
Reference in New Issue
Block a user