You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by gi...@apache.org on 2020/12/29 13:11:43 UTC
[buildstream] 02/03: move caching sources from Element to
SourceCache
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch abderrahim/source-cache
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 829e30b1f50ff70bdd7ffa24fb73549e31c6a460
Author: Abderrahim Kitouni <ak...@gnome.org>
AuthorDate: Sun Jun 28 09:20:39 2020 +0100
move caching sources from Element to SourceCache
---
src/buildstream/_sourcecache.py | 34 ++++++++++++++++++++++++++-----
src/buildstream/element.py | 45 ++---------------------------------------
2 files changed, 31 insertions(+), 48 deletions(-)
diff --git a/src/buildstream/_sourcecache.py b/src/buildstream/_sourcecache.py
index dcde0b4..41efa5d 100644
--- a/src/buildstream/_sourcecache.py
+++ b/src/buildstream/_sourcecache.py
@@ -161,15 +161,24 @@ class SourceCache(BaseCache):
# dependent on previous sources, such as the patch source.
#
# Args:
- # source: last source
- # previous_sources: rest of the sources.
- def commit(self, source, previous_sources):
+ # sources: list of the sources of an element
+ def commit(self, sources):
+ last_requires_previous = 0
+ # commit all other sources by themselves
+ for ix, source in enumerate(sources):
+ if source.BST_REQUIRES_PREVIOUS_SOURCES_STAGE:
+ self._commit_one(source, sources[last_requires_previous:ix])
+ last_requires_previous = ix
+ else:
+ self._commit_one(source, [])
+
+ def _commit_one(self, source, previous_sources):
ref = source._get_source_name()
# Use tmpdir for now
vdir = CasBasedDirectory(self.cas)
for previous_source in previous_sources:
- vdir.import_files(self.export(previous_source))
+ vdir.import_files(self._export_one(previous_source))
if not source.BST_STAGE_VIRTUAL_DIRECTORY:
with utils._tempdir(dir=self.context.tmpdir, prefix="staging-temp") as tmpdir:
@@ -191,7 +200,22 @@ class SourceCache(BaseCache):
#
# Returns:
# CASBasedDirectory
- def export(self, source):
+ def export(self, sources):
+ # find last required source
+ last_requires_previous_ix = 0
+ for ix, source in enumerate(sources):
+ if source.BST_REQUIRES_PREVIOUS_SOURCES_STAGE:
+ last_requires_previous_ix = ix
+
+ import_dir = CasBasedDirectory(self.cas)
+
+ for source in sources[last_requires_previous_ix:]:
+ source_dir = self._export_one(source)
+ import_dir.import_files(source_dir)
+
+ return import_dir
+
+ def _export_one(self, source):
ref = source._get_source_name()
source = self._get_source(ref)
return CasBasedDirectory(self.cas, digest=source.files)
diff --git a/src/buildstream/element.py b/src/buildstream/element.py
index 6a0fa5f..0a3f41c 100644
--- a/src/buildstream/element.py
+++ b/src/buildstream/element.py
@@ -106,7 +106,6 @@ from ._artifact import Artifact
from .storage.directory import Directory
from .storage._filebaseddirectory import FileBasedDirectory
-from .storage._casbaseddirectory import CasBasedDirectory
from .storage.directory import VirtualDirectoryError
if TYPE_CHECKING:
@@ -1352,16 +1351,8 @@ class Element(Plugin):
if self.__sources:
- sourcecache = context.sourcecache
- # find last required source
- last_required_previous_ix = self.__last_source_requires_previous()
- import_dir = CasBasedDirectory(context.get_cascache())
-
try:
- for source in self.__sources[last_required_previous_ix:]:
- source_dir = sourcecache.export(source)
- import_dir.import_files(source_dir)
-
+ import_dir = context.sourcecache.export(self.__sources)
except SourceCacheError as e:
raise ElementError("Error trying to export source for {}: {}".format(self.name, e))
except VirtualDirectoryError as e:
@@ -2056,7 +2047,7 @@ class Element(Plugin):
source._fetch(previous_sources)
previous_sources.append(source)
- self.__cache_sources()
+ self.__sourcecache.commit(self.__sources)
# _calculate_cache_key():
#
@@ -2889,38 +2880,6 @@ class Element(Plugin):
return True
- # __cache_sources():
- #
- # Caches the sources into the local CAS
- #
- def __cache_sources(self):
- if self.__sources and not self._has_all_sources_in_source_cache():
- last_requires_previous = 0
- # commit all other sources by themselves
- for ix, source in enumerate(self.__sources):
- if source.BST_REQUIRES_PREVIOUS_SOURCES_STAGE:
- self.__sourcecache.commit(source, self.__sources[last_requires_previous:ix])
- last_requires_previous = ix
- else:
- self.__sourcecache.commit(source, [])
-
- # __last_source_requires_previous
- #
- # This is the last source that requires previous sources to be cached.
- # Sources listed after this will be cached separately.
- #
- # Returns:
- # (int): index of last source that requires previous sources
- #
- def __last_source_requires_previous(self):
- if self.__last_source_requires_previous_ix is None:
- last_requires_previous = 0
- for ix, source in enumerate(self.__sources):
- if source.BST_REQUIRES_PREVIOUS_SOURCES_STAGE:
- last_requires_previous = ix
- self.__last_source_requires_previous_ix = last_requires_previous
- return self.__last_source_requires_previous_ix
-
# __update_cache_keys()
#
# Updates weak and strict cache keys