Skip to content

Commit 8aa1d9a

Browse files
committed
lock
1 parent 380c81d commit 8aa1d9a

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

coderd/database/lock.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const (
1010
LockIDEnterpriseDeploymentSetup
1111
LockIDDBRollup
1212
LockIDDBPurge
13+
LockIDReportGenerator
1314
)
1415

1516
// GenLockID generates a unique and consistent lock ID from a given string.

coderd/notifications/reports/generator.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package reports
33
import (
44
"context"
55
"io"
6-
"log/slog"
76
"time"
87

8+
"cdr.dev/slog"
9+
910
"github.com/coder/coder/v2/coderd/database"
1011
"github.com/coder/coder/v2/coderd/database/dbauthz"
1112
"github.com/coder/coder/v2/coderd/database/dbtime"
@@ -27,6 +28,27 @@ func NewReportGenerator(ctx context.Context, logger slog.Logger, db database.Sto
2728
ticker := clk.NewTicker(delay)
2829
doTick := func(start time.Time) {
2930
defer ticker.Reset(delay)
31+
// Start a transaction to grab advisory lock, we don't want to run generator jobs at the same time (multiple replicas).
32+
if err := db.InTx(func(tx database.Store) error {
33+
// Acquire a lock to ensure that only one instance of the generator is running at a time.
34+
ok, err := tx.TryAcquireLock(ctx, database.LockIDReportGenerator)
35+
if err != nil {
36+
return err
37+
}
38+
if !ok {
39+
logger.Debug(ctx, "unable to acquire lock for generating periodic reports, skipping")
40+
return nil
41+
}
42+
43+
// TODO
44+
45+
logger.Info(ctx, "report generator finished", slog.F("duration", clk.Since(start)))
46+
47+
return nil
48+
}, nil); err != nil {
49+
logger.Error(ctx, "failed to generate reports", slog.Error(err))
50+
return
51+
}
3052
}
3153

3254
go func() {

0 commit comments

Comments
 (0)