diff options
author | Jürg Billeter <j@bitron.ch> | 2020-06-30 14:02:05 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2020-06-30 14:02:05 +0200 |
commit | ea520f9d1d77fcb72bc8ebc119781107c094c245 (patch) | |
tree | 9685b95c8ac63b70bb4127cc8adbb200cd5bbd06 /src | |
parent | 257426c3b6e90a450b6faf78ef38e6b436029fb5 (diff) | |
download | buildstream-ea520f9d1d77fcb72bc8ebc119781107c094c245.tar.gz |
_artifactcache.py: Skip push only if server has identical artifact
The existing artifact on a server may refer to a previous build and the
referenced blobs may no longer exist. As we push blobs referenced by the
local artifact proto, we can skip pushing the artifact proto only if the
artifact proto on the server is identical.
It would be more efficient to always push the artifact proto without
checking what artifact proto is currently on the server. However, we
need the extra information to mark push jobs as skipped. This is clearer
to users and also required by some test cases.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildstream/_artifactcache.py | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/buildstream/_artifactcache.py b/src/buildstream/_artifactcache.py index c1e87b6dc..46fc5fbfb 100644 --- a/src/buildstream/_artifactcache.py +++ b/src/buildstream/_artifactcache.py @@ -541,26 +541,27 @@ class ArtifactCache(BaseCache): keys = list(utils._deduplicate([artifact_proto.strong_key, artifact_proto.weak_key])) - # Check whether the artifact is on the server + pushed = False + for key in keys: try: - remote.get_artifact(element.get_artifact_name(key=key)) + remote_artifact = remote.get_artifact(element.get_artifact_name(key=key)) + # Skip push if artifact is already on the server + if remote_artifact == artifact_proto: + continue except grpc.RpcError as e: if e.code() != grpc.StatusCode.NOT_FOUND: raise ArtifactError( "Error checking artifact cache with status {}: {}".format(e.code().name, e.details()) ) - else: - return False - # If not, we send the artifact proto - for key in keys: try: remote.update_artifact(element.get_artifact_name(key=key), artifact_proto) + pushed = True except grpc.RpcError as e: raise ArtifactError("Failed to push artifact with status {}: {}".format(e.code().name, e.details())) - return True + return pushed # _pull_artifact_storage(): # |