Skip to content

Commit d9a4992

Browse files
committed
add overallState field to program
1 parent 82dcc93 commit d9a4992

2 files changed

Lines changed: 42 additions & 27 deletions

File tree

cmd/meeseeks/utils.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,6 @@ func formatStatisticsAsTable(data any, programName string) error {
137137
if stats.HasInterval {
138138
interval = stats.Interval.String()
139139
}
140-
status := "idle"
141-
//nolint:gocritic // using switch would not improve readbility
142-
if running > 0 {
143-
status = "running"
144-
} else if failed > 0 && successful == 0 {
145-
status = "failed"
146-
} else if successful > 0 {
147-
status = "completed"
148-
}
149140

150141
fmt.Fprintf(w, "%s\t%d\t%d\t%d\t%d\t%s\t%s\n",
151142
truncateString(name, 20),
@@ -154,7 +145,7 @@ func formatStatisticsAsTable(data any, programName string) error {
154145
failed,
155146
running,
156147
truncateString(interval, 10),
157-
status)
148+
stats.State)
158149
}
159150

160151
return w.Flush()

pkg/program/program.go

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ type program struct {
110110
currentRun int
111111
runResults []result
112112

113-
exitCode int
113+
exitCode int
114+
overallState ProcessState
114115

115116
stdoutLock sync.RWMutex
116117
stderrLock sync.RWMutex
@@ -283,6 +284,10 @@ func (p *program) run() error {
283284
p.runResults[currentIndex].errorBuffer.WriteString("\n")
284285
p.runResults[currentIndex].lastError = err.Error()
285286
p.resultsLock.Unlock()
287+
288+
p.stateLock.Lock()
289+
p.overallState = StateError
290+
p.stateLock.Unlock()
286291
p.signalDone()
287292
return err
288293
}
@@ -291,6 +296,10 @@ func (p *program) run() error {
291296
p.runResults[currentIndex].state = StateRunning
292297
p.resultsLock.Unlock()
293298

299+
p.stateLock.Lock()
300+
p.overallState = StateRunning
301+
p.stateLock.Unlock()
302+
294303
if p.async {
295304
go p.monitorProcess()
296305
return nil
@@ -301,15 +310,6 @@ func (p *program) run() error {
301310
}
302311

303312
func (p *program) monitorProcess() {
304-
defer func() {
305-
p.cmdLock.Lock()
306-
exitCode := p.cmd.ProcessState.ExitCode()
307-
p.cmdLock.Unlock()
308-
p.stateLock.Lock()
309-
p.exitCode = exitCode
310-
p.stateLock.Unlock()
311-
}()
312-
313313
// WaitGroup ensures readOutput goroutines finish reading all data.
314314
// This prevents race conditions where callers might see incomplete output.
315315
var wg sync.WaitGroup
@@ -368,6 +368,20 @@ func (p *program) monitorProcess() {
368368
p.runResults[currentIndex].state = StateFinished
369369
}
370370
p.resultsLock.Unlock()
371+
372+
p.cmdLock.Lock()
373+
exitCode := p.cmd.ProcessState.ExitCode()
374+
p.cmdLock.Unlock()
375+
376+
p.stateLock.Lock()
377+
p.exitCode = exitCode
378+
if err != nil {
379+
p.overallState = StateError
380+
} else {
381+
p.overallState = StateFinished
382+
}
383+
p.stateLock.Unlock()
384+
371385
p.signalDone()
372386
}
373387

@@ -492,13 +506,9 @@ func (p *program) Error() string {
492506
}
493507

494508
func (p *program) State() ProcessState {
495-
p.resultsLock.RLock()
496-
defer p.resultsLock.RUnlock()
497-
498-
if len(p.runResults) == 0 {
499-
return StateNotStarted
500-
}
501-
return p.runResults[len(p.runResults)-1].state
509+
p.stateLock.RLock()
510+
defer p.stateLock.RUnlock()
511+
return p.overallState
502512
}
503513

504514
func (p *program) Interval() time.Duration {
@@ -568,6 +578,7 @@ func (p *program) forcekill() error {
568578

569579
type Statistics struct {
570580
ProgramName string `json:"program_name"`
581+
State string `json:"state"`
571582
TotalRuns int `json:"total_runs"`
572583
Successful int `json:"successful_runs"`
573584
Failed int `json:"failed_runs"`
@@ -622,8 +633,21 @@ func (p *program) Statistics() Statistics {
622633
resultsCopy = slices.Clone(p.runResults)
623634
p.resultsLock.RUnlock()
624635

636+
var state string
637+
switch p.State() {
638+
case StateFinished:
639+
state = "finished"
640+
case StateError:
641+
state = "error"
642+
case StateRunning:
643+
state = "running"
644+
case StateNotStarted:
645+
state = "not started"
646+
}
647+
625648
stats := Statistics{
626649
ProgramName: p.name,
650+
State: state,
627651
TotalRuns: len(resultsCopy),
628652
LastSuccessfulRun: -1,
629653
Interval: p.interval,

0 commit comments

Comments
 (0)