Skip to content

fix(amqp091): close race on BrokerDetails.clientDisconnect - #102

Merged
miotte merged 3 commits into
mainfrom
miotte-pr7
Jun 10, 2026
Merged

fix(amqp091): close race on BrokerDetails.clientDisconnect#102
miotte merged 3 commits into
mainfrom
miotte-pr7

Conversation

@miotte

@miotte miotte commented May 22, 2026

Copy link
Copy Markdown
Contributor

Fixes #101

Switch BrokerDetails.clientDisconnect from bool to atomic.Bool so the connectionWatcher goroutine and the Disconnect caller can no longer race, mirroring the pattern already used in streamshim.go.

@bithckr

bithckr commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Are we still working on this, the lint check is failing. It looks like these changes are a part of other PRs too.

miotte added 3 commits June 10, 2026 09:54
The connectionWatcher goroutine reads bd.clientDisconnect in its main
loop and in the reconnect retry loop, while Disconnect writes it from
the caller goroutine. Both sides were plain bool accesses with no
synchronization, which the race detector reliably flags during
Test_StreamRetry (and several other tests that exercise the
Connect/Disconnect path).

Switch the field to atomic.Bool, matching the pattern already used for
the analogous flag on streamConnectionShim in streamshim.go. The
connect() early-out and both watcher loops use Load(); Disconnect uses
Store(true).

The struct-literal initializer was dropped because atomic.Bool's zero
value is already false, and the three test sites that re-set the flag
to false on a freshly-constructed BrokerDetails were similarly
redundant.

Signed-off-by: Michael Otteni <MichaelGOtteni@gmail.com>
* test(amqp091): join connectionWatcher goroutines in teardown

Add a sync.WaitGroup to BrokerDetails so the connectionWatcher goroutine
started by Connect is joinable, and a stopWatcher test helper that
disconnects a client and waits for its watcher to exit. Defer it in every
Connect-based test so a watcher can no longer outlive its test and either
race the package-level NewAmqpConn091 swap (read in connect()) or panic
calling IsClosed() on a stale mock from its 30s fallback branch.

---------

Signed-off-by: Michael Otteni <MichaelGOtteni@gmail.com>
The stopWatcher teardown line added in #109 pushed the near-identical
Test_ClientExists/Test_ClientExists_false pair over golangci-lint's dupl
threshold. Collapse them into one table-driven test so the shared setup
lives in a single place.

Signed-off-by: Michael Otteni <MichaelGOtteni@gmail.com>
@miotte

miotte commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

merged PR #104 and rebased this on top of main and resolved conflicts as well as the test

@miotte
miotte merged commit 7853b3e into main Jun 10, 2026
4 of 5 checks passed
@miotte
miotte deleted the miotte-pr7 branch June 10, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Race in BrokerDetails.clientDisconnect between Disconnect and connectionWatcher

4 participants