Skip to content

Commit fd6dba5

Browse files
authored
Merge pull request #156 from mattn/fix-status-race
Fix data race in Status RPC
2 parents 6fb7c41 + 32b44bb commit fd6dba5

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

goreman_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,30 @@ web4: sleep 10
134134
}
135135
}
136136

137+
func TestGoremanStatusRace(t *testing.T) {
138+
var file = []byte(`
139+
web1: sleep 0.2
140+
`)
141+
done := make(chan struct{}, 1)
142+
go func() {
143+
startGoreman(context.TODO(), t, nil, file)
144+
done <- struct{}{}
145+
}()
146+
gm := &Goreman{}
147+
for {
148+
select {
149+
case <-done:
150+
return
151+
default:
152+
var ret string
153+
if err := gm.Status(nil, &ret); err != nil {
154+
t.Error(err)
155+
}
156+
time.Sleep(time.Millisecond)
157+
}
158+
}
159+
}
160+
137161
func TestGoremanStopProcDoesntStopOtherProcs(t *testing.T) {
138162
var file = []byte(`
139163
web1: sleep 10

rpc.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,16 @@ func (r *Goreman) Status(args []string, ret *string) (err error) {
120120
err = fmt.Errorf("%v", r)
121121
}
122122
}()
123+
mu.Lock()
124+
ps := make([]*procInfo, len(procs))
125+
copy(ps, procs)
126+
mu.Unlock()
123127
*ret = ""
124-
for _, proc := range procs {
125-
if proc.cmd != nil {
128+
for _, proc := range ps {
129+
proc.mu.Lock()
130+
running := proc.cmd != nil
131+
proc.mu.Unlock()
132+
if running {
126133
*ret += "*" + proc.name + "\n"
127134
} else {
128135
*ret += " " + proc.name + "\n"

0 commit comments

Comments
 (0)