Skip to content

sync: don't leak tracing spans in mutex guards #5469

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Feb 18, 2023

Conversation

Darksonn
Copy link
Contributor

Currently, MappedMutexGuard::map can leak a tracing span, which can lead to a memory leak. This PR fixes that.

I'd also like to add a tracing span to the other guards and add a mapped owned guard, but that can happen in a follow-up PR.

@Darksonn Darksonn added A-tokio Area: The main tokio crate M-sync Module: tokio/sync labels Feb 17, 2023
@github-actions github-actions bot added the R-loom Run loom tests on this PR label Feb 17, 2023
Copy link
Member

@hawkw hawkw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that, rather than ptr::reading the inner value, we could also mem::replace the span with tracing::Span::none() (which is totally empty and does not own a refcount) in safe code. this isn't substantially different but avoids an unsafe function. on the other hand, the code for mapping a MutexGuard is already unsafe...

Otherwise, panics in the tracing code could result in leaked guards.
@Darksonn
Copy link
Contributor Author

@hawkw We could do that to eliminate some of the unsafe, but there will remain some uses of ptr::read in owned guards. I think it makes more sense to use the same pattern everywhere so that it is consistent.

@hawkw
Copy link
Member

hawkw commented Feb 17, 2023

yup, that's reasonable! i just thought i'd mention it.

@Darksonn Darksonn merged commit 24aac0a into tokio-rs:master Feb 18, 2023
@Darksonn Darksonn deleted the alice/mutex-leak-span branch February 18, 2023 09:39
Noah-Kennedy added a commit that referenced this pull request Mar 1, 2023
# 1.26.0 (March 1st, 2023)

### Fixed

