Skip to content

Commit d0476d8

Browse files
fix: optimised the artifacts listing query and added query versioned support (#4375)
* add v2 query for fetching artifacts * query update
1 parent 5a54229 commit d0476d8

File tree

5 files changed

+61
-2
lines changed

5 files changed

+61
-2
lines changed

api/bean/ValuesOverrideRequest.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ type ArtifactsListFilterOptions struct {
113113
PipelineId int
114114
StageType WorkflowType
115115

116+
// CiPipelineId is id of ci-pipeline present in the same app-workflow of PipelineId
117+
CiPipelineId int
118+
116119
//parent satge data
117120
ParentCdId int
118121
ParentId int
@@ -126,4 +129,7 @@ type ArtifactsListFilterOptions struct {
126129

127130
//pluginStage
128131
PluginStage string
132+
133+
// UseCdStageQueryV2 is to set query version
134+
UseCdStageQueryV2 bool
129135
}

internal/sql/repository/CiArtifactRepository.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,13 +713,22 @@ func (impl CiArtifactRepositoryImpl) GetArtifactsByParentCiWorkflowId(parentCiWo
713713
func (impl CiArtifactRepositoryImpl) FindArtifactByListFilter(listingFilterOptions *bean.ArtifactsListFilterOptions) ([]CiArtifact, int, error) {
714714

715715
var ciArtifactsResp []CiArtifactWithExtraData
716-
var ciArtifacts []CiArtifact
716+
ciArtifacts := make([]CiArtifact, 0)
717717
totalCount := 0
718718
finalQuery := BuildQueryForArtifactsForCdStage(*listingFilterOptions)
719719
_, err := impl.dbConnection.Query(&ciArtifactsResp, finalQuery)
720720
if err == pg.ErrNoRows || len(ciArtifactsResp) == 0 {
721721
return ciArtifacts, totalCount, nil
722722
}
723+
724+
if listingFilterOptions.UseCdStageQueryV2 {
725+
for _, cia := range ciArtifactsResp {
726+
totalCount = cia.TotalCount
727+
ciArtifacts = append(ciArtifacts, cia.CiArtifact)
728+
}
729+
return ciArtifacts, totalCount, err
730+
}
731+
723732
artifactIds := make([]int, len(ciArtifactsResp))
724733
for i, af := range ciArtifactsResp {
725734
artifactIds[i] = af.Id

internal/sql/repository/CiArtifactsListingQueryBuilder.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ func BuildQueryForArtifactsForCdStage(listingFilterOptions bean.ArtifactsListFil
5050
// expected result -> will fetch all successfully deployed artifacts ar parent stage plus its own stage. Along with this it will
5151
// also fetch all artifacts generated by plugin at pre_cd or post_cd process (will use data_source in ci artifact table for this)
5252

53+
if listingFilterOptions.UseCdStageQueryV2 {
54+
return buildQueryForArtifactsForCdStageV2(listingFilterOptions)
55+
}
56+
5357
commonQuery := " from ci_artifact LEFT JOIN cd_workflow ON ci_artifact.id = cd_workflow.ci_artifact_id" +
5458
" LEFT JOIN cd_workflow_runner ON cd_workflow_runner.cd_workflow_id=cd_workflow.id " +
5559
" Where (((cd_workflow_runner.id in (select MAX(cd_workflow_runner.id) OVER (PARTITION BY cd_workflow.ci_artifact_id) FROM cd_workflow_runner inner join cd_workflow on cd_workflow.id=cd_workflow_runner.cd_workflow_id))" +
@@ -72,6 +76,36 @@ func BuildQueryForArtifactsForCdStage(listingFilterOptions bean.ArtifactsListFil
7276
return finalQuery
7377
}
7478

79+
func buildQueryForArtifactsForCdStageV2(listingFilterOptions bean.ArtifactsListFilterOptions) string {
80+
whereCondition := fmt.Sprintf(" WHERE (id IN ("+
81+
" SELECT DISTINCT(cd_workflow.ci_artifact_id) as ci_artifact_id "+
82+
" FROM cd_workflow_runner"+
83+
" INNER JOIN cd_workflow ON cd_workflow.id = cd_workflow_runner.cd_workflow_id "+
84+
" AND (cd_workflow.pipeline_id = %d OR cd_workflow.pipeline_id = %d)"+
85+
" WHERE ("+
86+
" (cd_workflow.pipeline_id = %d AND cd_workflow_runner.workflow_type = '%s')"+
87+
" OR"+
88+
" (cd_workflow.pipeline_id = %d"+
89+
" AND cd_workflow_runner.workflow_type = '%s'"+
90+
" AND cd_workflow_runner.status IN ('Healthy','Succeeded')"+
91+
" )"+
92+
" ) ) ", listingFilterOptions.PipelineId, listingFilterOptions.ParentId, listingFilterOptions.PipelineId, listingFilterOptions.StageType, listingFilterOptions.ParentId, listingFilterOptions.ParentStageType)
93+
94+
whereCondition = fmt.Sprintf(" %s OR (ci_artifact.component_id = %d AND ci_artifact.data_source= '%s' ))", whereCondition, listingFilterOptions.ParentId, listingFilterOptions.PluginStage)
95+
if listingFilterOptions.SearchString != EmptyLikeRegex {
96+
whereCondition = whereCondition + fmt.Sprintf(" AND ci_artifact.image LIKE '%s' ", listingFilterOptions.SearchString)
97+
}
98+
if len(listingFilterOptions.ExcludeArtifactIds) > 0 {
99+
whereCondition = whereCondition + fmt.Sprintf(" AND ( ci_artifact.id NOT IN (%s))", helper.GetCommaSepratedString(listingFilterOptions.ExcludeArtifactIds))
100+
}
101+
102+
selectQuery := fmt.Sprintf(" SELECT ci_artifact.* ,COUNT(id) OVER() AS total_count " +
103+
" FROM ci_artifact")
104+
ordeyByAndPaginated := fmt.Sprintf(" ORDER BY id DESC LIMIT %d OFFSET %d ", listingFilterOptions.Limit, listingFilterOptions.Offset)
105+
finalQuery := selectQuery + whereCondition + ordeyByAndPaginated
106+
return finalQuery
107+
}
108+
75109
func BuildQueryForArtifactsForRollback(listingFilterOptions bean.ArtifactsListFilterOptions) string {
76110
commonQuery := " FROM cd_workflow_runner cdwr " +
77111
" INNER JOIN cd_workflow cdw ON cdw.id=cdwr.cd_workflow_id " +

pkg/pipeline/AppArtifactManager.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
2626
bean2 "github.com/devtron-labs/devtron/pkg/bean"
2727
repository2 "github.com/devtron-labs/devtron/pkg/pipeline/repository"
28+
"github.com/devtron-labs/devtron/pkg/pipeline/types"
2829
"github.com/devtron-labs/devtron/pkg/user"
2930
"github.com/go-pg/pg"
3031
"go.uber.org/zap"
@@ -56,6 +57,7 @@ type AppArtifactManagerImpl struct {
5657
ciArtifactRepository repository.CiArtifactRepository
5758
ciWorkflowRepository pipelineConfig.CiWorkflowRepository
5859
pipelineStageService PipelineStageService
60+
config *types.CdConfig
5961
cdPipelineConfigService CdPipelineConfigService
6062
dockerArtifactRegistry dockerArtifactStoreRegistry.DockerArtifactStoreRepository
6163
CiPipelineRepository pipelineConfig.CiPipelineRepository
@@ -74,7 +76,10 @@ func NewAppArtifactManagerImpl(
7476
dockerArtifactRegistry dockerArtifactStoreRegistry.DockerArtifactStoreRepository,
7577
CiPipelineRepository pipelineConfig.CiPipelineRepository,
7678
ciTemplateService CiTemplateService) *AppArtifactManagerImpl {
77-
79+
cdConfig, err := types.GetCdConfig()
80+
if err != nil {
81+
return nil
82+
}
7883
return &AppArtifactManagerImpl{
7984
logger: logger,
8085
cdWorkflowRepository: cdWorkflowRepository,
@@ -84,6 +89,7 @@ func NewAppArtifactManagerImpl(
8489
ciWorkflowRepository: ciWorkflowRepository,
8590
cdPipelineConfigService: cdPipelineConfigService,
8691
pipelineStageService: pipelineStageService,
92+
config: cdConfig,
8793
dockerArtifactRegistry: dockerArtifactRegistry,
8894
CiPipelineRepository: CiPipelineRepository,
8995
ciTemplateService: ciTemplateService,
@@ -606,11 +612,14 @@ func (impl *AppArtifactManagerImpl) RetrieveArtifactsByCDPipelineV2(pipeline *pi
606612
ciArtifactsResponse := &bean2.CiArtifactResponse{}
607613

608614
artifactListingFilterOpts.PipelineId = pipeline.Id
615+
// this will be 0 for external-ci cases, note: do not refer this for external-ci cases
616+
artifactListingFilterOpts.CiPipelineId = pipeline.CiPipelineId
609617
artifactListingFilterOpts.ParentId = parentId
610618
artifactListingFilterOpts.ParentCdId = parentCdId
611619
artifactListingFilterOpts.ParentStageType = parentType
612620
artifactListingFilterOpts.StageType = stage
613621
artifactListingFilterOpts.SearchString = "%" + artifactListingFilterOpts.SearchString + "%"
622+
artifactListingFilterOpts.UseCdStageQueryV2 = impl.config.UseArtifactListingQueryV2
614623
ciArtifactsRefs, latestWfArtifactId, latestWfArtifactStatus, totalCount, err := impl.BuildArtifactsList(artifactListingFilterOpts)
615624
if err != nil && err != pg.ErrNoRows {
616625
impl.logger.Errorw("error in getting artifacts for child cd stage", "err", err, "stage", stage)

pkg/pipeline/types/CiCdConfig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ type CiCdConfig struct {
121121
BuildxProvenanceMode string `env:"BUILDX_PROVENANCE_MODE" envDefault:""` //provenance is set to false if this flag is not set
122122
ExtBlobStorageCmName string `env:"EXTERNAL_BLOB_STORAGE_CM_NAME" envDefault:"blob-storage-cm"`
123123
ExtBlobStorageSecretName string `env:"EXTERNAL_BLOB_STORAGE_SECRET_NAME" envDefault:"blob-storage-secret"`
124+
UseArtifactListingQueryV2 bool `env:"USE_ARTIFACT_LISTING_QUERY_V2" envDefault:"true"`
124125
}
125126

126127
type CiConfig struct {

0 commit comments

Comments
 (0)