Skip to content

Destroy MinionManager event resources deterministically - #70179

Open
twangboy wants to merge 2 commits into
saltstack:3008.xfrom
twangboy:fix/70175/3008.x
Open

Destroy MinionManager event resources deterministically#70179
twangboy wants to merge 2 commits into
saltstack:3008.xfrom
twangboy:fix/70175/3008.x

Conversation

@twangboy

Copy link
Copy Markdown
Contributor

What does this PR do?

The minion logged loud "unclosed publish server", "unclosed SyncWrapper", and "unclosed publisher client" WARNING messages after losing its master connection with no working failover. Root cause was two gaps in MinionManager's teardown:

  • MinionManager.destroy() never closed event_publisher / event; only stop_async() (the SIGTERM path) did.

  • cli/daemons.py's Minion.start() never called shutdown() / destroy() when _real_start() raised SaltClientError because self.minion.restart was True -- it just returned, leaving event_publisher / event to be reclaimed only by __del__'s GC-time safety net.

  • salt/minion.py: MinionManager.destroy() now also closes event_publisher and destroys event, mirroring stop_async().

  • salt/cli/daemons.py: Minion.start() now destroys the MinionManager on SaltClientError, both before retrying (daemonized multi-master failover) and before falling through to the final break / return.

What issues does this PR fix or reference?

Fixes #70175

Merge requirements satisfied?

[NOTICE] Bug fixes or features added to Salt require tests.

Commits signed with GPG?

Yes

The minion logged loud "unclosed publish server", "unclosed
SyncWrapper", and "unclosed publisher client" WARNING messages after
losing its master connection with no working failover. Root cause was
two gaps in MinionManager's teardown:

- MinionManager.destroy() never closed event_publisher/event; only
  stop_async() (the SIGTERM path) did.
- cli/daemons.py's Minion.start() never called shutdown()/destroy()
  when _real_start() raised SaltClientError because
  self.minion.restart was True -- it just returned, leaving
  event_publisher/event to be reclaimed only by __del__'s GC-time
  safety net.

- salt/minion.py: MinionManager.destroy() now also closes
  event_publisher and destroys event, mirroring stop_async().
- salt/cli/daemons.py: Minion.start() now destroys the MinionManager
  on SaltClientError, both before retrying (daemonized multi-master
  failover) and before falling through to the final break/return.

Fixes saltstack#70175
@twangboy
twangboy requested a review from a team as a code owner August 28, 2026 19:48
@twangboy twangboy self-assigned this Aug 28, 2026
@twangboy twangboy added the test:full Run the full test suite label Aug 28, 2026
@twangboy twangboy added this to the Argon v3008.3 milestone Aug 28, 2026
pre-commit's pinned black (24.2.0) wraps these with/patch.object chains
differently than a newer local black run had produced. Fixes the
"Pre-Commit / Run Pre-Commit Against Salt" CI failure on PR saltstack#70179.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

test:full Run the full test suite

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant