From e8cf9d286262a1a572417730db2fec7c2fac24f2 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara Date: Wed, 6 Nov 2019 13:30:03 -0600 Subject: [PATCH 1/4] Update to 2.0.19 (#1763424) --- .gitignore | 1 + keepalived.spec | 7 +++++-- sources | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a7d0a2c..64c0b73 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ /keepalived-2.0.11.tar.gz /keepalived-2.0.12.tar.gz /keepalived-2.0.18.tar.gz +/keepalived-2.0.19.tar.gz diff --git a/keepalived.spec b/keepalived.spec index 0b36367..9d47db3 100644 --- a/keepalived.spec +++ b/keepalived.spec @@ -8,8 +8,8 @@ Name: keepalived Summary: High Availability monitor built upon LVS, VRRP and service pollers -Version: 2.0.18 -Release: 2%{?dist} +Version: 2.0.19 +Release: 1%{?dist} License: GPLv2+ URL: http://www.keepalived.org/ @@ -95,6 +95,9 @@ mkdir -p %{buildroot}%{_libexecdir}/keepalived %{_mandir}/man8/keepalived.8* %changelog +* Wed Nov 06 2019 Ryan O'Hara - 2.0.19-1 +- Update to 2.0.19 (#1763424) + * Tue Jul 30 2019 Ryan O'Hara - 2.0.18-2 - Change pidfile directory (#1712730) diff --git a/sources b/sources index 63a74a2..e7a9ff7 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (keepalived-2.0.18.tar.gz) = 11e0a9b9bdca734a923254b4484f4e808cf362e795e3f457f707772b7522929be4bbbba9b1c152b7cb7601d8315b6faea229ed59f115787d6197fbc62770f9a3 +SHA512 (keepalived-2.0.19.tar.gz) = 68a510983bc043484e5edbc1d87563677a048282ec52873105f0af922e8b4de5b8e7176944010f9d4d6f65d1a4ebaf930c3d37273e28c1f115ed0fda245d8109 From 93e5d023983835670351b9ee4e1fef8a4ee88285 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara Date: Wed, 6 Nov 2019 13:47:41 -0600 Subject: [PATCH 2/4] Enable nftables support (#1769278) --- keepalived.spec | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/keepalived.spec b/keepalived.spec index 9d47db3..fe1f5f3 100644 --- a/keepalived.spec +++ b/keepalived.spec @@ -1,6 +1,7 @@ %bcond_without snmp %bcond_without vrrp %bcond_without sha1 +%bcond_without nftables %bcond_with profile %bcond_with debug @@ -23,6 +24,9 @@ Requires(postun): systemd %if %{with snmp} BuildRequires: net-snmp-devel %endif +%if %{with nftables} +BuildRequires: libnftnl-devel +%endif BuildRequires: gcc BuildRequires: systemd-units BuildRequires: openssl-devel @@ -54,6 +58,7 @@ infrastructures. %{?with_profile:--enable-profile} \ %{!?with_vrrp:--disable-vrrp} \ %{?with_snmp:--enable-snmp --enable-snmp-rfc} \ + %{?with_nftables:--enable-nftables} \ %{?with_sha1:--enable-sha1} \ --with-init=systemd %{__make} %{?_smp_mflags} STRIP=/bin/true @@ -95,6 +100,9 @@ mkdir -p %{buildroot}%{_libexecdir}/keepalived %{_mandir}/man8/keepalived.8* %changelog +* Wed Nov 06 2019 Ryan O'Hara - 2.0.19-2 +- Enable nftables support (#1769278) + * Wed Nov 06 2019 Ryan O'Hara - 2.0.19-1 - Update to 2.0.19 (#1763424) From b8341db83f0a23661ef143c99394e3c9d2501c65 Mon Sep 17 00:00:00 2001 From: Ryan O'Hara Date: Tue, 12 Nov 2019 04:44:42 -0600 Subject: [PATCH 3/4] Fix track_process with PIDs over 32767 (#1770766) --- ...ed-fix-track_process-with-pids-32767.patch | 49 +++++++++++++++++++ keepalived.spec | 8 ++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 keepalived-fix-track_process-with-pids-32767.patch diff --git a/keepalived-fix-track_process-with-pids-32767.patch b/keepalived-fix-track_process-with-pids-32767.patch new file mode 100644 index 0000000..35b7025 --- /dev/null +++ b/keepalived-fix-track_process-with-pids-32767.patch @@ -0,0 +1,49 @@ +From 23a5b8113bf0b8ec4718443df0406882e8e4d831 Mon Sep 17 00:00:00 2001 +From: Quentin Armitage +Date: Sat, 9 Nov 2019 10:07:48 +0000 +Subject: [PATCH] Fix track_process with PIDs > 32767 + +Signed-off-by: Quentin Armitage +--- + keepalived/core/track_process.c | 4 ++-- + lib/scheduler.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/keepalived/core/track_process.c b/keepalived/core/track_process.c +index 550254b1..76ff6009 100644 +--- a/keepalived/core/track_process.c ++++ b/keepalived/core/track_process.c +@@ -341,7 +341,7 @@ check_process(pid_t pid, char *comm, tracked_process_instance_t *tpi) + * swapped in to read it. */ + if (!have_comm) { + if (vrrp_data->vrrp_use_process_cmdline) { +- snprintf(cmdline, sizeof(cmdline), "/proc/%hd/cmdline", pid); ++ snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid); + + if ((fd = open(cmdline, O_RDONLY)) == -1) + return; +@@ -358,7 +358,7 @@ check_process(pid_t pid, char *comm, tracked_process_instance_t *tpi) + } + + if (vrrp_data->vrrp_use_process_comm) { +- snprintf(cmdline, sizeof(cmdline), "/proc/%hd/comm", pid); ++ snprintf(cmdline, sizeof(cmdline), "/proc/%d/comm", pid); + + fd = open(cmdline, O_RDONLY); + if (fd == -1) { +diff --git a/lib/scheduler.c b/lib/scheduler.c +index 3cd7b65a..de92c7d4 100644 +--- a/lib/scheduler.c ++++ b/lib/scheduler.c +@@ -441,7 +441,7 @@ report_child_status(int status, pid_t pid, char const *prog_name) + prog_id = child_finder_name(pid); + + if (!prog_id) { +- snprintf(pid_buf, sizeof(pid_buf), "pid %hd", pid); ++ snprintf(pid_buf, sizeof(pid_buf), "pid %d", pid); + prog_id = pid_buf; + } + +-- +2.23.0 + diff --git a/keepalived.spec b/keepalived.spec index fe1f5f3..c1dca52 100644 --- a/keepalived.spec +++ b/keepalived.spec @@ -10,13 +10,15 @@ Name: keepalived Summary: High Availability monitor built upon LVS, VRRP and service pollers Version: 2.0.19 -Release: 1%{?dist} +Release: 3%{?dist} License: GPLv2+ URL: http://www.keepalived.org/ Source0: http://www.keepalived.org/software/keepalived-%{version}.tar.gz Source1: keepalived.service +Patch0: keepalived-fix-track_process-with-pids-32767.patch + Requires(post): systemd Requires(preun): systemd Requires(postun): systemd @@ -51,6 +53,7 @@ infrastructures. %prep %setup -q +%patch0 -p1 %build %configure \ @@ -100,6 +103,9 @@ mkdir -p %{buildroot}%{_libexecdir}/keepalived %{_mandir}/man8/keepalived.8* %changelog +* Tue Nov 12 2019 Ryan O'Hara - 2.0.19-3 +- Fix track_process with PIDs over 32767 (#1770766) + * Wed Nov 06 2019 Ryan O'Hara - 2.0.19-2 - Enable nftables support (#1769278) From 919ba6edafdd732ef1f5b899345a6cab58e44bcc Mon Sep 17 00:00:00 2001 From: Ryan O'Hara Date: Tue, 12 Nov 2019 04:47:40 -0600 Subject: [PATCH 4/4] Fix file descriptor errors on reload --- ...fix-file-descriptor-errors-on-reload.patch | 164 ++++++++++++++++++ keepalived.spec | 7 +- 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 keepalived-fix-file-descriptor-errors-on-reload.patch diff --git a/keepalived-fix-file-descriptor-errors-on-reload.patch b/keepalived-fix-file-descriptor-errors-on-reload.patch new file mode 100644 index 0000000..1530517 --- /dev/null +++ b/keepalived-fix-file-descriptor-errors-on-reload.patch @@ -0,0 +1,164 @@ +From 1c3c8eefd0a40d4938d6f05969c886988116a425 Mon Sep 17 00:00:00 2001 +From: Quentin Armitage +Date: Wed, 6 Nov 2019 23:15:23 +0000 +Subject: [PATCH] Resolve file descriptor errors on reload + +If a read or write thread was on the thread reaady queue when a +reload was processed, the file descriptor was not removed from the +epoll instance. + +This commit ensures that file descriptors relating to threads on +the thread ready queue are removed from the epoll instance during +a reload. + +Signed-off-by: Quentin Armitage +--- + keepalived/bfd/bfd_scheduler.c | 2 +- + keepalived/check/check_bfd.c | 2 +- + keepalived/vrrp/vrrp_scheduler.c | 2 +- + lib/scheduler.c | 31 +++++++++++++++++++------------ + lib/scheduler.h | 3 ++- + 5 files changed, 24 insertions(+), 16 deletions(-) + +diff --git a/keepalived/bfd/bfd_scheduler.c b/keepalived/bfd/bfd_scheduler.c +index 5c3d0691..d51d420f 100644 +--- a/keepalived/bfd/bfd_scheduler.c ++++ b/keepalived/bfd/bfd_scheduler.c +@@ -908,7 +908,7 @@ bfd_receiver_thread(thread_ref_t thread) + data->thread_in = NULL; + + /* Ignore THREAD_READ_TIMEOUT */ +- if (thread->type == THREAD_READY_FD) { ++ if (thread->type == THREAD_READY_READ_FD) { + if (!bfd_receive_packet(&pkt, fd, bfd_buffer, BFD_BUFFER_SIZE)) + bfd_handle_packet(&pkt); + } +diff --git a/keepalived/check/check_bfd.c b/keepalived/check/check_bfd.c +index 4bd8af23..f9590c30 100644 +--- a/keepalived/check/check_bfd.c ++++ b/keepalived/check/check_bfd.c +@@ -290,7 +290,7 @@ bfd_check_thread(thread_ref_t thread) + bfd_thread = thread_add_read(master, bfd_check_thread, NULL, + thread->u.f.fd, TIMER_NEVER, false); + +- if (thread->type != THREAD_READY_FD) ++ if (thread->type != THREAD_READY_READ_FD) + return 0; + + while (read(thread->u.f.fd, &evt, sizeof(bfd_event_t)) != -1) +diff --git a/keepalived/vrrp/vrrp_scheduler.c b/keepalived/vrrp/vrrp_scheduler.c +index 91a4898c..7e6da60a 100644 +--- a/keepalived/vrrp/vrrp_scheduler.c ++++ b/keepalived/vrrp/vrrp_scheduler.c +@@ -762,7 +762,7 @@ vrrp_bfd_thread(thread_ref_t thread) + bfd_thread = thread_add_read(master, vrrp_bfd_thread, NULL, + thread->u.f.fd, TIMER_NEVER, false); + +- if (thread->type != THREAD_READY_FD) ++ if (thread->type != THREAD_READY_READ_FD) + return 0; + + while (read(thread->u.f.fd, &evt, sizeof(bfd_event_t)) != -1) +diff --git a/lib/scheduler.c b/lib/scheduler.c +index 8fc2a032..3cd7b65a 100644 +--- a/lib/scheduler.c ++++ b/lib/scheduler.c +@@ -116,7 +116,8 @@ get_thread_type_str(thread_type_t id) + if (id == THREAD_CHILD_TERMINATED) return "CHILD_TERMINATED"; + if (id == THREAD_TERMINATE_START) return "TERMINATE_START"; + if (id == THREAD_TERMINATE) return "TERMINATE"; +- if (id == THREAD_READY_FD) return "READY_FD"; ++ if (id == THREAD_READY_READ_FD) return "READY_READ_FD"; ++ if (id == THREAD_READY_WRITE_FD) return "READY_WRITE_FD"; + if (id == THREAD_READ_ERROR) return "READ_ERROR"; + if (id == THREAD_WRITE_ERROR) return "WRITE_ERROR"; + #ifdef USE_SIGNAL_THREADS +@@ -859,7 +860,8 @@ thread_destroy_rb(thread_master_t *m, rb_root_cached_t *root) + + if (thread->type == THREAD_READ || + thread->type == THREAD_WRITE || +- thread->type == THREAD_READY_FD || ++ thread->type == THREAD_READY_READ_FD || ++ thread->type == THREAD_READY_WRITE_FD || + thread->type == THREAD_READ_TIMEOUT || + thread->type == THREAD_WRITE_TIMEOUT || + thread->type == THREAD_READ_ERROR || +@@ -1409,14 +1411,18 @@ thread_cancel(thread_ref_t thread_cp) + rb_erase_cached(&thread->n, &m->child); + rb_erase(&thread->rb_data, &m->child_pid); + break; +- case THREAD_READY_FD: ++ case THREAD_READY_READ_FD: + case THREAD_READ_TIMEOUT: ++ if (thread->event) ++ thread_event_del(thread, THREAD_FL_EPOLL_READ_BIT); ++ list_head_del(&thread->next); ++ break; ++ case THREAD_READY_WRITE_FD: + case THREAD_WRITE_TIMEOUT: +- if (thread->event) { +- rb_erase(&thread->event->n, &m->io_events); +- FREE(thread->event); +- } +- /* ... falls through ... */ ++ if (thread->event) ++ thread_event_del(thread, THREAD_FL_EPOLL_WRITE_BIT); ++ list_head_del(&thread->next); ++ break; + case THREAD_EVENT: + case THREAD_READY: + #ifdef USE_SIGNAL_THREADS +@@ -1735,7 +1741,7 @@ thread_fetch_next_queue(thread_master_t *m) + , ev->fd, ep_ev->events); + continue; + } +- thread_move_ready(m, &m->read, ev->read, THREAD_READY_FD); ++ thread_move_ready(m, &m->read, ev->read, THREAD_READY_READ_FD); + ev->read = NULL; + } + +@@ -1746,7 +1752,7 @@ thread_fetch_next_queue(thread_master_t *m) + , ev->fd, ep_ev->events); + continue; + } +- thread_move_ready(m, &m->write, ev->write, THREAD_READY_FD); ++ thread_move_ready(m, &m->write, ev->write, THREAD_READY_WRITE_FD); + ev->write = NULL; + } + } +@@ -1804,7 +1810,8 @@ process_threads(thread_master_t *m) + * snmp_read, bfd_receiver, bfd pipe in vrrp/check, dbus pipe or netlink fds. */ + thread = thread_trim_head(thread_list); + if (!shutting_down || +- (thread->type == THREAD_READY_FD && ++ ((thread->type == THREAD_READY_READ_FD || ++ thread->type == THREAD_READY_WRITE_FD) && + (thread->u.f.fd == m->timer_fd || + thread->u.f.fd == m->signal_fd + #ifdef _WITH_SNMP_ +@@ -1823,7 +1830,7 @@ process_threads(thread_master_t *m) + shutting_down = true; + } + +- m->current_event = (thread->type == THREAD_READY_FD) ? thread->event : NULL; ++ m->current_event = (thread->type == THREAD_READY_READ_FD || thread->type == THREAD_READY_WRITE_FD) ? thread->event : NULL; + thread_type = thread->type; + thread_add_unuse(master, thread); + +diff --git a/lib/scheduler.h b/lib/scheduler.h +index 69324fe0..fea99cd0 100644 +--- a/lib/scheduler.h ++++ b/lib/scheduler.h +@@ -56,7 +56,8 @@ typedef enum { + THREAD_CHILD_TERMINATED, + THREAD_TERMINATE_START, + THREAD_TERMINATE, +- THREAD_READY_FD, ++ THREAD_READY_READ_FD, ++ THREAD_READY_WRITE_FD, + THREAD_READ_ERROR, + THREAD_WRITE_ERROR, + #ifdef USE_SIGNAL_THREADS +-- +2.23.0 + diff --git a/keepalived.spec b/keepalived.spec index c1dca52..8e73f42 100644 --- a/keepalived.spec +++ b/keepalived.spec @@ -10,7 +10,7 @@ Name: keepalived Summary: High Availability monitor built upon LVS, VRRP and service pollers Version: 2.0.19 -Release: 3%{?dist} +Release: 4%{?dist} License: GPLv2+ URL: http://www.keepalived.org/ @@ -18,6 +18,7 @@ Source0: http://www.keepalived.org/software/keepalived-%{version}.tar.gz Source1: keepalived.service Patch0: keepalived-fix-track_process-with-pids-32767.patch +Patch1: keepalived-fix-file-descriptor-errors-on-reload.patch Requires(post): systemd Requires(preun): systemd @@ -54,6 +55,7 @@ infrastructures. %prep %setup -q %patch0 -p1 +%patch1 -p1 %build %configure \ @@ -103,6 +105,9 @@ mkdir -p %{buildroot}%{_libexecdir}/keepalived %{_mandir}/man8/keepalived.8* %changelog +* Tue Nov 12 2019 Ryan O'Hara - 2.0.19-4 +- Fix file descriptor errors on reload + * Tue Nov 12 2019 Ryan O'Hara - 2.0.19-3 - Fix track_process with PIDs over 32767 (#1770766)