From 919e132d89bdb93060c72fca24b0b755ed9d4c10 Mon Sep 17 00:00:00 2001 From: vshepard Date: Thu, 30 Jul 2026 14:24:37 +0200 Subject: [PATCH 1/2] Fix worker segfault on shutdown from leaked log-reader thread logger.py: start TestgresLogger with deamon=true node.py: run pg_ctl stop in try/finally --- src/__init__.py | 2 +- src/logger.py | 2 +- src/node.py | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 794ca89d..393556ff 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -57,7 +57,7 @@ from testgres.operations.local_ops import LocalOperations from testgres.operations.remote_ops import RemoteOperations -__version__ = "1.14.4" +__version__ = "1.14.5" __all__ = [ "get_new_node", diff --git a/src/logger.py b/src/logger.py index b4648f44..9dce5554 100644 --- a/src/logger.py +++ b/src/logger.py @@ -11,7 +11,7 @@ class TestgresLogger(threading.Thread): Helper class to implement reading from log files. """ def __init__(self, node_name, log_file_name): - threading.Thread.__init__(self) + threading.Thread.__init__(self, daemon=True) self._node_name = node_name self._log_file_name = log_file_name diff --git a/src/node.py b/src/node.py index aac4893c..3b7b5666 100644 --- a/src/node.py +++ b/src/node.py @@ -580,6 +580,12 @@ def _try_shutdown(self, max_attempts, with_force=False): assert type(with_force) is bool assert max_attempts > 0 + try: + self._try_shutdown_internal(max_attempts, with_force) + finally: + self._maybe_stop_logger() + + def _try_shutdown_internal(self, max_attempts, with_force): attempts = 0 # try stopping server N times @@ -1221,11 +1227,13 @@ def stop(self, params=[], wait=True): "stop" ] + params # yapf: disable - execute_utility2(self._os_ops, _params, self.utils_log_file) - - self._manually_started_pm_pid = None - - self._maybe_stop_logger() + try: + execute_utility2(self._os_ops, _params, self.utils_log_file) + self._manually_started_pm_pid = None + finally: + # always stop the reader thread, even if pg_ctl stop failed, + # so it can't leak into interpreter shutdown. + self._maybe_stop_logger() return self def kill(self, someone=None): From 92415d06838f43eb4364d61a760fed7817de9e6c Mon Sep 17 00:00:00 2001 From: vshepard Date: Fri, 31 Jul 2026 21:08:36 +0200 Subject: [PATCH 2/2] Up version --- src/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__init__.py b/src/__init__.py index 393556ff..a04dc9a0 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -57,7 +57,7 @@ from testgres.operations.local_ops import LocalOperations from testgres.operations.remote_ops import RemoteOperations -__version__ = "1.14.5" +__version__ = "1.15.2" __all__ = [ "get_new_node",