this derivation will be built: /nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv building '/nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv' on 'ssh-ng://customer@mac02' building '/nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv' nix-eval-jobs-functional-tests> ============================= test session starts ============================== nix-eval-jobs-functional-tests> platform darwin -- Python 3.13.9, pytest-8.4.2, pluggy-1.6.0 -- /nix/store/xcjk9ill54kjk8mzgq6yydnx9015lidg-python3-3.13.9/bin/python3.13 nix-eval-jobs-functional-tests> cachedir: .pytest_cache nix-eval-jobs-functional-tests> rootdir: /nix/var/nix/builds/nix-49230-3361655361 nix-eval-jobs-functional-tests> collected 23 items nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_flake PASSED [ 4%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_query_cache_status PASSED [ 8%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_expression PASSED [ 13%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_input_drvs PASSED [ 17%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_eval_error PASSED [ 21%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_no_gcroot_dir PASSED [ 26%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_daemon_only_settings_do_not_warn PASSED [ 30%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents PASSED [ 34%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_all PASSED [ 39%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_glob_misc PASSED [ 43%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_cycle PASSED [ 47%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_constituents_error PASSED [ 52%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_empty_needed PASSED [ 56%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_apply PASSED [ 60%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_select_flake PASSED [ 65%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_recursion_error PASSED [ 69%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_no_instantiate_mode PASSED [ 73%] 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 [ 82%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_worker_log_format_survives_fork PASSED [ 86%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_worker_restart_on_last_job_exits_cleanly PASSED [ 91%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_fetchers_survive_worker_restart PASSED [ 95%] nix-eval-jobs-functional-tests> tests-functional/test_eval.py::test_workers_do_not_race_flake_fetch FAILED [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('/nix/var/nix/builds/nix-49230-3361655361/pytest-of-_nixbld1/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> nix-eval-jobs-functional-tests> tests-functional/test_eval.py:875: nix-eval-jobs-functional-tests> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ nix-eval-jobs-functional-tests> /nix/store/xcjk9ill54kjk8mzgq6yydnx9015lidg-python3-3.13.9/lib/python3.13/subprocess.py:554: in run nix-eval-jobs-functional-tests> with Popen(*popenargs, **kwargs) as process: nix-eval-jobs-functional-tests> ^^^^^^^^^^^^^^^^^^^^^^^^^^^ nix-eval-jobs-functional-tests> /nix/store/xcjk9ill54kjk8mzgq6yydnx9015lidg-python3-3.13.9/lib/python3.13/subprocess.py:1039: in __init__ nix-eval-jobs-functional-tests> self._execute_child(args, executable, preexec_fn, close_fds, nix-eval-jobs-functional-tests> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> self = nix-eval-jobs-functional-tests> args = ['git', 'init', '-q'], executable = b'git', preexec_fn = None nix-eval-jobs-functional-tests> close_fds = True, pass_fds = () nix-eval-jobs-functional-tests> cwd = PosixPath('/nix/var/nix/builds/nix-49230-3361655361/pytest-of-_nixbld1/pytest-0/test_workers_do_not_race_flake0/flake') nix-eval-jobs-functional-tests> env = {'CONFIG_SHELL': '/nix/store/p0k9r5h8qs7220xdbdihhfgzwjcly70x-bash-5.3p3/bin/bash', 'DETERMINISTIC_BUILD': '1', 'GZIP_...OME': '/nix/var/nix/builds/nix-49230-3361655361/pytest-of-_nixbld1/pytest-0/test_workers_do_not_race_flake0/home', ...} nix-eval-jobs-functional-tests> startupinfo = None, creationflags = 0, shell = False, p2cread = -1 nix-eval-jobs-functional-tests> p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1 nix-eval-jobs-functional-tests> restore_signals = True, gid = None, gids = None, uid = None, umask = -1 nix-eval-jobs-functional-tests> start_new_session = False, process_group = -1 nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> def _execute_child(self, args, executable, preexec_fn, close_fds, nix-eval-jobs-functional-tests> pass_fds, cwd, env, nix-eval-jobs-functional-tests> startupinfo, creationflags, shell, nix-eval-jobs-functional-tests> p2cread, p2cwrite, nix-eval-jobs-functional-tests> c2pread, c2pwrite, nix-eval-jobs-functional-tests> errread, errwrite, nix-eval-jobs-functional-tests> restore_signals, nix-eval-jobs-functional-tests> gid, gids, uid, umask, nix-eval-jobs-functional-tests> start_new_session, process_group): nix-eval-jobs-functional-tests> """Execute program (POSIX version)""" nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if isinstance(args, (str, bytes)): nix-eval-jobs-functional-tests> args = [args] nix-eval-jobs-functional-tests> elif isinstance(args, os.PathLike): nix-eval-jobs-functional-tests> if shell: nix-eval-jobs-functional-tests> raise TypeError('path-like args is not allowed when ' nix-eval-jobs-functional-tests> 'shell is true') nix-eval-jobs-functional-tests> args = [args] nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> args = list(args) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if shell: nix-eval-jobs-functional-tests> # On Android the default shell is at '/system/bin/sh'. nix-eval-jobs-functional-tests> unix_shell = ('/system/bin/sh' if nix-eval-jobs-functional-tests> hasattr(sys, 'getandroidapilevel') else '/nix/store/p0k9r5h8qs7220xdbdihhfgzwjcly70x-bash-5.3p3/bin/sh') nix-eval-jobs-functional-tests> args = [unix_shell, "-c"] + args nix-eval-jobs-functional-tests> if executable: nix-eval-jobs-functional-tests> args[0] = executable nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if executable is None: nix-eval-jobs-functional-tests> executable = args[0] nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> sys.audit("subprocess.Popen", executable, args, cwd, env) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if (_USE_POSIX_SPAWN nix-eval-jobs-functional-tests> and os.path.dirname(executable) nix-eval-jobs-functional-tests> and preexec_fn is None nix-eval-jobs-functional-tests> and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM) nix-eval-jobs-functional-tests> and not pass_fds nix-eval-jobs-functional-tests> and cwd is None nix-eval-jobs-functional-tests> and (p2cread == -1 or p2cread > 2) nix-eval-jobs-functional-tests> and (c2pwrite == -1 or c2pwrite > 2) nix-eval-jobs-functional-tests> and (errwrite == -1 or errwrite > 2) nix-eval-jobs-functional-tests> and not start_new_session nix-eval-jobs-functional-tests> and process_group == -1 nix-eval-jobs-functional-tests> and gid is None nix-eval-jobs-functional-tests> and gids is None nix-eval-jobs-functional-tests> and uid is None nix-eval-jobs-functional-tests> and umask < 0): nix-eval-jobs-functional-tests> self._posix_spawn(args, executable, env, restore_signals, close_fds, nix-eval-jobs-functional-tests> p2cread, p2cwrite, nix-eval-jobs-functional-tests> c2pread, c2pwrite, nix-eval-jobs-functional-tests> errread, errwrite) nix-eval-jobs-functional-tests> return nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> orig_executable = executable nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> # For transferring possible exec failure from child to parent. nix-eval-jobs-functional-tests> # Data format: "exception name:hex errno:description" nix-eval-jobs-functional-tests> # Pickle is not used; it is complex and involves memory allocation. nix-eval-jobs-functional-tests> errpipe_read, errpipe_write = os.pipe() nix-eval-jobs-functional-tests> # errpipe_write must not be in the standard io 0, 1, or 2 fd range. nix-eval-jobs-functional-tests> low_fds_to_close = [] nix-eval-jobs-functional-tests> while errpipe_write < 3: nix-eval-jobs-functional-tests> low_fds_to_close.append(errpipe_write) nix-eval-jobs-functional-tests> errpipe_write = os.dup(errpipe_write) nix-eval-jobs-functional-tests> for low_fd in low_fds_to_close: nix-eval-jobs-functional-tests> os.close(low_fd) nix-eval-jobs-functional-tests> try: nix-eval-jobs-functional-tests> try: nix-eval-jobs-functional-tests> # We must avoid complex work that could involve nix-eval-jobs-functional-tests> # malloc or free in the child process to avoid nix-eval-jobs-functional-tests> # potential deadlocks, thus we do all this here. nix-eval-jobs-functional-tests> # and pass it to fork_exec() nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if env is not None: nix-eval-jobs-functional-tests> env_list = [] nix-eval-jobs-functional-tests> for k, v in env.items(): nix-eval-jobs-functional-tests> k = os.fsencode(k) nix-eval-jobs-functional-tests> if b'=' in k: nix-eval-jobs-functional-tests> raise ValueError("illegal environment variable name") nix-eval-jobs-functional-tests> env_list.append(k + b'=' + os.fsencode(v)) nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> env_list = None # Use execv instead of execve. nix-eval-jobs-functional-tests> executable = os.fsencode(executable) nix-eval-jobs-functional-tests> if os.path.dirname(executable): nix-eval-jobs-functional-tests> executable_list = (executable,) nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> # This matches the behavior of os._execvpe(). nix-eval-jobs-functional-tests> executable_list = tuple( nix-eval-jobs-functional-tests> os.path.join(os.fsencode(dir), executable) nix-eval-jobs-functional-tests> for dir in os.get_exec_path(env)) nix-eval-jobs-functional-tests> fds_to_keep = set(pass_fds) nix-eval-jobs-functional-tests> fds_to_keep.add(errpipe_write) nix-eval-jobs-functional-tests> self.pid = _fork_exec( nix-eval-jobs-functional-tests> args, executable_list, nix-eval-jobs-functional-tests> close_fds, tuple(sorted(map(int, fds_to_keep))), nix-eval-jobs-functional-tests> cwd, env_list, nix-eval-jobs-functional-tests> p2cread, p2cwrite, c2pread, c2pwrite, nix-eval-jobs-functional-tests> errread, errwrite, nix-eval-jobs-functional-tests> errpipe_read, errpipe_write, nix-eval-jobs-functional-tests> restore_signals, start_new_session, nix-eval-jobs-functional-tests> process_group, gid, gids, uid, umask, nix-eval-jobs-functional-tests> preexec_fn, _USE_VFORK) nix-eval-jobs-functional-tests> self._child_created = True nix-eval-jobs-functional-tests> finally: nix-eval-jobs-functional-tests> # be sure the FD is closed no matter what nix-eval-jobs-functional-tests> os.close(errpipe_write) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> self._close_pipe_fds(p2cread, p2cwrite, nix-eval-jobs-functional-tests> c2pread, c2pwrite, nix-eval-jobs-functional-tests> errread, errwrite) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> # Wait for exec to fail or succeed; possibly raising an nix-eval-jobs-functional-tests> # exception (limited in size) nix-eval-jobs-functional-tests> errpipe_data = bytearray() nix-eval-jobs-functional-tests> while True: nix-eval-jobs-functional-tests> part = os.read(errpipe_read, 50000) nix-eval-jobs-functional-tests> errpipe_data += part nix-eval-jobs-functional-tests> if not part or len(errpipe_data) > 50000: nix-eval-jobs-functional-tests> break nix-eval-jobs-functional-tests> finally: nix-eval-jobs-functional-tests> # be sure the FD is closed no matter what nix-eval-jobs-functional-tests> os.close(errpipe_read) nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> if errpipe_data: nix-eval-jobs-functional-tests> try: nix-eval-jobs-functional-tests> pid, sts = os.waitpid(self.pid, 0) nix-eval-jobs-functional-tests> if pid == self.pid: nix-eval-jobs-functional-tests> self._handle_exitstatus(sts) nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> self.returncode = sys.maxsize nix-eval-jobs-functional-tests> except ChildProcessError: nix-eval-jobs-functional-tests> pass nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> try: nix-eval-jobs-functional-tests> exception_name, hex_errno, err_msg = ( nix-eval-jobs-functional-tests> errpipe_data.split(b':', 2)) nix-eval-jobs-functional-tests> # The encoding here should match the encoding nix-eval-jobs-functional-tests> # written in by the subprocess implementations nix-eval-jobs-functional-tests> # like _posixsubprocess nix-eval-jobs-functional-tests> err_msg = err_msg.decode() nix-eval-jobs-functional-tests> except ValueError: nix-eval-jobs-functional-tests> exception_name = b'SubprocessError' nix-eval-jobs-functional-tests> hex_errno = b'0' nix-eval-jobs-functional-tests> err_msg = 'Bad exception data from child: {!r}'.format( nix-eval-jobs-functional-tests> bytes(errpipe_data)) nix-eval-jobs-functional-tests> child_exception_type = getattr( nix-eval-jobs-functional-tests> builtins, exception_name.decode('ascii'), nix-eval-jobs-functional-tests> SubprocessError) nix-eval-jobs-functional-tests> if issubclass(child_exception_type, OSError) and hex_errno: nix-eval-jobs-functional-tests> errno_num = int(hex_errno, 16) nix-eval-jobs-functional-tests> if err_msg == "noexec:chdir": nix-eval-jobs-functional-tests> err_msg = "" nix-eval-jobs-functional-tests> # The error must be from chdir(cwd). nix-eval-jobs-functional-tests> err_filename = cwd nix-eval-jobs-functional-tests> elif err_msg == "noexec": nix-eval-jobs-functional-tests> err_msg = "" nix-eval-jobs-functional-tests> err_filename = None nix-eval-jobs-functional-tests> else: nix-eval-jobs-functional-tests> err_filename = orig_executable nix-eval-jobs-functional-tests> if errno_num != 0: nix-eval-jobs-functional-tests> err_msg = os.strerror(errno_num) nix-eval-jobs-functional-tests> if err_filename is not None: nix-eval-jobs-functional-tests> > raise child_exception_type(errno_num, err_msg, err_filename) nix-eval-jobs-functional-tests> E FileNotFoundError: [Errno 2] No such file or directory: 'git' nix-eval-jobs-functional-tests> nix-eval-jobs-functional-tests> /nix/store/xcjk9ill54kjk8mzgq6yydnx9015lidg-python3-3.13.9/lib/python3.13/subprocess.py:1972: FileNotFoundError 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 - FileNotFoundError: [Errno 2] No such file or directory: 'git' nix-eval-jobs-functional-tests> ========================= 1 failed, 22 passed in 4.19s ========================= error: build of '/nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv' on 'ssh-ng://customer@mac02' failed: Cannot build '/nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/a3bpw2vpnd2hmn2mp4zv0qlqd9bfm97m-nix-eval-jobs-functional-tests Last 25 log lines: > bytes(errpipe_data)) > child_exception_type = getattr( > builtins, exception_name.decode('ascii'), > SubprocessError) > if issubclass(child_exception_type, OSError) and hex_errno: > errno_num = int(hex_errno, 16) > if err_msg == "noexec:chdir": > err_msg = "" > # The error must be from chdir(cwd). > err_filename = cwd > elif err_msg == "noexec": > err_msg = "" > err_filename = None > else: > err_filename = orig_executable > if errno_num != 0: > err_msg = os.strerror(errno_num) > if err_filename is not None: > > raise child_exception_type(errno_num, err_msg, err_filename) > E FileNotFoundError: [Errno 2] No such file or directory: 'git' > > /nix/store/xcjk9ill54kjk8mzgq6yydnx9015lidg-python3-3.13.9/lib/python3.13/subprocess.py:1972: FileNotFoundError > =========================== short test summary info ============================ > FAILED tests-functional/test_eval.py::test_workers_do_not_race_flake_fetch - FileNotFoundError: [Errno 2] No such file or directory: 'git' > ========================= 1 failed, 22 passed in 4.19s ========================= For full logs, run: nix log /nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv error: Cannot build '/nix/store/f1rf8wp57pz8xgac2pj42i0azl9rnsy0-nix-eval-jobs-functional-tests.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/a3bpw2vpnd2hmn2mp4zv0qlqd9bfm97m-nix-eval-jobs-functional-tests