diff --git a/database-4_test.go b/database-4_test.go index 37e17bf475633530cbc79c59adfea4d5a473353a..65417b2d20583c28cb67b62b6374f659e6a41c42 100644 --- a/database-4_test.go +++ b/database-4_test.go @@ -40,7 +40,7 @@ func TestWriteToDB4(t *testing.T) { id := job.GetID() job.mu.Lock() - job.stats = JobStats{ + job.stats = &JobStats{ JobID: id, RunCount: 20, SuccessCount: 30, diff --git a/database-8_test.go b/database-8_test.go index dfd8f91891ffc9fedbd626e8266481a55bf56bb0..3fb57b245ddbc31691b73ab26034601d17dbcef5 100644 --- a/database-8_test.go +++ b/database-8_test.go @@ -86,7 +86,7 @@ func TestCheckAndSaveOrUpdate(t *testing.T) { assert.Equal(t, PriorityDefault, jobPersistence.Priority) // second update should not update the priority, because update only update stats and logs // set stats and logs and test - job.stats = JobStats{ + job.stats = &JobStats{ JobID: job.GetID(), RunCount: 2, SuccessCount: 3, diff --git a/database.go b/database.go index 4144f9c8676beb8cad69d108085d86cbbbd50c2e..b86b5dcd7b8c93ed81a97256c9680a637b4a9953 100644 --- a/database.go +++ b/database.go @@ -135,7 +135,7 @@ func update(job *JobPersistence, db *gorm.DB) error { return db.Transaction(func(tx *gorm.DB) error { - if job.Stats != (JobStats{}) { + if job.Stats != nil { Info("Updating stats for job %s", job.ID) if job.Stats.RunCount == 0 { @@ -192,7 +192,7 @@ func save(job *JobPersistence, db *gorm.DB) error { } } - if job.Stats != (JobStats{}) { + if job.Stats != nil { job.Stats.JobID = job.ID if err := tx.Model(job.Stats). diff --git a/job.go b/job.go index bf3f1b6ff09b81407482b3f077c8d3bf719b115d..a08d69c900349a7dca5a2b7f572356e71faed4aa 100644 --- a/job.go +++ b/job.go @@ -54,7 +54,7 @@ type Job[T any] struct { runner Runnable[T] - stats JobStats + stats *JobStats logs []JobLog } @@ -65,7 +65,7 @@ func NewJob[T any](id JobID, runner Runnable[T]) *Job[T] { runner: runner, priority: PriorityDefault, logs: make([]JobLog, 0), - stats: JobStats{}, + stats: &JobStats{}, } } @@ -84,7 +84,7 @@ func (j *Job[T]) GetStats() JobStats { defer j.mu.Unlock() // workaround for gorm j.stats.JobID = j.id - return j.stats + return *j.stats } // GetPersistence returns the persistence of the job @@ -165,7 +165,7 @@ func (j *Job[T]) Resume() { func (j *Job[T]) ResetStats() { j.mu.Lock() defer j.mu.Unlock() - j.stats = JobStats{ + j.stats = &JobStats{ JobID: j.id, RunCount: 0, SuccessCount: 0, @@ -216,6 +216,12 @@ func (j *Job[T]) Execute(ctx context.Context) (RunGenericResult, error) { defer j.mu.Unlock() // Update RunCount + if j.stats == nil { + j.stats = &JobStats{ + JobID: j.id, + } + } + j.stats.RunCount++ // Update TimeMetrics diff --git a/persistence.go b/persistence.go index f51358159e9f5f8e01706bc187fd3c579eea243a..012552f1f655484fe1f4954a11fe9aeecc2c5dea 100644 --- a/persistence.go +++ b/persistence.go @@ -34,8 +34,8 @@ type JobPersistence struct { RetryDelayString *string `yaml:"retryDelay,omitempty" json:"retryDelay,omitempty" gorm:"-"` PauseUntilString *string `yaml:"pauseUntil" json:"pauseUntil,omitempty" gorm:"-"` - Logs []JobLog `gorm:"foreignKey:JobID;references:ID" json:"-" yaml:"-"` - Stats JobStats `gorm:"foreignKey:JobID" json:"stats" yaml:"stats"` + Logs []JobLog `gorm:"foreignKey:JobID;references:ID" json:"-" yaml:"-"` + Stats *JobStats `gorm:"foreignKey:JobID" json:"stats" yaml:"stats"` CreatedAt time.Time `gorm:"column:created_at" json:"createdAt" yaml:"createdAt"` UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt" yaml:"updatedAt"` @@ -155,7 +155,7 @@ func (jp JobPersistence) GetLogs() []JobLog { } func (jp JobPersistence) GetStats() JobStats { - return jp.Stats + return *jp.Stats } func (jp JobPersistence) GetID() JobID { diff --git a/persistence_test.go b/persistence_test.go index 321425b415d6b6cf38af8b75829eeaae81a94b6a..061912673b1a533960a7451f8aa0052989ac6926 100644 --- a/persistence_test.go +++ b/persistence_test.go @@ -126,6 +126,9 @@ func TestJobPersistence_MarshalUnmarshalJSON(t *testing.T) { TimeoutString: &time5m0sString, RetryDelayString: &time10sString, PauseUntilString: &timeRefString, + Stats: &JobStats{ + JobID: "", + }, }, expected: ` {"id":"","description":"","priority":0,"maxRetries":0,"runnable":{"type":""},"scheduler":{"type":""},"pause":false,"pauseReason":"","timeout":"5m0s","retryDelay":"10s","pauseUntil":"` + timeRefString + `","stats":{"jobId":"","runCount":0,"successCount":0,"errorCount":0,"timeMetrics":{"avg":0,"max":0,"min":0,"total":0},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"}`, }, @@ -139,7 +142,7 @@ func TestJobPersistence_MarshalUnmarshalJSON(t *testing.T) { RetryDelayString: &time30sString, PauseUntilString: &emptyString, }, - expected: `{"id":"","description":"","priority":0,"maxRetries":0,"runnable":{"type":""},"scheduler":{"type":""},"pause":false,"pauseReason":"","timeout":"1h0m0s","retryDelay":"30s","pauseUntil":"","stats":{"jobId":"","runCount":0,"successCount":0,"errorCount":0,"timeMetrics":{"avg":0,"max":0,"min":0,"total":0},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"}`, + expected: `{"id":"","description":"","priority":0,"maxRetries":0,"runnable":{"type":""},"scheduler":{"type":""},"pause":false,"pauseReason":"","timeout":"1h0m0s","retryDelay":"30s","pauseUntil":"","stats":null,"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"}`, }, { name: "Nil timeout and retryDelay", @@ -151,7 +154,7 @@ func TestJobPersistence_MarshalUnmarshalJSON(t *testing.T) { RetryDelayString: &emptyString, PauseUntilString: &emptyString, }, - expected: `{"id":"","description":"","priority":0,"maxRetries":0,"runnable":{"type":""},"scheduler":{"type":""},"pause":false,"pauseReason":"","timeout":"","retryDelay":"","pauseUntil":"","stats":{"jobId":"","runCount":0,"successCount":0,"errorCount":0,"timeMetrics":{"avg":0,"max":0,"min":0,"total":0},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"},"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"}`, + expected: `{"id":"","description":"","priority":0,"maxRetries":0,"runnable":{"type":""},"scheduler":{"type":""},"pause":false,"pauseReason":"","timeout":"","retryDelay":"","pauseUntil":"","stats":null,"createdAt":"0001-01-01T00:00:00Z","updatedAt":"0001-01-01T00:00:00Z"}`, }, } @@ -159,12 +162,14 @@ func TestJobPersistence_MarshalUnmarshalJSON(t *testing.T) { t.Run(tc.name, func(t *testing.T) { // MarshalJSON testen data, err := json.Marshal(tc.job) + //t.Log(string(data)) assert.NoError(t, err) assert.JSONEq(t, tc.expected, string(data)) var job JobPersistence err = json.Unmarshal(data, &job) + assert.NoError(t, err) assert.Equal(t, tc.job.Timeout, job.Timeout) assert.Equal(t, tc.job.RetryDelay, job.RetryDelay)