runtime: fix TOCTOU issue when decreasing num_idle_threads#7918
Merged
ADD-SP merged 3 commits intotokio-rs:masterfrom Feb 18, 2026
Merged
runtime: fix TOCTOU issue when decreasing num_idle_threads#7918ADD-SP merged 3 commits intotokio-rs:masterfrom
num_idle_threads#7918ADD-SP merged 3 commits intotokio-rs:masterfrom
Conversation
Darksonn
reviewed
Feb 17, 2026
martin-g
approved these changes
Feb 17, 2026
Member
|
CI on e65040f just failed with an underflow again. |
Member
Author
Yes, there is still a race condition, it might not be easy to fix. I tried to fix it the last night, will continue today. |
This was referenced Feb 20, 2026
jimsynz
pushed a commit
to jimsynz/neonfs
that referenced
this pull request
Mar 6, 2026
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [tokio](https://tokio.rs) ([source](https://github.com/tokio-rs/tokio)) | dependencies | minor | `1.49.0` → `1.50.0` | --- ### Release Notes <details> <summary>tokio-rs/tokio (tokio)</summary> ### [`v1.50.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.50.0): Tokio v1.50.0 [Compare Source](tokio-rs/tokio@tokio-1.49.0...tokio-1.50.0) ### 1.50.0 (Mar 3rd, 2026) ##### Added - net: add `TcpStream::set_zero_linger` ([#​7837]) - rt: add `is_rt_shutdown_err` ([#​7771]) ##### Changed - io: add optimizer hint that `memchr` returns in-bounds pointer ([#​7792]) - io: implement vectored writes for `write_buf` ([#​7871]) - runtime: panic when `event_interval` is set to 0 ([#​7838]) - runtime: shorten default thread name to fit in Linux limit ([#​7880]) - signal: remember the result of `SetConsoleCtrlHandler` ([#​7833]) - signal: specialize windows `Registry` ([#​7885]) ##### Fixed - io: always cleanup `AsyncFd` registration list on deregister ([#​7773]) - macros: remove (most) local `use` declarations in `tokio::select!` ([#​7929]) - net: fix `GET_BUF_SIZE` constant for `target_os = "android"` ([#​7889]) - runtime: avoid redundant unpark in current\_thread scheduler ([#​7834]) - runtime: don't park in `current_thread` if `before_park` defers waker ([#​7835]) - io: fix write readiness on ESP32 on short writes ([#​7872]) - runtime: wake deferred tasks before entering `block_in_place` ([#​7879]) - sync: drop rx waker when oneshot receiver is dropped ([#​7886]) - runtime: fix double increment of `num_idle_threads` on shutdown ([#​7910], [#​7918], [#​7922]) ##### Unstable - fs: check for io-uring opcode support ([#​7815]) - runtime: avoid lock acquisition after uring init ([#​7850]) ##### Documented - docs: update outdated unstable features section ([#​7839]) - io: clarify the behavior of `AsyncWriteExt::shutdown()` ([#​7908]) - io: explain how to flush stdout/stderr ([#​7904]) - io: fix incorrect and confusing `AsyncWrite` documentation ([#​7875]) - rt: clarify the documentation of `Runtime::spawn` ([#​7803]) - rt: fix missing quotation in docs ([#​7925]) - runtime: correct the default thread name in docs ([#​7896]) - runtime: fix `event_interval` doc ([#​7932]) - sync: clarify RwLock fairness documentation ([#​7919]) - sync: clarify that `recv` returns `None` once closed and no more messages ([#​7920]) - task: clarify when to use `spawn_blocking` vs dedicated threads ([#​7923]) - task: doc that task drops before `JoinHandle` completion ([#​7825]) - signal: guarantee that listeners never return `None` ([#​7869]) - task: fix task module feature flags in docs ([#​7891]) - task: fix two typos ([#​7913]) - task: improve the docs of `Builder::spawn_local` ([#​7828]) - time: add docs about auto-advance and when to use sleep ([#​7858]) - util: fix typo in docs ([#​7926]) [#​7771]: tokio-rs/tokio#7771 [#​7773]: tokio-rs/tokio#7773 [#​7792]: tokio-rs/tokio#7792 [#​7803]: tokio-rs/tokio#7803 [#​7815]: tokio-rs/tokio#7815 [#​7825]: tokio-rs/tokio#7825 [#​7828]: tokio-rs/tokio#7828 [#​7833]: tokio-rs/tokio#7833 [#​7834]: tokio-rs/tokio#7834 [#​7835]: tokio-rs/tokio#7835 [#​7837]: tokio-rs/tokio#7837 [#​7838]: tokio-rs/tokio#7838 [#​7839]: tokio-rs/tokio#7839 [#​7850]: tokio-rs/tokio#7850 [#​7858]: tokio-rs/tokio#7858 [#​7869]: tokio-rs/tokio#7869 [#​7871]: tokio-rs/tokio#7871 [#​7872]: tokio-rs/tokio#7872 [#​7875]: tokio-rs/tokio#7875 [#​7879]: tokio-rs/tokio#7879 [#​7880]: tokio-rs/tokio#7880 [#​7885]: tokio-rs/tokio#7885 [#​7886]: tokio-rs/tokio#7886 [#​7889]: tokio-rs/tokio#7889 [#​7891]: tokio-rs/tokio#7891 [#​7896]: tokio-rs/tokio#7896 [#​7904]: tokio-rs/tokio#7904 [#​7908]: tokio-rs/tokio#7908 [#​7910]: tokio-rs/tokio#7910 [#​7913]: tokio-rs/tokio#7913 [#​7918]: tokio-rs/tokio#7918 [#​7919]: tokio-rs/tokio#7919 [#​7920]: tokio-rs/tokio#7920 [#​7922]: tokio-rs/tokio#7922 [#​7923]: tokio-rs/tokio#7923 [#​7925]: tokio-rs/tokio#7925 [#​7926]: tokio-rs/tokio#7926 [#​7929]: tokio-rs/tokio#7929 [#​7932]: tokio-rs/tokio#7932 </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) in timezone Pacific/Auckland, Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) in timezone Pacific/Auckland. 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41Mi4xIiwidXBkYXRlZEluVmVyIjoiNDMuNTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=--> Reviewed-on: https://harton.dev/project-neon/neonfs/pulls/53 Co-authored-by: Renovate Bot <bot@harton.nz> Co-committed-by: Renovate Bot <bot@harton.nz>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up of #7910.
FIx a flaky test: https://github.com/tokio-rs/tokio/actions/runs/22089452533/job/63831219292
This bug was introduced in d2ba276, which changed the metrics from a ordinary counter to atomic counter, so there is a TOCTOU issue.
Apparently, we can catch the underflow/overflow issue via CAS loop. However, it will be a significant change, thus I prefer to delete this assertion to address the flaky test at first.
But I would highly suggest to check the underflow/overflow in the implementation of
MetricAtomicUsizelater, and also measure the performance impact. Correctness should over the performance. Or introducing something likechecked_subfor caller to optimize the performance.