Skip to content

fix: make Pool.SetLogger safe during concurrent task execution - #112

Merged
Yiming1997 merged 1 commit into
mainfrom
fix/setlogger-race
Oct 17, 2026
Merged

Yiming1997 merged 1 commit into
mainfrom
fix/setlogger-race

Conversation

@Yiming1997

Copy link
Copy Markdown
Owner

SetLogger wrote the Logger interface field (16 bytes) non-atomically while worker goroutines read it in handlePanic when reporting a recovered task panic. TSan reports this as a data race:

Read at ... (*Pool).handlePanic pool.go:718
Previous write at ... (*Pool).SetLogger pool.go:221

Store the logger in an atomic.Pointer[Logger] and read it through getLogger(), which also falls back to the standard-library logger after SetLogger(nil) instead of leaving a nil interface behind.

Tests:

  • TestAgilePoolSetLoggerConcurrentWithTaskPanics reproduces the race under -race against the previous implementation and also pins the visibility contract (the logger installed last receives the next panic report).
  • TestAgilePoolSetLoggerNilRestoresDefault covers the nil fallback path.

SetLogger wrote the Logger interface field (16 bytes) non-atomically while
worker goroutines read it in handlePanic when reporting a recovered task
panic. TSan reports this as a data race:

  Read at ... (*Pool).handlePanic         pool.go:718
  Previous write at ... (*Pool).SetLogger pool.go:221

Store the logger in an atomic.Pointer[Logger] and read it through
getLogger(), which also falls back to the standard-library logger after
SetLogger(nil) instead of leaving a nil interface behind.

Tests:
- TestAgilePoolSetLoggerConcurrentWithTaskPanics reproduces the race under
  -race against the previous implementation and also pins the visibility
  contract (the logger installed last receives the next panic report).
- TestAgilePoolSetLoggerNilRestoresDefault covers the nil fallback path.
@Yiming1997
Yiming1997 merged commit 1da62c5 into main Oct 17, 2026
1 check passed
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.

1 participant