Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Release 3.23.3 (2026-10-16)

Garbage collector race fixes

The garbage collector could in rare cases delete a store path while another process was still creating it, leaving a path that is registered as valid but missing on disk (and errors like cannot delete path ... because it is in use by ...). This was caused by several races in the handling of temporary GC roots, notably when multiple threads in the same process (such as evaluator threads) register temporary roots at the same time, or when multiple processes share a PID (e.g. in PID namespaces). These races have been fixed.

PR: DeterminateSystems/nix-src#696

Bug fixes

  • Fix crashes on exit (in particular in nix-daemon workers) caused by destructor ordering issues by @edolstra in DeterminateSystems/nix-src#690
  • Ignore empty or relative $HOME, $XDG_*_HOME and $NIX_*_HOME environment variables, which caused Nix to create stray .cache/nix directories in the current directory by @edolstra in DeterminateSystems/nix-src#695
  • Show a waiting for lock on ... status when Nix is blocked because another process is substituting or adding the same store path, rather than a seemingly stalled download by @edolstra in DeterminateSystems/nix-src#692
  • Include the names and metadata of activities performed by the Nix daemon in JSON logs (--log-format internal-json and json-log-path) by @edolstra in DeterminateSystems/nix-src#693
  • On macOS, don’t report quitting Nix with Ctrl-\ (SIGQUIT) as a crash by @edolstra in DeterminateSystems/nix-src#694

Performance improvements

Miscellaneous changes

Full Changelog: v3.23.2…v3.23.3