Skip to content

Commit 1525dcb

Browse files
committed
fix: refresh schedule
1 parent 9414ba5 commit 1525dcb

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

internal/workers/refresh_scheduler.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"time"
55

66
"github.com/hibiken/asynq"
7+
"github.com/robfig/cron/v3"
78
"github.com/rs/zerolog"
89
"gorm.io/gorm"
910

@@ -110,9 +111,44 @@ func checkAndEnqueueRefreshTasks(client *asynq.Client, db *gorm.DB, logger zerol
110111
return
111112
}
112113

114+
// Calculate and update NextRefreshAt immediately after scheduling
115+
// This prevents the scheduler from creating new restores every minute
116+
now := time.Now()
117+
nextRefresh := calculateNextRefreshTime(config.RefreshSchedule, now)
118+
if nextRefresh != nil {
119+
if err := db.Model(&config).Update("next_refresh_at", nextRefresh).Error; err != nil {
120+
logger.Error().
121+
Err(err).
122+
Str("config_id", config.ID).
123+
Msg("Failed to update next_refresh_at")
124+
} else {
125+
logger.Info().
126+
Str("config_id", config.ID).
127+
Time("next_refresh_at", *nextRefresh).
128+
Msg("Updated next_refresh_at")
129+
}
130+
}
131+
113132
logger.Info().
114133
Str("config_id", config.ID).
115134
Str("database_id", database.ID).
116135
Bool("schema_only", config.SchemaOnly).
117136
Msg("Refresh restore task enqueued successfully")
118137
}
138+
139+
// calculateNextRefreshTime calculates next refresh time from cron schedule
140+
func calculateNextRefreshTime(cronExpr string, from time.Time) *time.Time {
141+
if cronExpr == "" {
142+
return nil
143+
}
144+
145+
// Parse cron expression (standard 5-field format: minute hour day-of-month month day-of-week)
146+
parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
147+
schedule, err := parser.Parse(cronExpr)
148+
if err != nil {
149+
return nil
150+
}
151+
152+
next := schedule.Next(from)
153+
return &next
154+
}

0 commit comments

Comments
 (0)