summaryrefslogtreecommitdiff
path: root/0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-01 14:35:16 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-01 14:35:16 +0000
commit2453fd874197f84e11ae70053cff7f56a32988f4 (patch)
treed6ce5f0f1defa8b7a9b070ba870a8b7f916578dc /0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch
parente47cbe682033e9df1530280ef7460c172c32961a (diff)
automatic import of glusterfsopeneuler24.03_LTS
Diffstat (limited to '0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch')
-rw-r--r--0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch200
1 files changed, 200 insertions, 0 deletions
diff --git a/0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch b/0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch
new file mode 100644
index 0000000..133a24e
--- /dev/null
+++ b/0527-Events-Socket-creation-after-getaddrinfo-and-IPv4-an.patch
@@ -0,0 +1,200 @@
+From 4152c77defac24ace3b1b6b9cc81a4f614254e4f Mon Sep 17 00:00:00 2001
+From: srijan-sivakumar <ssivakum@redhat.com>
+Date: Sat, 18 Jul 2020 05:59:09 +0530
+Subject: [PATCH 527/532] Events: Socket creation after getaddrinfo and IPv4
+ and IPv6 packet capture
+
+Issue: Currently, the socket creation is done
+prior to getaddrinfo function being invoked. This
+can cause mismatch in the protocol and address
+families of the created socket and the result
+of the getaddrinfo api. Also, the glustereventsd
+UDP server by default only captures IPv4 packets
+hence IPv6 packets are not even captured.
+
+Code Changes:
+1. Modified the socket creation in such a way that
+the parameters taken in are dependent upon the
+result of the getaddrinfo function.
+2. Created a subclass for adding address family
+in glustereventsd.py for both AF_INET and AF_INET6.
+3. Modified addresses in the eventsapiconf.py.in
+
+Reasoning behind the approach:
+1. If we are using getaddrinfo function then
+socket creation should happen only after we
+check if we received back valid addresses.
+Hence socket creation should come after the call
+to getaddrinfo
+2. The listening server which pushes the events
+to the webhook has to listen for both IPv4
+and IPv6 messages as we would not be sure as to
+what address family is picked in _gf_event.
+
+>Fixes: #1377
+>Change-Id: I568dcd1a977c8832f0fef981e1f81cac7043c760
+>Signed-off-by: srijan-sivakumar <ssivakum@redhat.com>
+Upstream patch: https://review.gluster.org/c/glusterfs/+/24722
+
+BUG: 1814744
+Change-Id: I568dcd1a977c8832f0fef981e1f81cac7043c760
+Signed-off-by: srijan-sivakumar <ssivakum@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/225567
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Ravishankar Narayanankutty <ravishankar@redhat.com>
+---
+ events/src/eventsapiconf.py.in | 2 ++
+ events/src/glustereventsd.py | 37 ++++++++++++++++++++++++++++++-------
+ libglusterfs/src/events.c | 27 +++++++++++++++++++--------
+ 3 files changed, 51 insertions(+), 15 deletions(-)
+
+diff --git a/events/src/eventsapiconf.py.in b/events/src/eventsapiconf.py.in
+index 76b5954..700093b 100644
+--- a/events/src/eventsapiconf.py.in
++++ b/events/src/eventsapiconf.py.in
+@@ -28,6 +28,8 @@ def get_glusterd_workdir():
+ return glusterd_workdir
+
+ SERVER_ADDRESS = "0.0.0.0"
++SERVER_ADDRESSv4 = "0.0.0.0"
++SERVER_ADDRESSv6 = "::1"
+ DEFAULT_CONFIG_FILE = "@SYSCONF_DIR@/glusterfs/eventsconfig.json"
+ CUSTOM_CONFIG_FILE_TO_SYNC = "/events/config.json"
+ CUSTOM_CONFIG_FILE = get_glusterd_workdir() + CUSTOM_CONFIG_FILE_TO_SYNC
+diff --git a/events/src/glustereventsd.py b/events/src/glustereventsd.py
+index c4c7b65..341a3b6 100644
+--- a/events/src/glustereventsd.py
++++ b/events/src/glustereventsd.py
+@@ -13,6 +13,7 @@
+ from __future__ import print_function
+ import sys
+ import signal
++import threading
+ try:
+ import socketserver
+ except ImportError:
+@@ -23,10 +24,17 @@ from argparse import ArgumentParser, RawDescriptionHelpFormatter
+ from eventtypes import all_events
+ import handlers
+ import utils
+-from eventsapiconf import SERVER_ADDRESS, PID_FILE
++from eventsapiconf import SERVER_ADDRESSv4, SERVER_ADDRESSv6, PID_FILE
+ from eventsapiconf import AUTO_BOOL_ATTRIBUTES, AUTO_INT_ATTRIBUTES
+ from utils import logger, PidFile, PidFileLockFailed, boolify
+
++# Subclass so that specifically IPv4 packets are captured
++class UDPServerv4(socketserver.ThreadingUDPServer):
++ address_family = socket.AF_INET
++
++# Subclass so that specifically IPv6 packets are captured
++class UDPServerv6(socketserver.ThreadingUDPServer):
++ address_family = socket.AF_INET6
+
+ class GlusterEventsRequestHandler(socketserver.BaseRequestHandler):
+
+@@ -89,6 +97,10 @@ def signal_handler_sigusr2(sig, frame):
+ utils.restart_webhook_pool()
+
+
++def UDP_server_thread(sock):
++ sock.serve_forever()
++
++
+ def init_event_server():
+ utils.setup_logger()
+ utils.load_all()
+@@ -99,15 +111,26 @@ def init_event_server():
+ sys.stderr.write("Unable to get Port details from Config\n")
+ sys.exit(1)
+
+- # Start the Eventing Server, UDP Server
++ # Creating the Eventing Server, UDP Server for IPv4 packets
++ try:
++ serverv4 = UDPServerv4((SERVER_ADDRESSv4, port),
++ GlusterEventsRequestHandler)
++ except socket.error as e:
++ sys.stderr.write("Failed to start Eventsd for IPv4: {0}\n".format(e))
++ sys.exit(1)
++ # Creating the Eventing Server, UDP Server for IPv6 packets
+ try:
+- server = socketserver.ThreadingUDPServer(
+- (SERVER_ADDRESS, port),
+- GlusterEventsRequestHandler)
++ serverv6 = UDPServerv6((SERVER_ADDRESSv6, port),
++ GlusterEventsRequestHandler)
+ except socket.error as e:
+- sys.stderr.write("Failed to start Eventsd: {0}\n".format(e))
++ sys.stderr.write("Failed to start Eventsd for IPv6: {0}\n".format(e))
+ sys.exit(1)
+- server.serve_forever()
++ server_thread1 = threading.Thread(target=UDP_server_thread,
++ args=(serverv4,))
++ server_thread2 = threading.Thread(target=UDP_server_thread,
++ args=(serverv6,))
++ server_thread1.start()
++ server_thread2.start()
+
+
+ def get_args():
+diff --git a/libglusterfs/src/events.c b/libglusterfs/src/events.c
+index 6d1e383..4d720ca 100644
+--- a/libglusterfs/src/events.c
++++ b/libglusterfs/src/events.c
+@@ -40,6 +40,7 @@ _gf_event(eventtypes_t event, const char *fmt, ...)
+ char *host = NULL;
+ struct addrinfo hints;
+ struct addrinfo *result = NULL;
++ struct addrinfo *iter_result_ptr = NULL;
+ xlator_t *this = THIS;
+ char *volfile_server_transport = NULL;
+
+@@ -51,13 +52,6 @@ _gf_event(eventtypes_t event, const char *fmt, ...)
+ goto out;
+ }
+
+- /* Initialize UDP socket */
+- sock = socket(AF_INET, SOCK_DGRAM, 0);
+- if (sock < 0) {
+- ret = EVENT_ERROR_SOCKET;
+- goto out;
+- }
+-
+ if (ctx) {
+ volfile_server_transport = ctx->cmd_args.volfile_server_transport;
+ }
+@@ -66,7 +60,6 @@ _gf_event(eventtypes_t event, const char *fmt, ...)
+ }
+
+ /* host = NULL returns localhost */
+- host = NULL;
+ if (ctx && ctx->cmd_args.volfile_server &&
+ (strcmp(volfile_server_transport, "unix"))) {
+ /* If it is client code then volfile_server is set
+@@ -84,6 +77,24 @@ _gf_event(eventtypes_t event, const char *fmt, ...)
+ goto out;
+ }
+
++ // iterate over the result and break when socket creation is success.
++ for (iter_result_ptr = result; iter_result_ptr != NULL;
++ iter_result_ptr = iter_result_ptr->ai_next) {
++ sock = socket(iter_result_ptr->ai_family, iter_result_ptr->ai_socktype,
++ iter_result_ptr->ai_protocol);
++ if (sock != -1) {
++ break;
++ }
++ }
++ /*
++ * If none of the addrinfo structures lead to a successful socket
++ * creation, socket creation has failed.
++ */
++ if (sock < 0) {
++ ret = EVENT_ERROR_SOCKET;
++ goto out;
++ }
++
+ va_start(arguments, fmt);
+ ret = gf_vasprintf(&msg, fmt, arguments);
+ va_end(arguments);
+--
+1.8.3.1
+