fix(lotus-sim): correctly handle cancellation in walk
1. Select order is not guaranteed, always check if the context has been canceled explicitly. 2. Never close a work channel unless we're actually done. This can yield out-of-order results due to buffering.
This commit is contained in:
parent
ec3f969e9a
commit
f9d2a23132
@ -314,7 +314,11 @@ func (sim *Simulation) Walk(
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
i := 0
|
i := 0
|
||||||
for ctx.Err() == nil && ts.Height() > minEpoch {
|
for ts.Height() > minEpoch {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case workQs[i] <- &work{ts, stCid, recCid}:
|
case workQs[i] <- &work{ts, stCid, recCid}:
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
@ -340,7 +344,23 @@ func (sim *Simulation) Walk(
|
|||||||
workQ := workQs[i]
|
workQ := workQs[i]
|
||||||
resultQ := resultQs[i]
|
resultQ := resultQs[i]
|
||||||
grp.Go(func() error {
|
grp.Go(func() error {
|
||||||
for job := range workQ {
|
for {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
var job *work
|
||||||
|
var ok bool
|
||||||
|
select {
|
||||||
|
case job, ok = <-workQ:
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
msgs, err := sim.Chainstore.MessagesForTipset(job.ts)
|
msgs, err := sim.Chainstore.MessagesForTipset(job.ts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -381,6 +401,10 @@ func (sim *Simulation) Walk(
|
|||||||
grp.Go(func() error {
|
grp.Go(func() error {
|
||||||
qs := resultQs
|
qs := resultQs
|
||||||
for len(qs) > 0 {
|
for len(qs) > 0 {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
newQs := qs[:0]
|
newQs := qs[:0]
|
||||||
for _, q := range qs {
|
for _, q := range qs {
|
||||||
select {
|
select {
|
||||||
|
Loading…
Reference in New Issue
Block a user