Skip to content

Commit 6bbb7de

Browse files
committed
start _writer_daemon without by using the environment as it was before applying updates related to installing the package (running the _writer_daemon process requires the environment that was used to start Spack itself)
1 parent 4c00a3a commit 6bbb7de

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

lib/spack/llnl/util/tty/log.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,21 @@ def close_connection_and_file(multiprocess_fd, file):
372372
file.close()
373373

374374

375+
@contextmanager
376+
def replace_environment(env):
377+
env = env or {}
378+
old_env = os.environ.copy()
379+
try:
380+
os.environ.clear()
381+
for name, val in env.items():
382+
os.environ[name] = val
383+
yield
384+
finally:
385+
os.environ.clear()
386+
for name, val in old_env.items():
387+
os.environ[name] = val
388+
389+
375390
class log_output(object):
376391
"""Context manager that logs its output to a file.
377392
@@ -408,7 +423,8 @@ class log_output(object):
408423
work within test frameworks like nose and pytest.
409424
"""
410425

411-
def __init__(self, file_like=None, echo=False, debug=0, buffer=False):
426+
def __init__(self, file_like=None, echo=False, debug=0, buffer=False,
427+
env=None):
412428
"""Create a new output log context manager.
413429
414430
Args:
@@ -436,6 +452,7 @@ def __init__(self, file_like=None, echo=False, debug=0, buffer=False):
436452
self.echo = echo
437453
self.debug = debug
438454
self.buffer = buffer
455+
self.env = env # the environment to use for _writer_daemon
439456

440457
self._active = False # used to prevent re-entry
441458

@@ -509,15 +526,16 @@ def __enter__(self):
509526
# just don't forward input if this fails
510527
input_multiprocess_fd = None
511528

512-
self.process = multiprocessing.Process(
513-
target=_writer_daemon,
514-
args=(
515-
input_multiprocess_fd, read_multiprocess_fd, write_fd,
516-
self.echo, self.log_file, child_pipe
529+
with replace_environment(self.env):
530+
self.process = multiprocessing.Process(
531+
target=_writer_daemon,
532+
args=(
533+
input_multiprocess_fd, read_multiprocess_fd, write_fd,
534+
self.echo, self.log_file, child_pipe
535+
)
517536
)
518-
)
519-
self.process.daemon = True # must set before start()
520-
self.process.start()
537+
self.process.daemon = True # must set before start()
538+
self.process.start()
521539

522540
finally:
523541
if input_multiprocess_fd:

lib/spack/spack/build_environment.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,7 @@ def _setup_pkg_and_run(serialized_pkg, function, kwargs, child_pipe,
820820
pkg = serialized_pkg.restore()
821821

822822
if not kwargs.get('fake', False):
823+
kwargs['unmodified_env'] = os.environ.copy()
823824
setup_package(pkg, dirty=kwargs.get('dirty', False))
824825
return_value = function(pkg, kwargs)
825826
child_pipe.send(return_value)

lib/spack/spack/installer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,7 @@ def build_process(pkg, kwargs):
15691569
skip_patch = kwargs.get('skip_patch', False)
15701570
verbose = kwargs.get('verbose', False)
15711571
fake = kwargs.get('fake', False)
1572+
unmodified_env = kwargs.get('unmodified_env', {})
15721573

15731574
start_time = time.time()
15741575
if not fake:
@@ -1628,7 +1629,9 @@ def build_process(pkg, kwargs):
16281629

16291630
# Spawn a daemon that reads from a pipe and redirects
16301631
# everything to log_path
1631-
with log_output(pkg.log_path, echo, True) as logger:
1632+
with log_output(pkg.log_path, echo, True,
1633+
env=unmodified_env) as logger:
1634+
16321635
for phase_name, phase_attr in zip(
16331636
pkg.phases, pkg._InstallPhase_phases):
16341637

0 commit comments

Comments
 (0)