this derivation will be built: /nix/store/k5h32sbh1x16928i48i5l9ayvryaxqrk-nix-eval-jobs-functional-tests.drv building '/nix/store/k5h32sbh1x16928i48i5l9ayvryaxqrk-nix-eval-jobs-functional-tests.drv' nix-eval-jobs-functional-tests> tribuchet: building on jamie nix-eval-jobs-functional-tests> ============================= test session starts ============================== nix-eval-jobs-functional-tests> platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0 -- /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/bin/python3.14 nix-eval-jobs-functional-tests> cachedir: .pytest_cache nix-eval-jobs-functional-tests> rootdir: /build nix-eval-jobs-functional-tests> collecting ... collected 33 items nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_flake PASSED [ 3%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_query_cache_status PASSED [ 6%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_expression PASSED [ 9%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_input_drvs PASSED [ 12%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_odd_attribute_names_and_cycles PASSED [ 15%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_closed_stdout_aborts PASSED [ 18%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_rejects_bad_numeric_flags[flag0] PASSED [ 21%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_rejects_bad_numeric_flags[flag1] PASSED [ 24%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_rejects_bad_numeric_flags[flag2] PASSED [ 27%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_rejects_bad_numeric_flags[flag3] PASSED [ 30%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_worker_exits_cleanly_when_collector_disappears PASSED [ 33%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_eval_error PASSED [ 36%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_eval_logs_per_attr PASSED [ 39%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_no_gcroot_dir PASSED [ 42%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_daemon_only_settings_do_not_warn PASSED [ 45%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents PASSED [ 48%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_all PASSED [ 51%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_glob_misc PASSED [ 54%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_cycle PASSED [ 57%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_error PASSED [ 60%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_empty_needed PASSED [ 63%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_apply PASSED [ 66%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_select_flake PASSED [ 69%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_recursion_error PASSED [ 72%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_no_instantiate_mode PASSED [ 75%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_fod_with_uncached_input_issue413[file] PASSED [ 78%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_fod_with_uncached_input_issue413[http] PASSED [ 81%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_ifd_with_separate_eval_store PASSED [ 84%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_worker_log_format_survives_fork PASSED [ 87%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_worker_restart_on_last_job_exits_cleanly PASSED [ 90%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_fetchers_survive_worker_restart PASSED [ 93%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_workers_do_not_race_flake_fetch FAILED [ 96%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_memory_budget_evicts_and_reports_fat_attr PASSED [100%] nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> =================================== FAILURES =================================== nix-eval-jobs-functional-tests> _____________________ test_workers_do_not_race_flake_fetch _____________________ nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> tmp_path = PosixPath('/build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0') nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> def test_workers_do_not_race_flake_fetch(tmp_path: Path) -> None: nix-eval-jobs-functional-tests> """Workers fetching the same flake input concurrently spam "waiting nix-eval-jobs-functional-tests> for another Nix process to finish fetching input" (issue #432).""" nix-eval-jobs-functional-tests> env = _hermetic_nix_env(tmp_path) nix-eval-jobs-functional-tests> repo = tmp_path / "flake" nix-eval-jobs-functional-tests> repo.mkdir() nix-eval-jobs-functional-tests> jobs = "\n".join( nix-eval-jobs-functional-tests> f""" nix-eval-jobs-functional-tests> job-{i} = derivation {{ nix-eval-jobs-functional-tests> name = "race-{i}"; nix-eval-jobs-functional-tests> system = "x86_64-linux"; nix-eval-jobs-functional-tests> builder = "/bin/sh"; nix-eval-jobs-functional-tests> args = [ "-c" "echo {i} > $out" ]; }};""" nix-eval-jobs-functional-tests> for i in range(8) nix-eval-jobs-functional-tests> ) nix-eval-jobs-functional-tests> repo.joinpath("flake.nix").write_text(f"{{ outputs = _: {{ hydraJobs = {{ {jobs} }}; }}; }}") nix-eval-jobs-functional-tests> subprocess.run(["git", "init", "-q"], cwd=repo, check=True, env=env) nix-eval-jobs-functional-tests> subprocess.run(["git", "add", "flake.nix"], cwd=repo, check=True, env=env) nix-eval-jobs-functional-tests> subprocess.run( nix-eval-jobs-functional-tests> ["git", "-c", "user.email=t@t", "-c", "user.name=t", "commit", "-qm", "init"], nix-eval-jobs-functional-tests> cwd=repo, nix-eval-jobs-functional-tests> check=True, nix-eval-jobs-functional-tests> env=env, nix-eval-jobs-functional-tests> ) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> > res = subprocess.run( nix-eval-jobs-functional-tests> [ nix-eval-jobs-functional-tests> str(BIN), nix-eval-jobs-functional-tests> "--gc-roots-dir", nix-eval-jobs-functional-tests> str(tmp_path / "gc"), nix-eval-jobs-functional-tests> "--workers", nix-eval-jobs-functional-tests> "8", nix-eval-jobs-functional-tests> *COMMON_FLAGS, nix-eval-jobs-functional-tests> "--flake", nix-eval-jobs-functional-tests> f"git+file://{repo}#hydraJobs", nix-eval-jobs-functional-tests> ], nix-eval-jobs-functional-tests> env=env, nix-eval-jobs-functional-tests> text=True, nix-eval-jobs-functional-tests> check=True, nix-eval-jobs-functional-tests> capture_output=True, nix-eval-jobs-functional-tests> ) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> tests-functional/test_eval.py:1034: nix-eval-jobs-functional-tests> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> input = None, capture_output = True, timeout = None, check = True nix-eval-jobs-functional-tests> popenargs = (['/nix/store/v7fgcpx3ram406y75pi5fqg854g6y4va-nix-eval-jobs-2.35.3/bin/nix-eval-jobs', '--gc-roots-dir', '/build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0/gc', '--workers', '8', '--extra-experimental-features', ...],) nix-eval-jobs-functional-tests> kwargs = {'env': {'SHELL': '/nix/store/svx59425zxp552p2b8gm11qj5r09b56i-bash-5.3p15/bin/bash', '_PYTHON_HOST_PLATFORM': 'linux-x86_64', 'NIX_BUILD_CORES': '24', 'configureFlags': '', ...}, 'text': True, 'stdout': -1, 'stderr': -1} nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> def run(*popenargs, nix-eval-jobs-functional-tests> input=None, capture_output=False, timeout=None, check=False, **kwargs): nix-eval-jobs-functional-tests> """Run command with arguments and return a CompletedProcess instance. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> The returned instance will have attributes args, returncode, stdout and nix-eval-jobs-functional-tests> stderr. By default, stdout and stderr are not captured, and those attributes nix-eval-jobs-functional-tests> will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them, nix-eval-jobs-functional-tests> or pass capture_output=True to capture both. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> If check is True and the exit code was non-zero, it raises a nix-eval-jobs-functional-tests> CalledProcessError. The CalledProcessError object will have the return code nix-eval-jobs-functional-tests> in the returncode attribute, and output & stderr attributes if those streams nix-eval-jobs-functional-tests> were captured. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> If timeout (seconds) is given and the process takes too long, nix-eval-jobs-functional-tests> a TimeoutExpired exception will be raised. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> There is an optional argument "input", allowing you to nix-eval-jobs-functional-tests> pass bytes or a string to the subprocess's stdin. If you use this argument nix-eval-jobs-functional-tests> you may not also use the Popen constructor's "stdin" argument, as nix-eval-jobs-functional-tests> it will be used internally. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> By default, all communication is in bytes, and therefore any "input" should nix-eval-jobs-functional-tests> be bytes, and the stdout and stderr will be bytes. If in text mode, any nix-eval-jobs-functional-tests> "input" should be a string, and stdout and stderr will be strings decoded nix-eval-jobs-functional-tests> according to locale encoding, or by "encoding" if set. Text mode is nix-eval-jobs-functional-tests> triggered by setting any of text, encoding, errors or universal_newlines. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> The other arguments are the same as for the Popen constructor. nix-eval-jobs-functional-tests> """ nix-eval-jobs-functional-tests> if input is not None: nix-eval-jobs-functional-tests> if kwargs.get('stdin') is not None: nix-eval-jobs-functional-tests> raise ValueError('stdin and input arguments may not both be used.') nix-eval-jobs-functional-tests> kwargs['stdin'] = PIPE nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if capture_output: nix-eval-jobs-functional-tests> if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: nix-eval-jobs-functional-tests> raise ValueError('stdout and stderr arguments may not be used ' nix-eval-jobs-functional-tests> 'with capture_output.') nix-eval-jobs-functional-tests> kwargs['stdout'] = PIPE nix-eval-jobs-functional-tests> kwargs['stderr'] = PIPE nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> with Popen(*popenargs, **kwargs) as process: nix-eval-jobs-functional-tests> try: nix-eval-jobs-functional-tests> stdout, stderr = process.communicate(input, timeout=timeout) nix-eval-jobs-functional-tests> except TimeoutExpired as exc: nix-eval-jobs-functional-tests> process.kill() nix-eval-jobs-functional-tests> if _mswindows: nix-eval-jobs-functional-tests> # Windows accumulates the output in a single blocking nix-eval-jobs-functional-tests> # read() call run on child threads, with the timeout nix-eval-jobs-functional-tests> # being done in a join() on those threads. communicate() nix-eval-jobs-functional-tests> # _after_ kill() is required to collect that and add it nix-eval-jobs-functional-tests> # to the exception. nix-eval-jobs-functional-tests> exc.stdout, exc.stderr = process.communicate() nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> # POSIX _communicate already populated the output so nix-eval-jobs-functional-tests> # far into the TimeoutExpired exception. nix-eval-jobs-functional-tests> process.wait() nix-eval-jobs-functional-tests> raise nix-eval-jobs-functional-tests> except: # Including KeyboardInterrupt, communicate handled that. nix-eval-jobs-functional-tests> process.kill() nix-eval-jobs-functional-tests> # We don't call process.wait() as .__exit__ does that for us. nix-eval-jobs-functional-tests> raise nix-eval-jobs-functional-tests> retcode = process.poll() nix-eval-jobs-functional-tests> if check and retcode: nix-eval-jobs-functional-tests> > raise CalledProcessError(retcode, process.args, nix-eval-jobs-functional-tests> output=stdout, stderr=stderr) nix-eval-jobs-functional-tests> E subprocess.CalledProcessError: Command '['/nix/store/v7fgcpx3ram406y75pi5fqg854g6y4va-nix-eval-jobs-2.35.3/bin/nix-eval-jobs', '--gc-roots-dir', '/build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0/gc', '--workers', '8', '--extra-experimental-features', 'nix-command flakes', '--flake', 'git+file:///build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0/flake#hydraJobs']' returned non-zero exit status 1. nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:578: CalledProcessError nix-eval-jobs-functional-tests> =========================== short test summary info ============================ nix-eval-jobs-functional-tests> FAILED tests-functional/test_eval.py::test_workers_do_not_race_flake_fetch - ... nix-eval-jobs-functional-tests> ========================= 1 failed, 32 passed in 7.86s ========================= error: Cannot build '/nix/store/k5h32sbh1x16928i48i5l9ayvryaxqrk-nix-eval-jobs-functional-tests.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/aqbpmbnlb4amnn15ykf8mj60jzj6cwkg-nix-eval-jobs-functional-tests Last 25 log lines: > # Windows accumulates the output in a single blocking > # read() call run on child threads, with the timeout > # being done in a join() on those threads. communicate() > # _after_ kill() is required to collect that and add it > # to the exception. > exc.stdout, exc.stderr = process.communicate() > else: > # POSIX _communicate already populated the output so > # far into the TimeoutExpired exception. > process.wait() > raise > except: # Including KeyboardInterrupt, communicate handled that. > process.kill() > # We don't call process.wait() as .__exit__ does that for us. > raise > retcode = process.poll() > if check and retcode: > > raise CalledProcessError(retcode, process.args, > output=stdout, stderr=stderr) > E subprocess.CalledProcessError: Command '['/nix/store/v7fgcpx3ram406y75pi5fqg854g6y4va-nix-eval-jobs-2.35.3/bin/nix-eval-jobs', '--gc-roots-dir', '/build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0/gc', '--workers', '8', '--extra-experimental-features', 'nix-command flakes', '--flake', 'git+file:///build/pytest-of-nixbld/pytest-0/test_workers_do_not_race_flake0/flake#hydraJobs']' returned non-zero exit status 1. > > /nix/store/d64q19q1xjdwfhqx6czvrjgrhq0n3lcc-python3-3.14.7/lib/python3.14/subprocess.py:578: CalledProcessError > =========================== short test summary info ============================ > FAILED tests-functional/test_eval.py::test_workers_do_not_race_flake_fetch - ... > ========================= 1 failed, 32 passed in 7.86s ========================= For full logs, run: nix log /nix/store/k5h32sbh1x16928i48i5l9ayvryaxqrk-nix-eval-jobs-functional-tests.drv