You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by no...@apache.org on 2020/12/29 12:24:39 UTC

[buildstream] 01/02: _artifactcache.py: Skip push only if server has identical artifact

This is an automated email from the ASF dual-hosted git repository.

not-in-ldap pushed a commit to branch willsalmon/test-push-update
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 0dbdd83e111ad805f73202edbc992411e8e0a296
Author: Jürg Billeter <j...@bitron.ch>
AuthorDate: Tue Jun 30 14:02:05 2020 +0200

    _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.
---
 src/buildstream/_artifactcache.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/buildstream/_artifactcache.py b/src/buildstream/_artifactcache.py
index c1e87b6..46fc5fb 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():
     #