Skip to content

Commit 57a031d

Browse files
chore: workspace save ticker (#697)
1 parent c56826f commit 57a031d

File tree

3 files changed

+40
-16
lines changed

3 files changed

+40
-16
lines changed

apps/workspace-engine/main.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"syscall"
1010
"time"
1111

12+
"workspace-engine/pkg/events/handler"
1213
"workspace-engine/pkg/kafka"
1314
"workspace-engine/pkg/server"
1415
"workspace-engine/pkg/ticker"
@@ -145,14 +146,22 @@ func main() {
145146
defer producer.Close()
146147

147148
// Start periodic ticker for time-sensitive policy evaluation
148-
workspaceTicker := ticker.New(producer)
149+
workspaceTicker := ticker.NewDefault(producer)
149150
go func() {
150151
log.Info("Workspace ticker started")
151152
if err := workspaceTicker.Run(ctx); err != nil {
152153
log.Error("Ticker error", "error", err)
153154
}
154155
}()
155156

157+
workspaceSaveTicker := ticker.New(producer, 1*time.Hour, string(handler.WorkspaceSave))
158+
go func() {
159+
log.Info("Workspace save ticker started")
160+
if err := workspaceSaveTicker.Run(ctx); err != nil {
161+
log.Error("Ticker error", "error", err)
162+
}
163+
}()
164+
156165
go func() {
157166
log.Info("Kafka consumer started")
158167
if err := kafka.RunConsumer(ctx); err != nil {

apps/workspace-engine/pkg/ticker/ticker.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,29 @@ var tracer = otel.Tracer("ticker")
2727

2828
// Ticker periodically emits tick events for active workspaces
2929
type Ticker struct {
30-
producer kafka.EventProducer
31-
interval time.Duration
30+
producer kafka.EventProducer
31+
interval time.Duration
32+
eventType string
3233
}
3334

34-
// New creates a new ticker with the configured interval
35-
func New(producer kafka.EventProducer) *Ticker {
35+
// NewDefault creates a new ticker with the configured interval
36+
func NewDefault(producer kafka.EventProducer) *Ticker {
3637
interval := getTickInterval()
3738
log.Info("Ticker initialized", "interval", interval)
3839

3940
return &Ticker{
40-
producer: producer,
41-
interval: interval,
41+
producer: producer,
42+
interval: interval,
43+
eventType: WorkspaceTickEventType,
44+
}
45+
}
46+
47+
// New creates a new ticker with the configured interval and event type
48+
func New(producer kafka.EventProducer, interval time.Duration, eventType string) *Ticker {
49+
return &Ticker{
50+
producer: producer,
51+
interval: interval,
52+
eventType: eventType,
4253
}
4354
}
4455

@@ -148,7 +159,7 @@ func (t *Ticker) emitTickForWorkspace(ctx context.Context, workspaceID string) e
148159

149160
span.SetAttributes(attribute.String("workspace.id", workspaceID))
150161

151-
err := t.producer.ProduceEvent(WorkspaceTickEventType, workspaceID, nil)
162+
err := t.producer.ProduceEvent(t.eventType, workspaceID, nil)
152163
if err != nil {
153164
span.RecordError(err)
154165
span.SetStatus(codes.Error, "failed to produce tick event")

apps/workspace-engine/pkg/ticker/ticker_test.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ func (m *MockEventProducer) Close() {
3232
func TestEmitTicks_NoWorkspaces(t *testing.T) {
3333
mockProducer := new(MockEventProducer)
3434
ticker := &Ticker{
35-
producer: mockProducer,
36-
interval: time.Minute,
35+
producer: mockProducer,
36+
interval: time.Minute,
37+
eventType: WorkspaceTickEventType,
3738
}
3839

3940
// Ensure no workspaces are registered
@@ -49,8 +50,9 @@ func TestEmitTicks_NoWorkspaces(t *testing.T) {
4950
func TestEmitTicks_MultipleWorkspaces(t *testing.T) {
5051
mockProducer := new(MockEventProducer)
5152
ticker := &Ticker{
52-
producer: mockProducer,
53-
interval: time.Minute,
53+
producer: mockProducer,
54+
interval: time.Minute,
55+
eventType: WorkspaceTickEventType,
5456
}
5557

5658
// Register test workspaces
@@ -80,8 +82,9 @@ func TestEmitTicks_MultipleWorkspaces(t *testing.T) {
8082
func TestEmitTickForWorkspace(t *testing.T) {
8183
mockProducer := new(MockEventProducer)
8284
ticker := &Ticker{
83-
producer: mockProducer,
84-
interval: time.Minute,
85+
producer: mockProducer,
86+
interval: time.Minute,
87+
eventType: WorkspaceTickEventType,
8588
}
8689

8790
workspaceID := "test-workspace"
@@ -133,8 +136,9 @@ func TestGetTickInterval_Zero(t *testing.T) {
133136
func TestTickerRun_Cancellation(t *testing.T) {
134137
mockProducer := new(MockEventProducer)
135138
ticker := &Ticker{
136-
producer: mockProducer,
137-
interval: 10 * time.Millisecond, // Short interval for testing
139+
producer: mockProducer,
140+
interval: 10 * time.Millisecond, // Short interval for testing
141+
eventType: WorkspaceTickEventType,
138142
}
139143

140144
ctx, cancel := context.WithCancel(context.Background())

0 commit comments

Comments
 (0)