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:24:29 UTC
[buildstream] 02/03: artifactcache: Read and write cache size to
disk
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch jonathan/cache-cache-size
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit b31395f7850699492698d46f498aacd69e5e8b61
Author: Jonathan Maw <jo...@codethink.co.uk>
AuthorDate: Fri Aug 17 15:36:25 2018 +0100
artifactcache: Read and write cache size to disk
---
buildstream/_artifactcache/__init__.py | 2 +-
buildstream/_artifactcache/artifactcache.py | 55 +++++++++++++++++++++++++++--
2 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/buildstream/_artifactcache/__init__.py b/buildstream/_artifactcache/__init__.py
index 07ed52b..fad483a 100644
--- a/buildstream/_artifactcache/__init__.py
+++ b/buildstream/_artifactcache/__init__.py
@@ -17,4 +17,4 @@
# Authors:
# Tristan Van Berkom <tr...@codethink.co.uk>
-from .artifactcache import ArtifactCache, ArtifactCacheSpec
+from .artifactcache import ArtifactCache, ArtifactCacheSpec, CACHE_SIZE_FILE
diff --git a/buildstream/_artifactcache/artifactcache.py b/buildstream/_artifactcache/artifactcache.py
index 95dbc08..f28fe39 100644
--- a/buildstream/_artifactcache/artifactcache.py
+++ b/buildstream/_artifactcache/artifactcache.py
@@ -28,6 +28,9 @@ from .. import utils
from .. import _yaml
+CACHE_SIZE_FILE = "cache_size"
+
+
# An ArtifactCacheSpec holds the user configuration for a single remote
# artifact cache.
#
@@ -283,7 +286,11 @@ class ArtifactCache():
# If we don't currently have an estimate, figure out the real
# cache size.
if self.estimated_size is None:
- self.estimated_size = self.calculate_cache_size()
+ stored_size = self._read_cache_size()
+ if stored_size is not None:
+ self.estimated_size = stored_size
+ else:
+ self.estimated_size = self.calculate_cache_size()
return self.estimated_size
@@ -542,6 +549,7 @@ class ArtifactCache():
self.estimated_size = self.calculate_cache_size()
self.estimated_size += artifact_size
+ self._write_cache_size(self.estimated_size)
# _set_cache_size()
#
@@ -552,6 +560,49 @@ class ArtifactCache():
def _set_cache_size(self, cache_size):
self.estimated_size = cache_size
+ # set_cache_size is called in cleanup, where it may set the cache to None
+ if self.estimated_size is not None:
+ self._write_cache_size(self.estimated_size)
+
+ # _write_cache_size()
+ #
+ # Writes the given size of the artifact to the cache's size file
+ #
+ def _write_cache_size(self, size):
+ assert isinstance(size, int)
+ size_file_path = os.path.join(self.context.artifactdir, CACHE_SIZE_FILE)
+ with open(size_file_path, "w") as f:
+ f.write(str(size))
+
+ # _read_cache_size()
+ #
+ # Reads and returns the size of the artifact cache that's stored in the
+ # cache's size file
+ #
+ def _read_cache_size(self):
+ size_file_path = os.path.join(self.context.artifactdir, CACHE_SIZE_FILE)
+
+ if not os.path.exists(size_file_path):
+ return None
+
+ with open(size_file_path, "r") as f:
+ size = f.read()
+
+ try:
+ num_size = int(size)
+ except ValueError as e:
+ raise ArtifactError("Size '{}' parsed from '{}' was not an integer".format(
+ size, size_file_path)) from e
+
+ return num_size
+
+ # _calculate_cache_quota()
+ #
+ # Calculates and sets the cache quota and lower threshold based on the
+ # quota set in Context.
+ # It checks that the quota is both a valid expression, and that there is
+ # enough disk space to satisfy that quota
+ #
def _calculate_cache_quota(self):
# Headroom intended to give BuildStream a bit of leeway.
# This acts as the minimum size of cache_quota and also
@@ -577,7 +628,7 @@ class ArtifactCache():
stat = os.statvfs(artifactdir_volume)
available_space = (stat.f_bsize * stat.f_bavail)
- cache_size = self.calculate_cache_size()
+ cache_size = self.get_approximate_cache_size()
# Ensure system has enough storage for the cache_quota
#