SHA256
1
0
forked from pool/corosync

Accepting request 786911 from network:ha-clustering:Factory

OBS-URL: https://build.opensuse.org/request/show/786911
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/corosync?expand=0&rev=67
This commit is contained in:
Dominique Leuenberger 2020-03-25 22:42:28 +00:00 committed by Git OBS Bridge
commit 49ff9f4f3c
4 changed files with 368 additions and 2 deletions

View File

@ -0,0 +1,109 @@
From 36938e24a8d03f9b8fc97768ed08df36e63f61d0 Mon Sep 17 00:00:00 2001
From: liangxin1300 <XLiang@suse.com>
Date: Mon, 17 Feb 2020 22:24:31 +0800
Subject: [PATCH] totemip: Add support for sin6_scope_id
sin6_scope_id was not present in totemip structure making impossible to
use link-local ipv6 address.
Patch adds sin6_scope_id and changes convert/copy functions to use it
(formally also comparator functions should be changed, but it seems to
cause more harm and it is not really needed).
This makes corosync work with link-local addresses fine for both UDPU
and UDP transport as long as interface specification is used (so
fe80::xxxx:xxxx:xxxx:xxxx%eth0).
(backported from master 934c47ed4384daf2819c26306bebba3225807499)
Signed-off-by: liangxin1300 <XLiang@suse.com>
Reviewed-by: Jan Friesse <jfriesse@redhat.com>
---
exec/totemip.c | 15 +++++++++++----
include/corosync/coroapi.h | 1 +
include/corosync/totem/totemip.h | 1 +
3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/exec/totemip.c b/exec/totemip.c
index 28a88365..d8130831 100644
--- a/exec/totemip.c
+++ b/exec/totemip.c
@@ -247,7 +247,7 @@ int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
#endif
sin->sin6_family = ip_addr->family;
sin->sin6_port = ntohs(port);
- sin->sin6_scope_id = 2;
+ sin->sin6_scope_id = ip_addr->sin6_scope_id;
memcpy(&sin->sin6_addr, ip_addr->addr, sizeof(struct in6_addr));
*addrlen = sizeof(struct sockaddr_in6);
@@ -282,10 +282,13 @@ int totemip_parse(struct totem_ip_address *totemip, const char *addr, int family
sa6 = (struct sockaddr_in6 *)ainfo->ai_addr;
totemip->family = ainfo->ai_family;
- if (ainfo->ai_family == AF_INET)
+ if (ainfo->ai_family == AF_INET) {
memcpy(totemip->addr, &sa->sin_addr, sizeof(struct in_addr));
- else
+ totemip->sin6_scope_id = 0;
+ } else {
memcpy(totemip->addr, &sa6->sin6_addr, sizeof(struct in6_addr));
+ totemip->sin6_scope_id = sa6->sin6_scope_id;
+ }
freeaddrinfo(ainfo);
return 0;
@@ -304,6 +307,7 @@ int totemip_sockaddr_to_totemip_convert(const struct sockaddr_storage *saddr,
const struct sockaddr_in *sin = (const struct sockaddr_in *)saddr;
memcpy(ip_addr->addr, &sin->sin_addr, sizeof(struct in_addr));
+ ip_addr->sin6_scope_id = 0;
ret = 0;
}
@@ -312,7 +316,7 @@ int totemip_sockaddr_to_totemip_convert(const struct sockaddr_storage *saddr,
= (const struct sockaddr_in6 *)saddr;
memcpy(ip_addr->addr, &sin->sin6_addr, sizeof(struct in6_addr));
-
+ ip_addr->sin6_scope_id = sin->sin6_scope_id;
ret = 0;
}
return ret;
@@ -445,6 +449,9 @@ int totemip_iface_check(struct totem_ip_address *bindnet,
if (addr_len == 0)
continue ;
+ if (bindnet->sin6_scope_id != 0 && bindnet->sin6_scope_id != if_addr->interface_num)
+ continue;
+
totemip_copy(&bn_netaddr, bindnet);
totemip_copy(&if_netaddr, &if_addr->ip_addr);
diff --git a/include/corosync/coroapi.h b/include/corosync/coroapi.h
index 7e1f27cb..00173001 100644
--- a/include/corosync/coroapi.h
+++ b/include/corosync/coroapi.h
@@ -112,6 +112,7 @@ struct totem_ip_address {
unsigned int nodeid;
unsigned short family;
unsigned char addr[TOTEMIP_ADDRLEN];
+ unsigned int sin6_scope_id;
} __attribute__((packed));
#endif
diff --git a/include/corosync/totem/totemip.h b/include/corosync/totem/totemip.h
index 0168e66c..2ae0e03e 100644
--- a/include/corosync/totem/totemip.h
+++ b/include/corosync/totem/totemip.h
@@ -65,6 +65,7 @@ struct totem_ip_address
unsigned int nodeid;
unsigned short family;
unsigned char addr[TOTEMIP_ADDRLEN];
+ unsigned int sin6_scope_id;
} __attribute__((packed));
struct totem_ip_if_address
--
2.21.1

View File

@ -0,0 +1,241 @@
From a95e28cc35e1d59cedb406914ba437e21bc3e1ea Mon Sep 17 00:00:00 2001
From: Jan Friesse <jfriesse@redhat.com>
Date: Thu, 14 Feb 2019 16:05:59 +0100
Subject: [PATCH] quorumtool: Fix exit status codes
1. Use EXIT_SUCCESS and EXIT_FAILURE when possible
2. For -s option return EXIT_SUCCESS when no problem appeared and node
is quorate, EXIT_FAILURE if problem appeared and exit code 2
(EXIT_NOT_QUORATE) when no problem appeared but node is not quorate.
3. Document exit codes in the man page
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
(cherry picked from commit db38e3958c4f88d5d06e8f7c83d6d90334d9fbd2)
---
man/corosync-quorumtool.8 | 17 +++++++++++-
tools/corosync-quorumtool.c | 53 ++++++++++++++++++++++---------------
2 files changed, 47 insertions(+), 23 deletions(-)
diff --git a/man/corosync-quorumtool.8 b/man/corosync-quorumtool.8
index 915f35ff..2fc4e020 100644
--- a/man/corosync-quorumtool.8
+++ b/man/corosync-quorumtool.8
@@ -31,7 +31,7 @@
.\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
.\" * THE POSSIBILITY OF SUCH DAMAGE.
.\" */
-.TH COROSYNC-QUORUMTOOL 8 2012-01-12
+.TH COROSYNC-QUORUMTOOL 8 2019-02-14
.SH NAME
corosync-quorumtool \- Set and display quorum settings.
.SH SYNOPSIS
@@ -89,6 +89,21 @@ show this help text
show version and exit
.PP
* Starred items only work if votequorum is the quorum provider for corosync
+.SH EXIT STATUS
+corosync-quorumtool may return one of several error codes if it encounters problems.
+.TP
+0
+No problems occurred (quorate for
+.B -s
+operation).
+.TP
+1
+Generic error code.
+.TP
+2
+Not quorate (returned only for
+.B -s
+operation).
.SH SEE ALSO
.BR corosync_overview (8),
.BR votequorum_overview (8),
diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c
index e5d17b16..66ca7de5 100644
--- a/tools/corosync-quorumtool.c
+++ b/tools/corosync-quorumtool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2014 Red Hat, Inc.
+ * Copyright (c) 2009-2019 Red Hat, Inc.
*
* All rights reserved.
*
@@ -75,6 +75,8 @@ typedef enum {
SORT_NODENAME
} sorttype_t;
+#define EXIT_NOT_QUORATE 2
+
/*
* global vars
*/
@@ -238,7 +240,7 @@ static int set_votes(uint32_t nodeid, int votes)
votes, nodeid, cs_strerror(err));
}
- return err==CS_OK?0:err;
+ return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE);
}
static int set_expected(int expected_votes)
@@ -249,7 +251,7 @@ static int set_expected(int expected_votes)
fprintf(stderr, "Unable to set expected votes: %s\n", cs_strerror(err));
}
- return err==CS_OK?0:err;
+ return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE);
}
/*
@@ -638,9 +640,9 @@ static int display_quorum_data(int is_quorate,
}
/*
- * return 1 if quorate
- * 0 if not quorate
- * -1 on error
+ * return EXIT_SUCCESS if quorate
+ * EXIT_NOT_QUORATE if not quorate
+ * EXIT_FAILURE on error
*/
static int show_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type)
{
@@ -689,15 +691,15 @@ static int show_status(nodeid_format_t nodeid_format, name_format_t name_format,
quorum_err:
if (err != CS_OK) {
- return -1;
+ return EXIT_FAILURE;
}
err = display_quorum_data(is_quorate, nodeid_format, name_format, sort_type, 0);
if (err != CS_OK) {
- return -1;
+ return EXIT_FAILURE;
}
- return is_quorate;
+ return (is_quorate ? EXIT_SUCCESS : EXIT_NOT_QUORATE);
}
static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) {
@@ -750,7 +752,7 @@ static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_form
}
quorum_err:
- return -1;
+ return EXIT_FAILURE;
}
static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type)
@@ -784,23 +786,30 @@ static int unregister_qdevice(void)
{
int err;
struct votequorum_info info;
+ int result;
+
+ result = EXIT_FAILURE;
err = votequorum_getinfo(v_handle, our_nodeid, &info);
if (err != CS_OK) {
fprintf(stderr, "Unable to get quorum device info: %s\n", cs_strerror(err));
- return -1;
+ goto err_exit;
}
if (!(info.flags & VOTEQUORUM_INFO_QDEVICE_REGISTERED)) {
- return 0;
+ result = EXIT_SUCCESS;
+ goto err_exit;
}
err = votequorum_qdevice_unregister(v_handle, info.qdevice_name);
if (err != CS_OK) {
fprintf(stderr, "Unable to unregister quorum device: %s\n", cs_strerror(err));
- return -1;
+ goto err_exit;
}
- return 0;
+
+ result = EXIT_SUCCESS;
+err_exit:
+ return result;
}
/*
@@ -884,7 +893,7 @@ int main (int argc, char *argv[]) {
if (init_all()) {
close_all();
- exit(1);
+ exit(EXIT_FAILURE);
}
while ( (opt = getopt(argc, argv, options)) != -1 ) {
@@ -894,7 +903,7 @@ int main (int argc, char *argv[]) {
command_opt = CMD_UNREGISTER_QDEVICE;
} else {
fprintf(stderr, "You cannot unregister quorum device, corosync is not using votequorum\n");
- exit(2);
+ exit(EXIT_FAILURE);
}
break;
case 's':
@@ -928,14 +937,14 @@ int main (int argc, char *argv[]) {
}
} else {
fprintf(stderr, "You cannot change expected votes, corosync is not using votequorum\n");
- exit(2);
+ exit(EXIT_FAILURE);
}
break;
case 'n':
l = strtol(optarg, &endptr, 0);
if ((l == 0 && endptr == optarg) || l < 0) {
fprintf(stderr, "The nodeid was not valid, try a positive number\n");
- exit(2);
+ exit(EXIT_FAILURE);
}
nodeid = l;
nodeid_set = 1;
@@ -945,14 +954,14 @@ int main (int argc, char *argv[]) {
votes = strtol(optarg, &endptr, 0);
if ((votes == 0 && endptr == optarg) || votes < 0) {
fprintf(stderr, "New votes value was not valid, try a positive number or zero\n");
- exit(2);
+ exit(EXIT_FAILURE);
} else {
command_opt = CMD_SETVOTES;
}
}
else {
fprintf(stderr, "You cannot change node votes, corosync is not using votequorum\n");
- exit(2);
+ exit(EXIT_FAILURE);
}
break;
case 'o':
@@ -966,7 +975,7 @@ int main (int argc, char *argv[]) {
break;
default:
fprintf(stderr, "Invalid ordering option. valid orders are a(address), i(node ID) or n(name)\n");
- exit(2);
+ exit(EXIT_FAILURE);
break;
}
break;
@@ -985,7 +994,7 @@ int main (int argc, char *argv[]) {
switch (command_opt) {
case CMD_UNKNOWN:
show_usage(argv[0]);
- ret = -1;
+ ret = EXIT_FAILURE;
break;
case CMD_SHOWNODES:
ret = show_nodes(nodeid_format, address_format, sort_opt);
--
2.21.1

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
Fri Mar 20 14:07:26 UTC 2020 - XinLiang <XLiang@suse.com>
- Fix bsc#1163460 Corosync does not support link-local IPv6 addresses
Added: bug-1163460-totemip-Add-support-for-sin6_scope_id.patch
-------------------------------------------------------------------
Wed Mar 18 02:47:13 UTC 2020 - XinLiang <XLiang@suse.com>
- Fix bsc#1166899, return value of "corosync-quorumtool -s" was not correct
Added: bug-1166899-quorumtool-Fix-exit-status-codes.patch
-------------------------------------------------------------------
Fri Jan 3 11:30:41 UTC 2020 - matthias.gerstner@suse.com

View File

@ -1,7 +1,7 @@
#
# spec file for package corosync
#
# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -52,7 +52,7 @@ License: BSD-3-Clause
Group: Productivity/Clustering/HA
Version: 2.4.5
Release: 0
Url: http://corosync.github.io/corosync/
URL: http://corosync.github.io/corosync/
# source should be Souce code.tar.gz, https://github.com/corosync/corosync/archive/vX.X.X.tar.gz
Source0: %{name}-%{version}.tar.gz
Source2: baselibs.conf
@ -65,6 +65,8 @@ Patch6: bug-1001164_corosync.conf-example.patch
Patch7: corosync-2.3.4-fix-bashisms.patch
Patch8: corosync-init-lockfile-path-error.patch
Patch9: corosync-start-stop-level.patch
Patch10: bug-1166899-quorumtool-Fix-exit-status-codes.patch
Patch11: bug-1163460-totemip-Add-support-for-sin6_scope_id.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
# openais is indeed gone and should be uninstalled. Yes, we do not
@ -139,6 +141,8 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%build
%if %{with runautogen}