diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolver.java b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolver.java index b34d15bc1c..518b6d682d 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolver.java +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolver.java @@ -252,8 +252,7 @@ public void resolveArtifacts(@Nonnull Map pipeline) { return; } - List priorArtifacts = - getArtifactsForPipelineId((String) pipeline.get("id"), new ExecutionCriteria()); + List priorArtifacts = getPriorArtifacts(pipeline); LinkedHashSet resolvedArtifacts = resolveExpectedArtifacts(expectedArtifacts, receivedArtifacts, priorArtifacts, true); LinkedHashSet allArtifacts = new LinkedHashSet<>(receivedArtifacts); @@ -277,6 +276,16 @@ public void resolveArtifacts(@Nonnull Map pipeline) { } } + private List getPriorArtifacts(final Map pipeline) { + // set pageSize to a single record to avoid hydrating all of the stored Executions for + // the pipeline, since getArtifactsForPipelineId only uses the most recent Execution from the + // returned Observable + ExecutionCriteria criteria = new ExecutionCriteria(); + criteria.setPageSize(1); + criteria.setSortType(ExecutionRepository.ExecutionComparator.START_TIME_OR_ID); + return getArtifactsForPipelineId((String) pipeline.get("id"), criteria); + } + public Artifact resolveSingleArtifact( ExpectedArtifact expectedArtifact, List possibleMatches, diff --git a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolverSpec.groovy b/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolverSpec.groovy index cbfde12f99..6c4ad54402 100644 --- a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolverSpec.groovy +++ b/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/util/ArtifactResolverSpec.groovy @@ -32,8 +32,20 @@ import static com.netflix.spinnaker.orca.test.model.ExecutionBuilder.stage class ArtifactResolverSpec extends Specification { ObjectMapper objectMapper = new ObjectMapper() + + def pipelineId = "abc" + + def expectedExecutionCriteria = { + def criteria = new ExecutionRepository.ExecutionCriteria() + criteria.setPageSize(1) + return criteria + }() + def executionRepository = Stub(ExecutionRepository) { - retrievePipelinesForPipelineConfigId(*_) >> Observable.empty(); + // only a call to retrievePipelinesForPipelineConfigId() with these argument values is expected + retrievePipelinesForPipelineConfigId(pipelineId, expectedExecutionCriteria) >> Observable.empty(); + // any other interaction is unexpected + 0 * _ } def makeArtifactResolver() {