Accepting request 946348 from network:ha-clustering:Factory

- Retry if posix_fallocate is interrupted with EINTR (#453) (gh#ClusterLabs/libqb#451, bsc#1193737, bsc#1193912)
  * bsc#1193737-0001-Retry-if-posix_fallocate-is-interrupted-with-EINTR-4.patch

- IPC: server: avoid temporary channel priority loss, up to deadlock-worth (gh#ClusterLabs/libqb#352, rh#1718773, bsc#1188212) (forwarded request 946347 from yan_gao)

OBS-URL: https://build.opensuse.org/request/show/946348
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqb?expand=0&rev=33
This commit is contained in:
Dominique Leuenberger 2022-01-15 20:45:08 +00:00 committed by Git OBS Bridge
commit 69aa06fa5e
3 changed files with 88 additions and 2 deletions

View File

@ -0,0 +1,78 @@
From 176eae8f13278a5a3dab3699b84e1dc9a8d4ae11 Mon Sep 17 00:00:00 2001
From: Jakub Jankowski <shasta@toxcorp.com>
Date: Fri, 14 Jan 2022 08:57:25 +0100
Subject: [PATCH] Retry if posix_fallocate is interrupted with EINTR (#453)
Every now and then Pacemaker reports errors:
(pcmk__new_client) debug: New IPC client 3efdbecf-c2d9-44bc-b4a6-9bcd48021ba1 for PID 27492 with uid 0 and gid 0
(handle_new_connection) debug: IPC credentials authenticated (/dev/shm/qb-7271-27492-12-hfPbKY/qb)
(qb_ipcs_shm_connect) debug: connecting to client [27492]
(qb_rb_open_2) debug: shm size:524301; real_size:528384; rb->word_size:132096
(qb_rb_open_2) debug: shm size:524301; real_size:528384; rb->word_size:132096
(qb_sys_mmap_file_open) error: couldn't allocate file /dev/shm/qb-7271-27492-12-hfPbKY/qb-event-cib_rw-data: Interrupted system call (4)
(qb_rb_open_2) error: couldn't create file for mmap
(qb_ipcs_shm_rb_open) error: qb_rb_open:/dev/shm/qb-7271-27492-12-hfPbKY/qb-event-cib_rw: Interrupted system call (4)
(qb_rb_close_helper) debug: Free'ing ringbuffer: /dev/shm/qb-7271-27492-12-hfPbKY/qb-response-cib_rw-header
(qb_rb_close_helper) debug: Free'ing ringbuffer: /dev/shm/qb-7271-27492-12-hfPbKY/qb-request-cib_rw-header
(qb_ipcs_shm_connect) error: shm connection FAILED: Interrupted system call (4)
(handle_new_connection) error: Error in connection setup (/dev/shm/qb-7271-27492-12-hfPbKY/qb): Interrupted system call (4)
While it probably might be addressed in Pacemaker code, a simple retry
loop in case posix_fallocate(3) returns EINTR seems to be a decent
workaround.
Fixes: #451
Signed-off-by: Jakub Jankowski <shasta@toxcorp.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
---
lib/unix.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/lib/unix.c b/lib/unix.c
index 2fb53d0..b631cbf 100644
--- a/lib/unix.c
+++ b/lib/unix.c
@@ -81,6 +81,9 @@ qb_sys_mmap_file_open(char *path, const char *file, size_t bytes,
int32_t i;
#endif
char *is_absolute = strchr(file, '/');
+#ifdef HAVE_POSIX_FALLOCATE
+ int32_t fallocate_retry = 5;
+#endif
if (is_absolute) {
(void)strlcpy(path, file, PATH_MAX);
@@ -121,12 +124,22 @@ qb_sys_mmap_file_open(char *path, const char *file, size_t bytes,
}
#endif
#ifdef HAVE_POSIX_FALLOCATE
- if ((res = posix_fallocate(fd, 0, bytes)) != 0) {
- errno = res;
- res = -1 * res;
- qb_util_perror(LOG_ERR, "couldn't allocate file %s", path);
- goto unlink_exit;
- }
+ /* posix_fallocate(3) can be interrupted by a signal,
+ so retry few times before giving up */
+ do {
+ fallocate_retry--;
+ res = posix_fallocate(fd, 0, bytes);
+ if (res == EINTR) {
+ qb_util_log(LOG_DEBUG, "got EINTR trying to allocate file %s, retrying...", path);
+ continue;
+ } else if (res != 0) {
+ errno = res;
+ res = -1 * res;
+ qb_util_perror(LOG_ERR, "couldn't allocate file %s", path);
+ goto unlink_exit;
+ }
+ break;
+ } while (fallocate_retry > 0);
#else
if (file_flags & O_CREAT) {
long page_size = sysconf(_SC_PAGESIZE);
--
2.31.1

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri Jan 14 08:06:10 UTC 2022 - Yan Gao <ygao@suse.com>
- Retry if posix_fallocate is interrupted with EINTR (#453) (gh#ClusterLabs/libqb#451, bsc#1193737, bsc#1193912)
* bsc#1193737-0001-Retry-if-posix_fallocate-is-interrupted-with-EINTR-4.patch
-------------------------------------------------------------------
Thu Nov 25 15:05:06 UTC 2021 - Dominique Leuenberger <dimstar@opensuse.org>
@ -86,7 +92,7 @@ Mon May 04 11:17:51 UTC 2020 - Yan Gao <ygao@suse.com>
- log: Set errno when qb_log_target_alloc() fails
- ipc: Remove kqueue EOF log message
- ipc: fix force-filesystem-sockets
- IPC: server: avoid temporary channel priority loss, up to deadlock-worth (rh#1718773)
- IPC: server: avoid temporary channel priority loss, up to deadlock-worth (gh#ClusterLabs/libqb#352, rh#1718773, bsc#1188212)
- ipc: Use mkdtemp for more secure IPC files
-------------------------------------------------------------------

View File

@ -1,7 +1,7 @@
#
# spec file for package libqb
#
# Copyright (c) 2021 SUSE LLC
# Copyright (c) 2022 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -29,6 +29,7 @@ Group: Development/Libraries/C and C++
URL: https://github.com/ClusterLabs/libqb
Source0: %{name}-%{version}.tar.xz
Source1: baselibs.conf
Patch1: bsc#1193737-0001-Retry-if-posix_fallocate-is-interrupted-with-EINTR-4.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: autoconf
@ -75,6 +76,7 @@ features. It provides logging, tracing, IPC, and polling.
%prep
%setup -q -n %{name}-%{version}
%patch1 -p1
%build
if [ ! -f .tarball-version ]; then