From 818790da6b23aebea3e38afc9af5e137e8a11315 Mon Sep 17 00:00:00 2001 From: Benjamin Schubert Date: Thu, 1 Oct 2020 09:57:56 +0000 Subject: element.py: Ensure element methods with side effects on others are not called in jobs This adds some assertions in the code to ensure we are not calling methods with side effects on the graph of elements in jobs. --- src/buildstream/element.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/buildstream/element.py b/src/buildstream/element.py index 7b3b704d2..91b809fca 100644 --- a/src/buildstream/element.py +++ b/src/buildstream/element.py @@ -1562,6 +1562,8 @@ class Element(Plugin): # This unblocks pull/fetch/build. # def _set_required(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + if self.__required: # Already done return @@ -1597,6 +1599,8 @@ class Element(Plugin): # required in the local cache. # def _set_artifact_files_required(self, scope=_Scope.RUN): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + if self.__artifact_files_required: # Already done return @@ -1645,6 +1649,8 @@ class Element(Plugin): # in a subprocess. # def __schedule_assembly_when_necessary(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + # FIXME: We could reduce the number of function calls a bit by # factoring this out of this method (and checking whether we # should schedule at the calling end). @@ -1676,6 +1682,7 @@ class Element(Plugin): # def _assemble_done(self, successful): assert self.__assemble_scheduled + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" self.__assemble_done = True @@ -1873,6 +1880,8 @@ class Element(Plugin): # fetched_original (bool): Whether the original sources had been asked (and fetched) or not # def _fetch_done(self, fetched_original): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + self.__sources.fetch_done(fetched_original) # _pull_pending() @@ -1917,6 +1926,8 @@ class Element(Plugin): # This will result in updating the element state. # def _pull_done(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + self.__pull_done = True # Artifact may become cached after pulling, so let it query the @@ -2093,6 +2104,8 @@ class Element(Plugin): # the workspaces metadata first. # def _open_workspace(self): + assert utils._is_main_process(), "This writes to a global file and therefore must be run in the main process" + context = self._get_context() workspace = self._get_workspace() assert workspace is not None @@ -2393,6 +2406,8 @@ class Element(Plugin): # the appropriate counters. # def _update_ready_for_runtime_and_cached(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + if not self.__ready_for_runtime_and_cached: if self.__runtime_deps_uncached == 0 and self.__cache_key and self._cached_success(): self.__ready_for_runtime_and_cached = True @@ -3137,6 +3152,8 @@ class Element(Plugin): # in Scope.BUILD has changed in any way. # def __update_cache_keys(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + if self.__strict_cache_key is not None: # Cache keys already calculated assert self.__weak_cache_key is not None @@ -3204,6 +3221,7 @@ class Element(Plugin): # it can check whether an artifact exists for that cache key. # def __update_artifact_state(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" assert self.__artifact is None context = self._get_context() @@ -3238,6 +3256,8 @@ class Element(Plugin): # a remote cache). # def __update_cache_key_non_strict(self): + assert utils._is_main_process(), "This has an impact on all elements and must be run in the main process" + # The final cache key can be None here only in non-strict mode if self.__cache_key is None: if self._pull_pending(): -- cgit v1.2.1