Skip to content

Commit fd91307

Browse files
committed
feat: wait for checks before shutdown
[skip ci]
1 parent 72ae739 commit fd91307

File tree

6 files changed

+44
-24
lines changed

6 files changed

+44
-24
lines changed

canary-checker.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66

77
# topology.runNow=true
88
log.level.db=warn
9+
# check.concurrency=100
910

1011
# jobs.ComponentRelationshipSync.runNow=true

cmd/operator.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
apicontext "github.com/flanksource/canary-checker/api/context"
99
"github.com/flanksource/canary-checker/pkg/cache"
1010
"github.com/flanksource/canary-checker/pkg/jobs"
11+
"github.com/flanksource/canary-checker/pkg/jobs/canary"
1112
canaryJobs "github.com/flanksource/canary-checker/pkg/jobs/canary"
1213
"github.com/flanksource/canary-checker/pkg/runner"
1314
"github.com/flanksource/canary-checker/pkg/utils"
@@ -96,6 +97,12 @@ func run() error {
9697
// so we use a goroutine to unblock server start
9798
// to prevent health check from failing
9899
go jobs.Start()
100+
101+
// TODO: stop the cron scheduler so that no more checks are scheduled
102+
103+
shutdown.AddHookWithPriority("check jobs", shutdown.PriorityJobs, func() {
104+
canary.AcquireAllCheckLocks(ctx)
105+
})
99106
}
100107

101108
go serve()

cmd/serve.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/flanksource/canary-checker/pkg/db"
1717
"github.com/flanksource/canary-checker/pkg/echo"
1818
"github.com/flanksource/canary-checker/pkg/jobs"
19+
"github.com/flanksource/canary-checker/pkg/jobs/canary"
1920
canaryJobs "github.com/flanksource/canary-checker/pkg/jobs/canary"
2021
echov4 "github.com/labstack/echo/v4"
2122

