Clean up
OBS-URL: https://build.opensuse.org/package/show/network:ha-clustering:Factory/corosync?expand=0&rev=180
This commit is contained in:
parent
864db64eae
commit
c5a162b3fb
@ -1,200 +0,0 @@
|
||||
From d963c2ab6cac0bf18355159afd815c0eb78e4aa8 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Friesse <jfriesse@redhat.com>
|
||||
Date: Mon, 27 Jul 2020 16:10:54 +0200
|
||||
Subject: [PATCH] totemip: Add support for sin6_scope_id
|
||||
|
||||
sin6_scope_id is not present in totemip structure making impossible to
|
||||
use link-local ipv6 address.
|
||||
|
||||
Patch adds new call totemip_totemip_to_sockaddr_convert_with_scopeid
|
||||
which can be instructed to fill scope id. This function calls
|
||||
totemip_getif_scopeid which walks local addresses and returns
|
||||
scope id if interface matches.
|
||||
|
||||
Main difference between this patch and
|
||||
934c47ed4384daf2819c26306bebba3225807499 is fact, that totemip
|
||||
structure keeps unchanged so corosync stays wire compatible.
|
||||
|
||||
This makes corosync work with link-local addresses fine for both UDPU
|
||||
and UDP transport as long as there is only one matching interface with
|
||||
this patch.
|
||||
|
||||
Big thanks to Aleksei Burlakov <aburlakov@suse.com> who brought idea
|
||||
(and implementation) of using totemip_getif_scopeid.
|
||||
|
||||
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
|
||||
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
|
||||
---
|
||||
exec/totemip.c | 69 ++++++++++++++++++++++++++++++--
|
||||
exec/totemudp.c | 7 ++--
|
||||
exec/totemudpu.c | 6 ++-
|
||||
include/corosync/totem/totemip.h | 4 ++
|
||||
4 files changed, 77 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/exec/totemip.c b/exec/totemip.c
|
||||
index f89c70a04..4f08f5375 100644
|
||||
--- a/exec/totemip.c
|
||||
+++ b/exec/totemip.c
|
||||
@@ -50,6 +50,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ifaddrs.h>
|
||||
+#include <corosync/logsys.h>
|
||||
|
||||
#include <corosync/totem/totemip.h>
|
||||
#include <corosync/swab.h>
|
||||
@@ -267,11 +268,58 @@ const char *totemip_print(const struct totem_ip_address *addr)
|
||||
return (inet_ntop(addr->family, addr->addr, buf, sizeof(buf)));
|
||||
}
|
||||
|
||||
-/* Make a totem_ip_address into a usable sockaddr_storage */
|
||||
-int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
|
||||
- uint16_t port, struct sockaddr_storage *saddr, int *addrlen)
|
||||
+static int totemip_getif_scopeid(const unsigned char *addr16, unsigned int *scopeid)
|
||||
+{
|
||||
+ struct ifaddrs *ifa;
|
||||
+ const struct sockaddr_in6 *sin6;
|
||||
+ const socklen_t addr_len = sizeof(struct in6_addr);
|
||||
+ int rc = -1; // 0 = found 1 match; -1 = found 0 matches; -2 = found >1 matches
|
||||
+ struct ifaddrs *totemip_getif_scopeid_ifap;
|
||||
+
|
||||
+ if (getifaddrs(&totemip_getif_scopeid_ifap) != 0) {
|
||||
+ return (-1);
|
||||
+ }
|
||||
+
|
||||
+ for (ifa = totemip_getif_scopeid_ifap; ifa; ifa = ifa->ifa_next) {
|
||||
+ if (ifa->ifa_addr == NULL || ifa->ifa_netmask == NULL)
|
||||
+ continue ;
|
||||
+
|
||||
+ if ((ifa->ifa_addr->sa_family != AF_INET6) ||
|
||||
+ (ifa->ifa_netmask->sa_family != AF_INET6 &&
|
||||
+ ifa->ifa_netmask->sa_family != 0))
|
||||
+ continue ;
|
||||
+
|
||||
+ sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
|
||||
+
|
||||
+ if (memcmp(&sin6->sin6_addr, addr16, addr_len) == 0) {
|
||||
+ *scopeid = sin6->sin6_scope_id;
|
||||
+
|
||||
+ if (rc == -1) {
|
||||
+ rc = 0;
|
||||
+ } else {
|
||||
+ rc = -2;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (rc == -2) {
|
||||
+ log_printf(LOGSYS_LEVEL_WARNING, "(%s) exists on several interfaces."
|
||||
+ " Use 'ip a' to see details.",
|
||||
+ totemip_sa_print(ifa->ifa_addr));
|
||||
+ }
|
||||
+
|
||||
+ freeifaddrs(totemip_getif_scopeid_ifap);
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+int totemip_totemip_to_sockaddr_convert_with_scopeid(const struct totem_ip_address *ip_addr,
|
||||
+ uint16_t port, struct sockaddr_storage *saddr, int *addrlen,
|
||||
+ int fill_scopeid)
|
||||
{
|
||||
int ret = -1;
|
||||
+ unsigned int scopeid;
|
||||
|
||||
if (ip_addr->family == AF_INET) {
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *)saddr;
|
||||
@@ -296,7 +344,11 @@ 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;
|
||||
+ if (fill_scopeid) {
|
||||
+ if (totemip_getif_scopeid(ip_addr->addr, &scopeid) == 0) {
|
||||
+ sin->sin6_scope_id = scopeid;
|
||||
+ }
|
||||
+ }
|
||||
memcpy(&sin->sin6_addr, ip_addr->addr, sizeof(struct in6_addr));
|
||||
|
||||
*addrlen = sizeof(struct sockaddr_in6);
|
||||
@@ -306,6 +358,15 @@ int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/* Make a totem_ip_address into a usable sockaddr_storage */
|
||||
+int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
|
||||
+ uint16_t port, struct sockaddr_storage *saddr, int *addrlen)
|
||||
+{
|
||||
+
|
||||
+ return (totemip_totemip_to_sockaddr_convert_with_scopeid(ip_addr, port, saddr, addrlen, 0));
|
||||
+}
|
||||
+
|
||||
+
|
||||
/* Converts an address string string into a totem_ip_address.
|
||||
family can be AF_INET, AF_INET6 or 0 ("for "don't care")
|
||||
*/
|
||||
diff --git a/exec/totemudp.c b/exec/totemudp.c
|
||||
index 4b644aee3..c11bbe8e6 100644
|
||||
--- a/exec/totemudp.c
|
||||
+++ b/exec/totemudp.c
|
||||
@@ -834,8 +834,8 @@ static int totemudp_build_sockets_ip (
|
||||
return (-1);
|
||||
}
|
||||
|
||||
- totemip_totemip_to_sockaddr_convert(bound_to, instance->totem_interface->ip_port - 1,
|
||||
- &sockaddr, &addrlen);
|
||||
+ totemip_totemip_to_sockaddr_convert_with_scopeid(bound_to, instance->totem_interface->ip_port - 1,
|
||||
+ &sockaddr, &addrlen, 1);
|
||||
|
||||
retries = 0;
|
||||
while (1) {
|
||||
@@ -890,7 +890,8 @@ static int totemudp_build_sockets_ip (
|
||||
* Bind to unicast socket used for token send/receives
|
||||
* This has the side effect of binding to the correct interface
|
||||
*/
|
||||
- totemip_totemip_to_sockaddr_convert(bound_to, instance->totem_interface->ip_port, &sockaddr, &addrlen);
|
||||
+ totemip_totemip_to_sockaddr_convert_with_scopeid(bound_to, instance->totem_interface->ip_port,
|
||||
+ &sockaddr, &addrlen, 1);
|
||||
|
||||
retries = 0;
|
||||
while (1) {
|
||||
diff --git a/exec/totemudpu.c b/exec/totemudpu.c
|
||||
index f9d50af26..1d9410f65 100644
|
||||
--- a/exec/totemudpu.c
|
||||
+++ b/exec/totemudpu.c
|
||||
@@ -824,7 +824,9 @@ static int totemudpu_build_sockets_ip (
|
||||
* Bind to unicast socket used for token send/receives
|
||||
* This has the side effect of binding to the correct interface
|
||||
*/
|
||||
- totemip_totemip_to_sockaddr_convert(bound_to, instance->totem_interface->ip_port, &sockaddr, &addrlen);
|
||||
+ totemip_totemip_to_sockaddr_convert_with_scopeid(bound_to, instance->totem_interface->ip_port,
|
||||
+ &sockaddr, &addrlen, 1);
|
||||
+
|
||||
while (1) {
|
||||
res = bind (instance->token_socket, (struct sockaddr *)&sockaddr, addrlen);
|
||||
if (res == 0) {
|
||||
@@ -1331,7 +1333,7 @@ static int totemudpu_create_sending_socket(
|
||||
/*
|
||||
* Bind to sending interface
|
||||
*/
|
||||
- totemip_totemip_to_sockaddr_convert(&instance->my_id, 0, &sockaddr, &addrlen);
|
||||
+ totemip_totemip_to_sockaddr_convert_with_scopeid(&instance->my_id, 0, &sockaddr, &addrlen, 1);
|
||||
res = bind (fd, (struct sockaddr *)&sockaddr, addrlen);
|
||||
if (res == -1) {
|
||||
LOGSYS_PERROR (errno, instance->totemudpu_log_level_warning,
|
||||
diff --git a/include/corosync/totem/totemip.h b/include/corosync/totem/totemip.h
|
||||
index 891a0524b..2a63317b1 100644
|
||||
--- a/include/corosync/totem/totemip.h
|
||||
+++ b/include/corosync/totem/totemip.h
|
||||
@@ -97,6 +97,10 @@ extern int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
|
||||
uint16_t port, struct sockaddr_storage *saddr, int *addrlen);
|
||||
extern int totemip_parse(struct totem_ip_address *totemip, const char *addr,
|
||||
int family);
|
||||
+extern int totemip_totemip_to_sockaddr_convert_with_scopeid(const struct totem_ip_address *ip_addr,
|
||||
+ uint16_t port, struct sockaddr_storage *saddr, int *addrlen,
|
||||
+ int fill_scopeid);
|
||||
+
|
||||
extern int totemip_iface_check(struct totem_ip_address *bindnet,
|
||||
struct totem_ip_address *boundto,
|
||||
int *interface_up,
|
@ -1,241 +0,0 @@
|
||||
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
|
||||
|
3
corosync-2.4.5+git69.6236728a.tar.bz2
Normal file
3
corosync-2.4.5+git69.6236728a.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bb2776e7c7bea38d05779c79357335ae4d3af37ce0bda39137a51cdf9d702dd7
|
||||
size 454259
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b67dfc8de715e1366abdb73dbdfb5676b9551f9e2f61c2b2a3271e605cf8583c
|
||||
size 453945
|
Loading…
Reference in New Issue
Block a user