- sync: don't leak tracing spans in mutex guards ([#5469])
- sync: drop wakers after unlocking the mutex in Notify ([#5471])
- sync: drop wakers outside lock in semaphore ([#5475])
- macros: fix empty `join!` and `try_join!` ([#5504])

### Added

- fs: add `fs::try_exists` ([#4299])
- net: add types for named unix pipes ([#5351])
- sync: add `MappedOwnedMutexGuard` ([#5474])

### Documented

- task: clarify what happens to spawned work during runtime shutdown ([#5394])
- task: clarify `process::Command` docs (#5406) ([#5413])
- sync: add doc aliases for `blocking_*` methods ([#5448])
- task: fix wording with 'unsend' ([#5452])
- signal: updated Documentation for Signals ([#5459])
- sync: fix docs for Send/Sync bounds in broadcast ([#5480])
- io: improve AsyncFd example ([#5481])
- tokio: document supported platforms ([#5483])
- runtime: document the nature of the main future ([#5494])
- sync: document drop behavior for channels ([#5497])
- time: document immediate completion guarantee for timeouts ([#5509])
- runtime: remove extra period in docs ([#5511])

### Changed

- net: use Message Read Mode for named pipes ([#5350])
- chore: update windows-sys to 0.45 ([#5386])
- sync: mark lock guards with `#[clippy::has_significant_drop]` ([#5422])
- sync: reduce contention in watch channel ([#5464])
- time: remove cache padding in timer entries ([#5468])
- time: Improve `Instant::now()` perf with test-util ([#5513])

### Internal Changes
- tests: port proptest fuzz harnesses to use cargo-fuzz ([#5392])
- time: don't store deadline twice in sleep entries ([#5410])
- rt: remove Arc from Clock ([#5434])
- sync: make `notify_waiters` calls atomic ([#5458])
- net: refactor named pipe builders to not use bitfields ([#5477])
- io: use `poll_fn` in `copy_bidirectional` ([#5486])
- fs: add more tests for filesystem functionality ([#5493])
- net: fix test compilation failure ([#5506])
- io: ignore SplitByUtf8BoundaryIfWindows test on miri ([#5507])

### Unstable

- metrics: add a new metric for budget exhaustion yields ([#5517])

[#4299]: #4299
[#5350]: #5350
[#5351]: #5351
[#5386]: #5386
[#5392]: #5392
[#5394]: #5394
[#5410]: #5410
[#5413]: #5413
[#5422]: #5422
[#5434]: #5434
[#5448]: #5448
[#5452]: #5452
[#5458]: #5458
[#5459]: #5459
[#5464]: #5464
[#5468]: #5468
[#5469]: #5469
[#5471]: #5471
[#5474]: #5474
[#5475]: #5475
[#5477]: #5477
[#5480]: #5480
[#5481]: #5481
[#5483]: #5483
[#5486]: #5486
[#5493]: #5493
[#5494]: #5494
[#5497]: #5497
[#5504]: #5504
[#5506]: #5506
[#5507]: #5507
[#5509]: #5509
[#5511]: #5511
[#5513]: #5513
[#5517]: #5517
Noah-Kennedy added a commit that referenced this pull request Mar 1, 2023
# 1.26.0 (March 1st, 2023)

### Fixed

- macros: fix empty `join!` and `try_join!` ([#5504])
- sync: don't leak tracing spans in mutex guards ([#5469])
- sync: drop wakers after unlocking the mutex in Notify ([#5471])
- sync: drop wakers outside lock in semaphore ([#5475])

### Added

- fs: add `fs::try_exists` ([#4299])
- net: add types for named unix pipes ([#5351])
- sync: add `MappedOwnedMutexGuard` ([#5474])

### Changed

- chore: update windows-sys to 0.45 ([#5386])
- net: use Message Read Mode for named pipes ([#5350])
- sync: mark lock guards with `#[clippy::has_significant_drop]` ([#5422])
- sync: reduce contention in watch channel ([#5464])
- time: remove cache padding in timer entries ([#5468])
- time: Improve `Instant::now()` perf with test-util ([#5513])

### Internal Changes

- io: use `poll_fn` in `copy_bidirectional` ([#5486])
- net: refactor named pipe builders to not use bitfields ([#5477])
- rt: remove Arc from Clock ([#5434])
- sync: make `notify_waiters` calls atomic ([#5458])
- time: don't store deadline twice in sleep entries ([#5410])

### Unstable

- metrics: add a new metric for budget exhaustion yields ([#5517])

### Documented

- io: improve AsyncFd example ([#5481])
- runtime: document the nature of the main future ([#5494])
- runtime: remove extra period in docs ([#5511])
- signal: updated Documentation for Signals ([#5459])
- sync: add doc aliases for `blocking_*` methods ([#5448])
- sync: fix docs for Send/Sync bounds in broadcast ([#5480])
- sync: document drop behavior for channels ([#5497])
- task: clarify what happens to spawned work during runtime shutdown ([#5394])
- task: clarify `process::Command` docs ([#5413])
- task: fix wording with 'unsend' ([#5452])
- time: document immediate completion guarantee for timeouts ([#5509])
- tokio: document supported platforms ([#5483])

[#4299]: #4299
[#5350]: #5350
[#5351]: #5351
[#5386]: #5386
[#5394]: #5394
[#5410]: #5410
[#5413]: #5413
[#5422]: #5422
[#5434]: #5434
[#5448]: #5448
[#5452]: #5452
[#5458]: #5458
[#5459]: #5459
[#5464]: #5464
[#5468]: #5468
[#5469]: #5469
[#5471]: #5471
[#5474]: #5474
[#5475]: #5475
[#5477]: #5477
[#5480]: #5480
[#5481]: #5481
[#5483]: #5483
[#5486]: #5486
[#5494]: #5494
[#5497]: #5497
[#5504]: #5504
[#5509]: #5509
[#5511]: #5511
[#5513]: #5513
[#5517]: #5517
Noah-Kennedy added a commit that referenced this pull request Mar 1, 2023
# 1.26.0 (March 1st, 2023)

### Fixed

- macros: fix empty `join!` and `try_join!` ([#5504])
- sync: don't leak tracing spans in mutex guards ([#5469])
- sync: drop wakers after unlocking the mutex in Notify ([#5471])
- sync: drop wakers outside lock in semaphore ([#5475])

### Added

- fs: add `fs::try_exists` ([#4299])
- net: add types for named unix pipes ([#5351])
- sync: add `MappedOwnedMutexGuard` ([#5474])

### Changed

- chore: update windows-sys to 0.45 ([#5386])
- net: use Message Read Mode for named pipes ([#5350])
- sync: mark lock guards with `#[clippy::has_significant_drop]` ([#5422])
- sync: reduce contention in watch channel ([#5464])
- time: remove cache padding in timer entries ([#5468])
- time: Improve `Instant::now()` perf with test-util ([#5513])

### Internal Changes

- io: use `poll_fn` in `copy_bidirectional` ([#5486])
- net: refactor named pipe builders to not use bitfields ([#5477])
- rt: remove Arc from Clock ([#5434])
- sync: make `notify_waiters` calls atomic ([#5458])
- time: don't store deadline twice in sleep entries ([#5410])

### Unstable

- metrics: add a new metric for budget exhaustion yields ([#5517])

### Documented

- io: improve AsyncFd example ([#5481])
- runtime: document the nature of the main future ([#5494])
- runtime: remove extra period in docs ([#5511])
- signal: updated Documentation for Signals ([#5459])
- sync: add doc aliases for `blocking_*` methods ([#5448])
- sync: fix docs for Send/Sync bounds in broadcast ([#5480])
- sync: document drop behavior for channels ([#5497])
- task: clarify what happens to spawned work during runtime shutdown ([#5394])
- task: clarify `process::Command` docs ([#5413])
- task: fix wording with 'unsend' ([#5452])
- time: document immediate completion guarantee for timeouts ([#5509])
- tokio: document supported platforms ([#5483])

[#4299]: #4299
[#5350]: #5350
[#5351]: #5351
[#5386]: #5386
[#5394]: #5394
[#5410]: #5410
[#5413]: #5413
[#5422]: #5422
[#5434]: #5434
[#5448]: #5448
[#5452]: #5452
[#5458]: #5458
[#5459]: #5459
[#5464]: #5464
[#5468]: #5468
[#5469]: #5469
[#5471]: #5471
[#5474]: #5474
[#5475]: #5475
[#5477]: #5477
[#5480]: #5480
[#5481]: #5481
[#5483]: #5483
[#5486]: #5486
[#5494]: #5494
[#5497]: #5497
[#5504]: #5504
[#5509]: #5509
[#5511]: #5511
[#5513]: #5513
[#5517]: #5517
This was referenced Apr 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-tokio Area: The main tokio crate M-sync Module: tokio/sync R-loom Run loom tests on this PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants