summaryrefslogtreecommitdiff
path: root/src/buildstream/_artifactcache.py
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2020-06-30 14:02:05 +0200
committerJürg Billeter <j@bitron.ch>2020-06-30 14:02:05 +0200
commitea520f9d1d77fcb72bc8ebc119781107c094c245 (patch)
tree9685b95c8ac63b70bb4127cc8adbb200cd5bbd06 /src/buildstream/_artifactcache.py
parent257426c3b6e90a450b6faf78ef38e6b436029fb5 (diff)
downloadbuildstream-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/buildstream/_artifactcache.py')
-rw-r--r--src/buildstream/_artifactcache.py15
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():
#