You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by tv...@apache.org on 2021/02/04 07:29:57 UTC
[buildstream] 13/15: WIP: sandbox bwrap state
This is an automated email from the ASF dual-hosted git repository.
tvb pushed a commit to branch aevri/enable_spawn_ci_7
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit e29746c7493b69baa55e082bab55ac18523f1bfe
Author: Angelos Evripiotis <je...@bloomberg.net>
AuthorDate: Tue Oct 29 10:08:49 2019 +0000
WIP: sandbox bwrap state
This is probably going to need a more substantial refactor - the job
pickler probably shouldn't be reaching into the individual sandboxes
classes like this.
Ideally the state would be stored somewhere more accessible than class
attributes.
---
src/buildstream/_scheduler/jobs/jobpickler.py | 10 ++++++--
src/buildstream/sandbox/_sandboxbwrap.py | 34 +++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/src/buildstream/_scheduler/jobs/jobpickler.py b/src/buildstream/_scheduler/jobs/jobpickler.py
index b0465ec..ce8e4a6 100644
--- a/src/buildstream/_scheduler/jobs/jobpickler.py
+++ b/src/buildstream/_scheduler/jobs/jobpickler.py
@@ -56,9 +56,11 @@ def pickle_child_job(child_job, projects):
# Note that we need to consider all the state of the program that's
# necessary for the job, this includes e.g. the global state of the node
# module.
+ from ...sandbox._sandboxbwrap import SandboxBwrap
+ sandbox_bwrap_state = SandboxBwrap.save_check_available_status()
node_module_state = node._get_state_for_pickling()
return _pickle_child_job_data(
- (child_job, node_module_state),
+ (child_job, node_module_state, sandbox_bwrap_state),
projects,
)
@@ -77,8 +79,12 @@ def pickle_child_job(child_job, projects):
def do_pickled_child_job(pickled, *child_args):
utils._is_main_process = _not_main_process
- child_job, node_module_state = pickle.load(pickled)
+ child_job, node_module_state, sandbox_bwrap_state = pickle.load(pickled)
node._set_state_from_pickling(node_module_state)
+
+ from ...sandbox._sandboxbwrap import SandboxBwrap
+ SandboxBwrap.load_check_available_status(sandbox_bwrap_state)
+
return child_job.child_action(*child_args)
diff --git a/src/buildstream/sandbox/_sandboxbwrap.py b/src/buildstream/sandbox/_sandboxbwrap.py
index bd60eaf..7911c59 100644
--- a/src/buildstream/sandbox/_sandboxbwrap.py
+++ b/src/buildstream/sandbox/_sandboxbwrap.py
@@ -92,6 +92,40 @@ class SandboxBwrap(Sandbox):
cls.user_ns_available = cls._check_user_ns_available()
+ @classmethod
+ def save_check_available_status(cls):
+ # Note, these ones only get set if bwrap is available:
+ #
+ # cls._uid = os.geteuid()
+ # cls._gid = os.getegid()
+ # cls.user_ns_available = cls._check_user_ns_available()
+ #
+ return (
+ cls._bwrap_exists,
+ cls._die_with_parent_available,
+ cls._dummy_reasons,
+ cls._gid,
+ cls._have_fuse,
+ cls._have_good_bwrap,
+ cls._json_status_available,
+ cls._uid,
+ cls.user_ns_available,
+ )
+
+ @classmethod
+ def load_check_available_status(cls, state):
+ (
+ cls._bwrap_exists,
+ cls._die_with_parent_available,
+ cls._dummy_reasons,
+ cls._gid,
+ cls._have_fuse,
+ cls._have_good_bwrap,
+ cls._json_status_available,
+ cls._uid,
+ cls.user_ns_available,
+ ) = state
+
@staticmethod
def _check_user_ns_available():
# Here, lets check if bwrap is able to create user namespaces,