Skip to content

CachingFilteringSourceAccessor: Make the isAllowed() cache thread-safe - #16341

Open
edolstra wants to merge 1 commit into
masterfrom
sync-caching-filtering-source-accessor
Open

CachingFilteringSourceAccessor: Make the isAllowed() cache thread-safe#16341
edolstra wants to merge 1 commit into
masterfrom
sync-caching-filtering-source-accessor

Conversation

@edolstra

@edolstra edolstra commented Aug 21, 2026

Copy link
Copy Markdown
Member

Motivation

The cache in CachingFilteringSourceAccessor was a plain std::map mutated on every cache miss. With parallel evaluation, multiple eval threads can call isAllowed() on the same accessor concurrently (e.g. via builtins.readDir on a Git input fetched with exportIgnore), racing find() against emplace() and corrupting the tree. This caused segfaults like DETERMINATE-NIX-8W (a SEGV_MAPERR at offset 0x10, i.e. reading _M_left of a null red-black tree node).

Use boost::concurrent_flat_map instead, following the same pattern as CachingSourceAccessor.

Assisted-by: Claude Fable 5 noreply@anthropic.com

Context


Add 👍 to pull requests you find important.

The Nix maintainer team uses a GitHub project board to schedule and track reviews.

The cache in CachingFilteringSourceAccessor was a plain std::map
mutated on every cache miss. With parallel evaluation, multiple eval
threads can call isAllowed() on the same accessor concurrently (e.g.
via builtins.readDir on a Git input fetched with exportIgnore), racing
find() against emplace() and corrupting the tree. This caused
segfaults like DETERMINATE-NIX-8W (a SEGV_MAPERR at offset 0x10, i.e.
reading _M_left of a null red-black tree node).

Use boost::concurrent_flat_map instead, following the same pattern as
CachingSourceAccessor.

Assisted-by: Claude Fable 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the fetching Networking with the outside (non-Nix) world, input locking label Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fetching Networking with the outside (non-Nix) world, input locking

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant