Skip to content

refactor: narrow async lock scopes#18418

Merged
bolinfest merged 1 commit intomainfrom
pr18418
Apr 21, 2026
Merged

refactor: narrow async lock scopes#18418
bolinfest merged 1 commit intomainfrom
pr18418

Conversation

@bolinfest
Copy link
Copy Markdown
Collaborator

@bolinfest bolinfest commented Apr 17, 2026

Why

This is part of the follow-up work from #18178 to make Codex ready for Clippy's await_holding_lock / await_holding_invalid_type lints.

This bottom PR keeps the scope intentionally small: NetworkProxyState::record_blocked() only needs the state write lock while it mutates the blocked-request ring buffer and counters. The debug log payload and BlockedRequestObserver callback can be produced after that lock is released.

What changed

  • Copies the blocked-request snapshot values needed for logging while updating the state.
  • Releases the RwLockWriteGuard before logging or notifying the observer.

Verification

  • cargo test -p codex-network-proxy

Stack created with Sapling. Best reviewed with ReviewStack.

@bolinfest bolinfest changed the base branch from main to pr18403 April 17, 2026 23:31
@bolinfest bolinfest changed the title refactor: drop data locks before async work refactor: narrow async lock scopes Apr 17, 2026
Base automatically changed from pr18403 to main April 20, 2026 17:21
@bolinfest bolinfest requested a review from a team as a code owner April 20, 2026 17:21
bolinfest added a commit that referenced this pull request Apr 20, 2026
This is the second cleanup in the await-holding lint stack. The
higher-level goal, following #18178
and #18398, is to enable Clippy
coverage for guards held across `.await` points without carrying broad
suppressions.

The stack is working toward enabling Clippy's
[`await_holding_lock`](https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock)
lint and the configurable
[`await_holding_invalid_type`](https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_invalid_type)
lint for Tokio guard types.

Several existing fields used `tokio::sync::Mutex<()>` only as
one-at-a-time async gates. Those guards intentionally lived across
`.await` while an operation was serialized. A mutex over `()` suggests
protected data and trips the await-holding lint shape; a single-permit
`tokio::sync::Semaphore` expresses the intended serialization directly.

## What changed

- Replace `Mutex<()>` serialization gates with `Semaphore::new(1)` for
agent identity ensure, exec policy updates, guardian review session
reuse, plugin remote sync, managed network proxy refresh, auth token
refresh, and RMCP session recovery.
- Update call sites from `lock().await` / `try_lock()` to
`acquire().await` / `try_acquire()`.
- Map closed-semaphore errors into the existing local error types, even
though these semaphores are owned for the lifetime of their managers.
- Update session test builders for the new
`managed_network_proxy_refresh_lock` type.

## Verification

- The split stack was verified at the final lint-enabling head with
`just clippy`.





---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/18403).
* #18698
* #18423
* #18418
* __->__ #18403
@bolinfest bolinfest force-pushed the pr18418 branch 8 times, most recently from 80662ac to f876ccb Compare April 21, 2026 00:25
@bolinfest bolinfest enabled auto-merge (squash) April 21, 2026 01:57
@bolinfest bolinfest merged commit ff05532 into main Apr 21, 2026
39 of 50 checks passed
@bolinfest bolinfest deleted the pr18418 branch April 21, 2026 02:23
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants