Tristan Van Berkom pushed to branch tristan/cache-management at BuildStream / buildstream
Commits:
- 
5471c12a
by Tristan Van Berkom at 2019-01-20T20:15:48Z
 - 
ed7ce55a
by Tristan Van Berkom at 2019-01-20T20:15:48Z
 - 
118359d6
by Tristan Van Berkom at 2019-01-20T20:15:48Z
 
3 changed files:
Changes:
| ... | ... | @@ -46,6 +46,30 @@ class ArtifactCacheSpec(CASRemoteSpec): | 
| 46 | 46 | 
     pass
 | 
| 47 | 47 | 
 | 
| 48 | 48 | 
 | 
| 49 | 
+# ArtifactCacheUsage
 | 
|
| 50 | 
+#
 | 
|
| 51 | 
+# A simple object to report the current artifact cache
 | 
|
| 52 | 
+# usage details.
 | 
|
| 53 | 
+#
 | 
|
| 54 | 
+# Note that this uses the user configured cache quota
 | 
|
| 55 | 
+# rather than the internal quota with protective headroom
 | 
|
| 56 | 
+# removed, to provide a more sensible value to display to
 | 
|
| 57 | 
+# the user.
 | 
|
| 58 | 
+#
 | 
|
| 59 | 
+# Args:
 | 
|
| 60 | 
+#    artifacts (ArtifactCache): The artifact cache to get the status of
 | 
|
| 61 | 
+#
 | 
|
| 62 | 
+class ArtifactCacheUsage():
 | 
|
| 63 | 
+  | 
|
| 64 | 
+    def __init__(self, artifacts):
 | 
|
| 65 | 
+        context = artifacts.context
 | 
|
| 66 | 
+        self.quota_config = context.config_cache_quota       # Configured quota
 | 
|
| 67 | 
+        self.quota_size = artifacts._cache_quota_original    # Resolved cache quota in bytes
 | 
|
| 68 | 
+        self.used_size = artifacts.get_cache_size()          # Size used by artifacts in bytes
 | 
|
| 69 | 
+        self.used_percent = None                             # Percentage of the quota used
 | 
|
| 70 | 
+        self.used_percent = int(self.used_size * 100 / self.quota_size)
 | 
|
| 71 | 
+  | 
|
| 72 | 
+  | 
|
| 49 | 73 | 
 # An ArtifactCache manages artifacts.
 | 
| 50 | 74 | 
 #
 | 
| 51 | 75 | 
 # Args:
 | 
| ... | ... | @@ -64,6 +88,7 @@ class ArtifactCache(): | 
| 64 | 88 | 
         self._required_elements = set()       # The elements required for this session
 | 
| 65 | 89 | 
         self._cache_size = None               # The current cache size, sometimes it's an estimate
 | 
| 66 | 90 | 
         self._cache_quota = None              # The cache quota
 | 
| 91 | 
+        self._cache_quota_original = None     # The cache quota as specified by the user, in bytes
 | 
|
| 67 | 92 | 
         self._cache_lower_threshold = None    # The target cache size for a cleanup
 | 
| 68 | 93 | 
         self._remotes_setup = False           # Check to prevent double-setup of remotes
 | 
| 69 | 94 | 
 | 
| ... | ... | @@ -897,6 +922,7 @@ class ArtifactCache(): | 
| 897 | 922 | 
         # if we end up writing more than 2G, but hey, this stuff is
 | 
| 898 | 923 | 
         # already really fuzzy.
 | 
| 899 | 924 | 
         #
 | 
| 925 | 
+        self._cache_quota_original = cache_quota
 | 
|
| 900 | 926 | 
         self._cache_quota = cache_quota - headroom
 | 
| 901 | 927 | 
         self._cache_lower_threshold = self._cache_quota / 2
 | 
| 902 | 928 | 
 | 
| ... | ... | @@ -30,7 +30,7 @@ from . import _yaml | 
| 30 | 30 | 
 from ._exceptions import LoadError, LoadErrorReason, BstError
 | 
| 31 | 31 | 
 from ._message import Message, MessageType
 | 
| 32 | 32 | 
 from ._profile import Topics, profile_start, profile_end
 | 
| 33 | 
-from ._artifactcache import ArtifactCache
 | 
|
| 33 | 
+from ._artifactcache import ArtifactCache, ArtifactCacheUsage
 | 
|
| 34 | 34 | 
 from ._cas import CASCache
 | 
| 35 | 35 | 
 from ._workspaces import Workspaces, WorkspaceProjectCache, WORKSPACE_PROJECT_FILE
 | 
| 36 | 36 | 
 from .plugin import _plugin_lookup
 | 
| ... | ... | @@ -289,6 +289,16 @@ class Context(): | 
| 289 | 289 | 
 | 
| 290 | 290 | 
         return self._artifactcache
 | 
| 291 | 291 | 
 | 
| 292 | 
+    # get_artifact_cache_usage()
 | 
|
| 293 | 
+    #
 | 
|
| 294 | 
+    # Fetches the current usage of the artifact cache
 | 
|
| 295 | 
+    #
 | 
|
| 296 | 
+    # Returns:
 | 
|
| 297 | 
+    #     (ArtifactCacheUsage): The current status
 | 
|
| 298 | 
+    #
 | 
|
| 299 | 
+    def get_artifact_cache_usage(self):
 | 
|
| 300 | 
+        return ArtifactCacheUsage(self.artifactcache)
 | 
|
| 301 | 
+  | 
|
| 292 | 302 | 
     # add_project():
 | 
| 293 | 303 | 
     #
 | 
| 294 | 304 | 
     # Add a project to the context.
 | 
| ... | ... | @@ -33,6 +33,7 @@ from .. import __version__ as bst_version | 
| 33 | 33 | 
 from .._exceptions import ImplError
 | 
| 34 | 34 | 
 from .._message import MessageType
 | 
| 35 | 35 | 
 from ..plugin import _plugin_lookup
 | 
| 36 | 
+from .. import utils
 | 
|
| 36 | 37 | 
 | 
| 37 | 38 | 
 | 
| 38 | 39 | 
 # These messages are printed a bit differently
 | 
| ... | ... | @@ -449,12 +450,16 @@ class LogLine(Widget): | 
| 449 | 450 | 
         self._resolved_keys = {element: element._get_cache_key() for element in stream.session_elements}
 | 
| 450 | 451 | 
 | 
| 451 | 452 | 
         # Main invocation context
 | 
| 453 | 
+        usage = context.get_artifact_cache_usage()
 | 
|
| 452 | 454 | 
         text += '\n'
 | 
| 453 | 455 | 
         text += self.content_profile.fmt("BuildStream Version {}\n".format(bst_version), bold=True)
 | 
| 454 | 456 | 
         values = OrderedDict()
 | 
| 455 | 457 | 
         values["Session Start"] = starttime.strftime('%A, %d-%m-%Y at %H:%M:%S')
 | 
| 456 | 458 | 
         values["Project"] = "{} ({})".format(project.name, project.directory)
 | 
| 457 | 459 | 
         values["Targets"] = ", ".join([t.name for t in stream.targets])
 | 
| 460 | 
+        values["Cache Usage"] = "{} / {} ({}%)".format(
 | 
|
| 461 | 
+            utils._pretty_size(usage.used_size, dec_places=1),
 | 
|
| 462 | 
+            usage.quota_config, usage.used_percent)
 | 
|
| 458 | 463 | 
         text += self._format_values(values)
 | 
| 459 | 464 | 
 | 
| 460 | 465 | 
         # User configurations
 | 
