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 2022/08/04 06:52:49 UTC

[buildstream] 01/03: sandbox.py: Clarifications to the utility of Sandbox._disable_run()

This is an automated email from the ASF dual-hosted git repository.

tvb pushed a commit to branch tristan/light-cache-keys-without-sandbox-run
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 86cd1496a7b24e47b307416cc48f785b8e334c25
Author: Tristan van Berkom <tr...@codethink.co.uk>
AuthorDate: Thu Aug 4 15:20:26 2022 +0900

    sandbox.py: Clarifications to the utility of Sandbox._disable_run()
    
    In the past, BuildStream had internal sandbox implementations which
    would require staging files on the local filesystem in order to run,
    but now we use buildbox-run exclusively and always use CasBasedDirectory.
    
    The _use_cas_based_directory() method was removed in the commit
    b487a11f6ee529c9cba505106d054c92c16e864c, and this was actually the
    only reason why we had the Element.BST_RUN_COMMANDS flag at the time.
    
    We still want BST_RUN_COMMANDS for other reasons, and it is useful
    to keep the Sandbox._disable_run() function, but it's only purpose
    now is to ensure the invariant that plugins who set BST_RUN_COMMANDS
    to False do not actually run commands.
---
 src/buildstream/element.py         |  9 +++++----
 src/buildstream/sandbox/sandbox.py | 17 +++++++++++++----
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/buildstream/element.py b/src/buildstream/element.py
index 8f47a5b13..9a2b1bc2f 100644
--- a/src/buildstream/element.py
+++ b/src/buildstream/element.py
@@ -1677,11 +1677,12 @@ class Element(Plugin):
                 rootdir, output_file, output_file, self.__sandbox_config
             ) as sandbox:  # noqa
 
+                # Ensure that the plugin does not run commands if it said that it wouldn't
+                #
+                # We only disable commands here in _assemble() instead of __sandbox() because
+                # the user might still run a shell on an element which itself does not run commands.
+                #
                 if not self.BST_RUN_COMMANDS:
-                    # Element doesn't need to run any commands in the sandbox.
-                    #
-                    # Disable Sandbox.run() to allow CasBasedDirectory for all
-                    # sandboxes.
                     sandbox._disable_run()
 
                 # By default, the dynamic public data is the same as the static public data.
diff --git a/src/buildstream/sandbox/sandbox.py b/src/buildstream/sandbox/sandbox.py
index e30414bc1..a7cf9c777 100644
--- a/src/buildstream/sandbox/sandbox.py
+++ b/src/buildstream/sandbox/sandbox.py
@@ -64,6 +64,13 @@ class SandboxCommandError(SandboxError):
         self.collect = collect
 
 
+# An internal exception which can be used to explicitly trigger a bug / exception
+# which will be reported with a stack trace instead of reporting a user facing error
+#
+class _SandboxBug(Exception):
+    pass
+
+
 class Sandbox:
     """Sandbox()
 
@@ -345,7 +352,7 @@ class Sandbox:
         label: str = None
     ) -> Optional[int]:
         if not self.__allow_run:
-            raise SandboxError("Sandbox.run() has been disabled")
+            raise _SandboxBug("Element specified BST_RUN_COMMANDS as False but called Sandbox.run()")
 
         # Fallback to the sandbox default settings for
         # the cwd and env.
@@ -553,9 +560,11 @@ class Sandbox:
 
     # _disable_run()
     #
-    # Raise exception if `Sandbox.run()` is called. This enables use of
-    # CasBasedDirectory for faster staging when command execution is not
-    # required.
+    # Raise exception if `Sandbox.run()` is called.
+    #
+    # This enforces an invariant by raising an exception if an element
+    # plugin ever set BST_RUN_COMMANDS to False but then proceeded to
+    # attempt to run the sandbox at assemble time.
     #
     def _disable_run(self):
         self.__allow_run = False