Skip to content

Commit 71e3c0a

Browse files
authored
set max limit on number of impacted project per action (#2049)
* set max limit on number of impacted project per action
1 parent cc703a9 commit 71e3c0a

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

backend/config/envgetters.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package config
22

33
import (
4+
"github.com/spf13/cast"
5+
"log/slog"
46
"os"
57
)
68

@@ -9,3 +11,17 @@ func LimitByNumOfFilesChanged() bool {
911
// number of files changed
1012
return os.Getenv("DIGGER_LIMIT_MAX_PROJECTS_TO_FILES_CHANGED") == "1"
1113
}
14+
15+
func MaxImpactedProjectsPerChange() int {
16+
m := os.Getenv("DIGGER_MAX_PROJECTS_PER_CHANGE")
17+
if m == "" {
18+
return 99999
19+
} else {
20+
v, err := cast.ToIntE(m)
21+
if err != nil {
22+
slog.Warn("unable to cast DIGGER_MAX_PROJECTS_PER_CHANGE to int, defaulting to 99999", "DIGGER_MAX_PROJECTS_PER_CHANGE", m)
23+
return 99999
24+
}
25+
return v
26+
}
27+
}

backend/controllers/github.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,26 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
610610
}
611611
}
612612

613+
maxImpactedProjectsPerChange := config2.MaxImpactedProjectsPerChange()
614+
if len(impactedProjects) > maxImpactedProjectsPerChange {
615+
slog.Error("Number of impacted projects exceeds number of changed files",
616+
"prNumber", prNumber,
617+
"impactedProjectCount", len(impactedProjects),
618+
"changedFileCount", len(changedFiles),
619+
)
620+
621+
commentReporterManager.UpdateComment(fmt.Sprintf(":x: Error the number impacted projects %v exceeds Max allowed ImpactedProjectsPerChange: %v, we set this limit to protect against hitting github API limits", len(impactedProjects), maxImpactedProjectsPerChange))
622+
623+
slog.Debug("Detailed event information",
624+
slog.Group("details",
625+
slog.Any("changedFiles", changedFiles),
626+
slog.Int("configLength", len(diggerYmlStr)),
627+
slog.Int("impactedProjectCount", len(impactedProjects)),
628+
),
629+
)
630+
return fmt.Errorf("error processing event")
631+
}
632+
613633
diggerCommand, err := orchestrator_scheduler.GetCommandFromJob(jobsForImpactedProjects[0])
614634
if err != nil {
615635
slog.Error("Could not determine Digger command from job",
@@ -1442,6 +1462,26 @@ func handleIssueCommentEvent(gh utils.GithubClientProvider, payload *github.Issu
14421462
}
14431463
}
14441464

1465+
maxImpactedProjectsPerChange := config2.MaxImpactedProjectsPerChange()
1466+
if len(impactedProjects) > maxImpactedProjectsPerChange {
1467+
slog.Error("Number of impacted projects exceeds number of changed files",
1468+
"prNumber", issueNumber,
1469+
"impactedProjectCount", len(impactedProjects),
1470+
"changedFileCount", len(changedFiles),
1471+
)
1472+
1473+
commentReporterManager.UpdateComment(fmt.Sprintf(":x: Error the number impacted projects %v exceeds Max allowed ImpactedProjectsPerChange: %v, we set this limit to protect against hitting github API limits", len(impactedProjects), maxImpactedProjectsPerChange))
1474+
1475+
slog.Debug("Detailed event information",
1476+
slog.Group("details",
1477+
slog.Any("changedFiles", changedFiles),
1478+
slog.Int("configLength", len(diggerYmlStr)),
1479+
slog.Int("impactedProjectCount", len(impactedProjects)),
1480+
),
1481+
)
1482+
return fmt.Errorf("error processing event")
1483+
}
1484+
14451485
// perform unlocking in backend
14461486
if config.PrLocks {
14471487
slog.Info("Processing PR locks for impacted projects",

fly-pro.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ primary_region = 'lhr'
1212
JWT_AUTH = 'true'
1313
DIGGER_PROJECTS_SVC_APP_NAME = 'projects-refresh-service'
1414
DIGGER_LOAD_PROJECTS_ON_PUSH = 'true'
15-
15+
DIGGER_MAX_PROJECTS_PER_CHANGE=100
1616

1717
[build]
1818
dockerfile = 'Dockerfile_backend_ee'

0 commit comments

Comments
 (0)