diff --git a/SOURCES/0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch b/SOURCES/0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch new file mode 100644 index 0000000..fffb9e2 --- /dev/null +++ b/SOURCES/0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch @@ -0,0 +1,30 @@ +From e82899fd996f4901e1ec89d77e4a17a1032fee8f Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Thu, 3 Mar 2022 09:39:52 -0600 +Subject: [PATCH 1/4] sanlock: fix memory leak of lockspace renewal_history + +Leak was in original commit for "sanlock: renewal history" +6313c709722b3ba63234a75d1651a160bf1728ee. + +With the default renewal history size, each lockspace that +was created would leak about 4kb of memory. +--- + src/lockspace.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/lockspace.c b/src/lockspace.c +index 2ebc247dce41..d23dccd84815 100644 +--- a/src/lockspace.c ++++ b/src/lockspace.c +@@ -939,6 +939,8 @@ static void free_sp(struct space *sp) + { + if (sp->lease_status.renewal_read_buf) + free(sp->lease_status.renewal_read_buf); ++ if (sp->renewal_history) ++ free(sp->renewal_history); + free(sp); + } + +-- +2.7.5 + diff --git a/SOURCES/0002-sanlock-fix-pthread_create-error-check.patch b/SOURCES/0002-sanlock-fix-pthread_create-error-check.patch new file mode 100644 index 0000000..5809dc7 --- /dev/null +++ b/SOURCES/0002-sanlock-fix-pthread_create-error-check.patch @@ -0,0 +1,51 @@ +From e44c47c48a3a71502deacbafda851cb6d93e78c8 Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Wed, 9 Mar 2022 15:25:11 -0600 +Subject: [PATCH 2/4] sanlock: fix pthread_create error check + +for non-zero rather than less than zero +--- + src/lockspace.c | 4 ++-- + src/main.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/lockspace.c b/src/lockspace.c +index d23dccd84815..582a0e973566 100644 +--- a/src/lockspace.c ++++ b/src/lockspace.c +@@ -1070,8 +1070,8 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct + (unsigned long long)sp->host_id_disk.offset); + + rv = pthread_create(&sp->thread, NULL, lockspace_thread, sp); +- if (rv < 0) { +- log_erros(sp, "add_lockspace create thread failed"); ++ if (rv) { ++ log_erros(sp, "add_lockspace create thread failed %d", rv); + goto fail_del; + } + +diff --git a/src/main.c b/src/main.c +index 5b6fabc6d0b8..613fb0ee23d5 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -995,7 +995,7 @@ static int thread_pool_add_work(struct cmd_args *ca) + if (!pool.free_workers && pool.num_workers < pool.max_workers) { + rv = pthread_create(&th, NULL, thread_pool_worker, + (void *)(long)pool.num_workers); +- if (rv < 0) { ++ if (rv) { + log_error("thread_pool_add_work ci %d error %d", ca->ci_in, rv); + list_del(&ca->list); + pthread_mutex_unlock(&pool.mutex); +@@ -1035,7 +1035,7 @@ static int thread_pool_create(int min_workers, int max_workers) + for (i = 0; i < min_workers; i++) { + rv = pthread_create(&th, NULL, thread_pool_worker, + (void *)(long)i); +- if (rv < 0) ++ if (rv) + break; + pool.num_workers++; + } +-- +2.7.5 + diff --git a/SOURCES/0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch b/SOURCES/0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch new file mode 100644 index 0000000..f07cdcf --- /dev/null +++ b/SOURCES/0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch @@ -0,0 +1,42 @@ +From 4ed90cfb2462d3463ae74935c5eeb9d9588ea098 Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Thu, 17 Mar 2022 13:41:31 -0500 +Subject: [PATCH 3/4] Revert "sanlock: Shrink thread pool when there is no + work" + +This reverts commit 0ff9c1ab8852bec846822ee2af55ebcb7e5f5967. + +This patch causes unexplained growth in memory usage. +Part of the problem may be that the worker threads are +not joined and the detached state is not set, but an +initial test setting the detached state didn't seem +to fix the problem. +--- + src/main.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/main.c b/src/main.c +index 613fb0ee23d5..b447b723a490 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -946,9 +946,6 @@ static void *thread_pool_worker(void *data) + + while (1) { + while (!pool.quit && list_empty(&pool.work_data)) { +- if (pool.free_workers >= DEFAULT_MIN_WORKER_THREADS) +- goto out; +- + pool.free_workers++; + pthread_cond_wait(&pool.cond, &pool.mutex); + pool.free_workers--; +@@ -969,7 +966,6 @@ static void *thread_pool_worker(void *data) + break; + } + +-out: + pool.num_workers--; + if (!pool.num_workers) + pthread_cond_signal(&pool.quit_wait); +-- +2.7.5 + diff --git a/SOURCES/0004-sanlock-fix-pthread_create-error-paths.patch b/SOURCES/0004-sanlock-fix-pthread_create-error-paths.patch new file mode 100644 index 0000000..1b8fcd3 --- /dev/null +++ b/SOURCES/0004-sanlock-fix-pthread_create-error-paths.patch @@ -0,0 +1,63 @@ +From 574d3cc3ecccd1e8a6c1a8a861dd4847a05789f5 Mon Sep 17 00:00:00 2001 +From: David Teigland +Date: Fri, 18 Mar 2022 09:32:06 -0500 +Subject: [PATCH 4/4] sanlock: fix pthread_create error paths + +The fix for pthread_create errors in commit + 5abb9d50616d399914958b99352b8cf016e4928a + sanlock: fix pthread_create error check +missed error handling further in the exit path. +--- + src/lockspace.c | 1 + + src/main.c | 8 ++++++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/src/lockspace.c b/src/lockspace.c +index 582a0e973566..d9b79f6de257 100644 +--- a/src/lockspace.c ++++ b/src/lockspace.c +@@ -1072,6 +1072,7 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct + rv = pthread_create(&sp->thread, NULL, lockspace_thread, sp); + if (rv) { + log_erros(sp, "add_lockspace create thread failed %d", rv); ++ rv = -1; + goto fail_del; + } + +diff --git a/src/main.c b/src/main.c +index b447b723a490..5a0f9ba677ff 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -995,6 +995,7 @@ static int thread_pool_add_work(struct cmd_args *ca) + log_error("thread_pool_add_work ci %d error %d", ca->ci_in, rv); + list_del(&ca->list); + pthread_mutex_unlock(&pool.mutex); ++ rv = -1; + return rv; + } + pool.num_workers++; +@@ -1019,7 +1020,7 @@ static void thread_pool_free(void) + static int thread_pool_create(int min_workers, int max_workers) + { + pthread_t th; +- int i, rv; ++ int i, rv = 0; + + memset(&pool, 0, sizeof(pool)); + INIT_LIST_HEAD(&pool.work_data); +@@ -1031,8 +1032,11 @@ static int thread_pool_create(int min_workers, int max_workers) + for (i = 0; i < min_workers; i++) { + rv = pthread_create(&th, NULL, thread_pool_worker, + (void *)(long)i); +- if (rv) ++ if (rv) { ++ log_error("thread_pool_create failed %d", rv); ++ rv = -1; + break; ++ } + pool.num_workers++; + } + +-- +2.7.5 + diff --git a/SPECS/sanlock.spec b/SPECS/sanlock.spec index c7689b3..c6db01a 100644 --- a/SPECS/sanlock.spec +++ b/SPECS/sanlock.spec @@ -1,6 +1,6 @@ Name: sanlock Version: 3.8.4 -Release: 1%{?dist} +Release: 4%{?dist} Summary: A shared storage lock manager License: GPLv2 and GPLv2+ and LGPLv2+ @@ -22,11 +22,20 @@ Requires(preun): systemd-units Requires(postun): systemd-units Source0: https://releases.pagure.org/sanlock/%{name}-%{version}.tar.gz +Patch0: 0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch +Patch1: 0002-sanlock-fix-pthread_create-error-check.patch +Patch2: 0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch +Patch3: 0004-sanlock-fix-pthread_create-error-paths.patch + %description The sanlock daemon manages leases for applications on hosts using shared storage. %prep %setup -q +%patch0 -p1 -b .backup0 +%patch1 -p1 -b .backup1 +%patch2 -p1 -b .backup2 +%patch3 -p1 -b .backup3 %build %set_build_flags @@ -153,6 +162,9 @@ developing applications that use %{name}. %{_libdir}/pkgconfig/libsanlock_client.pc %changelog +* Fri Apr 01 2022 David Teigland - 3.8.4-4 +- fixes for thread/memory leak + * Mon Aug 23 2021 David Teigland - 3.8.4-1 - Update rhel9 beta version to match latest rhel8