@@ -49,6 +50,12 @@ var Serve = &cobra.Command{
4950
canaryJobs.StartScanCanaryConfigs(apicontext.DefaultContext, dataFile, configFiles)
5051
if executor {
5152
jobs.Start()
53+
54+
// TODO: stop the cron scheduler so that no more checks are scheduled
55+
56+
shutdown.AddHookWithPriority("check jobs", shutdown.PriorityJobs, func() {
57+
canary.AcquireAllCheckLocks(apicontext.DefaultContext)
58+
})
5259
}
5360

5461
serve()

go.mod

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,9 @@ require (
119119
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect
120120
github.com/aws/aws-sdk-go-v2/service/sts v1.30.5 // indirect
121121
github.com/aws/smithy-go v1.20.4 // indirect
122-
github.com/bahlo/generic-list-go v0.2.0 // indirect
123122
github.com/beorn7/perks v1.0.1 // indirect
124123
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
125124
github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect
126-
github.com/buger/jsonparser v1.1.1 // indirect
127125
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
128126
github.com/cespare/xxhash/v2 v2.3.0 // indirect
129127
github.com/cloudflare/circl v1.3.7 // indirect
@@ -200,7 +198,6 @@ require (
200198
github.com/hirochachacha/go-smb2 v1.1.0 // indirect
201199
github.com/imdario/mergo v0.3.16 // indirect
202200
github.com/inconshreveable/mousetrap v1.1.0 // indirect
203-
github.com/invopop/jsonschema v0.12.0 // indirect
204201
github.com/itchyny/gojq v0.12.16 // indirect
205202
github.com/itchyny/timefmt-go v0.1.6 // indirect
206203
github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 // indirect
@@ -275,14 +272,10 @@ require (
275272
github.com/valyala/fasttemplate v1.2.2 // indirect
276273
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
277274
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
278-
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
279275
github.com/xanzy/ssh-agent v0.3.3 // indirect
280276
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
281277
github.com/xdg-go/scram v1.1.2 // indirect
282278
github.com/xdg-go/stringprep v1.0.4 // indirect
283-
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
284-
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
285-
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
286279
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
287280
github.com/xlab/treeprint v1.2.0 // indirect
288281
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
@@ -334,7 +327,7 @@ require (
334327
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
335328
)
336329

337-
// replace github.com/flanksource/duty => ../duty
330+
replace github.com/flanksource/duty => ../duty
338331

339332
// replace github.com/flanksource/artifacts => ../artifacts
340333

go.sum

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.30.5/go.mod h1:vmSqFK+BVIwVpDAGZB3Co
748748
github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
749749
github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
750750
github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
751-
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
752-
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
753751
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
754752
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
755753
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -761,8 +759,6 @@ github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwN
761759
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
762760
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
763761
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
764-
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
765-
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
766762
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
767763
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXyeZBvSYvQf8u86jbKehZPVDDlkgDl4=
768764
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
@@ -865,8 +861,6 @@ github.com/flanksource/artifacts v1.0.15 h1:3ImJr2y0ZCXw/QrMhfJJktAT7pYD3sMZR5ix
865861
github.com/flanksource/artifacts v1.0.15/go.mod h1:qHVCnQu5k50aWNJ5UhpcAKEl7pAzqUrFFKGSm147G70=
866862
github.com/flanksource/commons v1.30.5 h1:p8PXGiNt7SurBBh9K3ea8/ZrDvacXSYHJSs/cqJLDK8=
867863
github.com/flanksource/commons v1.30.5/go.mod h1:26zdVkmMPsGpvfcsvst5WgsqcyRL8KqFNxkumagBN+A=
868-
github.com/flanksource/duty v1.0.727 h1:5f7mntZjtg4bvVCzLdIe2cwT8DnFtKYToq1H74T7tfo=
869-
github.com/flanksource/duty v1.0.727/go.mod h1:sZY2NytdenrkqXoMD6Gn2C8xH6dm5HsqOeE0p74Z2VE=
870864
github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc=
871865
github.com/flanksource/gomplate/v3 v3.24.39 h1:O763lnNIcTELSMYeIO0dNDfcb3LoZvzU1fr62I4Yxqg=
872866
github.com/flanksource/gomplate/v3 v3.24.39/go.mod h1:0wY/+UPvd7CxmiTBNmzZdWIEOUZAsRkpGY1j5R711O8=
@@ -1176,8 +1170,6 @@ github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
11761170
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
11771171
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
11781172
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
1179-
github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI=
1180-
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
11811173
github.com/itchyny/gojq v0.12.13/go.mod h1:JzwzAqenfhrPUuwbmEz3nu3JQmFLlQTQMUcOdnu/Sf4=
11821174
github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=
11831175
github.com/itchyny/gojq v0.12.16/go.mod h1:6abHbdC2uB9ogMS38XsErnfqJ94UlngIJGlRAIj4jTM=
@@ -1580,8 +1572,6 @@ github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IU
15801572
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
15811573
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
15821574
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
1583-
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
1584-
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
15851575
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
15861576
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
15871577
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
@@ -1590,12 +1580,6 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
15901580
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
15911581
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
15921582
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
1593-
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
1594-
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
1595-
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
1596-
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
1597-
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
1598-
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
15991583
github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4=
16001584
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
16011585
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=

pkg/jobs/canary/sync.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,31 @@ import (
1919
"github.com/flanksource/duty/job"
2020
"github.com/flanksource/duty/models"
2121
"github.com/robfig/cron/v3"
22+
"golang.org/x/sync/semaphore"
2223
)
2324

25+
const (
26+
propertyCheckConcurrency = "check.concurrency"
27+
)
28+
29+
var (
30+
// The maximum number of checks that can run concurrently
31+
defaultCheckConcurrency = 50
32+
33+
// Holds in the lock for every running check.
34+
// Can be overwritten by 'check.concurrency' property.
35+
globalCheckSemaphore *semaphore.Weighted
36+
)
37+
38+
// AcquireAllCheckLocks blocks until the global check sempahore is fully acquired.
39+
//
40+
// This helps to ensure that no checks are currently running.
41+
func AcquireAllCheckLocks(ctx context.Context) {
42+
ctx.Logger.V(6).Infof("acquiring all check locks")
43+
globalCheckSemaphore.Acquire(ctx, int64(ctx.Properties().Int(propertyCheckConcurrency, defaultCheckConcurrency)))
44+
ctx.Logger.V(6).Infof("acquired all check locks")
45+
}
46+
2447
var canaryJobs sync.Map
2548

2649
const DefaultCanarySchedule = "@every 5m"
@@ -140,6 +163,7 @@ func newCanaryJob(c CanaryJob) {
140163
IgnoreSuccessHistory: true,
141164
Retention: job.RetentionBalanced,
142165
ResourceID: c.DBCanary.ID.String(),
166+
Semaphores: []*semaphore.Weighted{globalCheckSemaphore},
143167
ResourceType: "canary",
144168
ID: fmt.Sprintf("%s/%s", c.Canary.Namespace, c.Canary.Name),
145169
Fn: c.Run,
@@ -159,6 +183,10 @@ var SyncCanaryJobs = &job.Job{
159183
Schedule: "@every 5m",
160184
Retention: job.RetentionFew,
161185
Fn: func(ctx job.JobRuntime) error {
186+
if globalCheckSemaphore == nil {
187+
globalCheckSemaphore = semaphore.NewWeighted(int64(ctx.Properties().Int("check.concurrency", defaultCheckConcurrency)))
188+
}
189+
162190
canaries, err := db.GetAllCanariesForSync(ctx.Context, runner.WatchNamespace)
163191
if err != nil {
164192
return err

0 commit comments

Comments
 (0)