Skip to content

Commit 94b446c

Browse files
committed
fix: remember last finished time and result
1 parent d3b5a78 commit 94b446c

File tree

3 files changed

+39
-12
lines changed

3 files changed

+39
-12
lines changed

pkg/manager/manager.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ package manager
44
import (
55
"encoding/json"
66
"fmt"
7+
"github.com/davecgh/go-spew/spew"
78
"io"
89
"os"
910
"time"
1011

1112
"github.com/sirupsen/logrus"
1213

13-
"github.com/davecgh/go-spew/spew"
1414
"github.com/sjtug/lug/pkg/config"
1515
"github.com/sjtug/lug/pkg/worker"
1616
)
@@ -51,7 +51,9 @@ type Status struct {
5151
}
5252

5353
type WorkerCheckPoint struct {
54-
LastInvokeTime time.Time `json:"last_invoke_time"`
54+
LastInvokeTime time.Time `json:"last_invoke_time"`
55+
LastFinished *time.Time `json:"last_finished,omitempty"`
56+
Result bool `json:"result,omitempty"`
5557
}
5658

5759
type CheckPoint struct {
@@ -81,6 +83,21 @@ func fromCheckpoint(checkpointFile string) (*CheckPoint, error) {
8183
return &checkpoint, nil
8284
}
8385

86+
func workerFromCheckpoint(repoConfig config.RepoConfig, checkpoint *CheckPoint, name string, lastInvokeTime time.Time) (worker.Worker, error) {
87+
if checkpoint == nil {
88+
return worker.NewWorker(repoConfig, lastInvokeTime, true)
89+
}
90+
info, ok := checkpoint.WorkerInfo[name]
91+
if !ok {
92+
return worker.NewWorker(repoConfig, lastInvokeTime, true)
93+
}
94+
95+
if info.LastFinished == nil {
96+
return worker.NewWorker(repoConfig, lastInvokeTime, info.Result)
97+
}
98+
return worker.NewWorker(repoConfig, *info.LastFinished, info.Result)
99+
}
100+
84101
// NewManager creates a new manager with attached workers from config
85102
func NewManager(config *config.Config) (*Manager, error) {
86103
logger := logrus.WithField("manager", "")
@@ -110,7 +127,7 @@ func NewManager(config *config.Config) (*Manager, error) {
110127
if _, ok := newManager.workersLastInvokeTime[name]; !ok {
111128
newManager.workersLastInvokeTime[name] = time.Now().AddDate(-1, 0, 0)
112129
}
113-
w, err := worker.NewWorker(repoConfig, newManager.workersLastInvokeTime[name])
130+
w, err := workerFromCheckpoint(repoConfig, checkpoint, name, newManager.workersLastInvokeTime[name])
114131
if err != nil {
115132
return nil, err
116133
}
@@ -121,11 +138,21 @@ func NewManager(config *config.Config) (*Manager, error) {
121138

122139
func (m *Manager) checkpoint() error {
123140
ckptObj := &CheckPoint{WorkerInfo: make(map[string]WorkerCheckPoint)}
124-
for k, t := range m.workersLastInvokeTime {
125-
ckptObj.WorkerInfo[k] = WorkerCheckPoint{
126-
LastInvokeTime: t,
141+
for _, w := range m.workers {
142+
name := w.GetConfig()["name"].(string)
143+
status := w.GetStatus()
144+
lastInvokeTime, ok := m.workersLastInvokeTime[name]
145+
if !ok {
146+
lastInvokeTime = time.Now().AddDate(-1, 0, 0)
147+
}
148+
149+
ckptObj.WorkerInfo[name] = WorkerCheckPoint{
150+
LastInvokeTime: lastInvokeTime,
151+
Result: status.Result,
152+
LastFinished: &status.LastFinished,
127153
}
128154
}
155+
129156
file, err := json.MarshalIndent(ckptObj, "", " ")
130157
if err != nil {
131158
return err

pkg/worker/worker.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type Status struct {
3434
}
3535

3636
// NewWorker generates a worker by config and log.
37-
func NewWorker(cfg config.RepoConfig, lastFinished time.Time) (Worker, error) {
37+
func NewWorker(cfg config.RepoConfig, lastFinished time.Time, Result bool) (Worker, error) {
3838
if syncType, ok := cfg["type"]; ok {
3939
switch syncType {
4040
case "rsync":
@@ -44,7 +44,7 @@ func NewWorker(cfg config.RepoConfig, lastFinished time.Time) (Worker, error) {
4444
w, err := NewExecutorInvokeWorker(
4545
newShellScriptExecutor(cfg),
4646
Status{
47-
Result: true,
47+
Result: Result,
4848
LastFinished: lastFinished,
4949
Idle: true,
5050
Stdout: make([]string, 0),

pkg/worker/worker_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ func TestNewExternalWorker(t *testing.T) {
2424
"blahblah": "foobar",
2525
"type": "external",
2626
}
27-
_, err := NewWorker(c, time.Now())
27+
_, err := NewWorker(c, time.Now(), true)
2828
// worker with no name is not allowed
2929
asrt.NotNil(err)
3030

3131
c["name"] = "test_external"
32-
w, err := NewWorker(c, time.Now())
32+
w, err := NewWorker(c, time.Now(), true)
3333
// config with name and dummy kv pairs should be allowed
3434
asrt.Nil(err)
3535

@@ -48,7 +48,7 @@ func TestNewShellScriptWorker(t *testing.T) {
4848

4949
asrt := assert.New(t)
5050

51-
w, _ := NewWorker(c, time.Now())
51+
w, _ := NewWorker(c, time.Now(), true)
5252

5353
asrt.Equal(true, w.GetStatus().Result)
5454
asrt.Equal("shell_script", w.GetConfig()["type"])
@@ -187,7 +187,7 @@ func TestShellScriptWorkerArgParse(t *testing.T) {
187187
"name": "shell",
188188
"script": "wc -l /proc/stat",
189189
}
190-
w, err := NewWorker(c, time.Now())
190+
w, err := NewWorker(c, time.Now(), true)
191191

192192
asrt := assert.New(t)
193193
asrt.Nil(err)

0 commit comments

Comments
 (0)