fix events deadlock when chaining calls

This commit is contained in:
Łukasz Magiera 2019-10-12 01:13:07 +02:00
parent decbc3ef6c
commit 3481048431
2 changed files with 71 additions and 0 deletions

View File

@ -132,9 +132,12 @@ func (e *heightEvents) ChainAt(hnd HeightHandler, rev RevertHandler, confidence
log.Warnf("events.ChainAt: calling HandleFunc with nil tipset, not found in cache: %s", err) log.Warnf("events.ChainAt: calling HandleFunc with nil tipset, not found in cache: %s", err)
} }
e.lk.Unlock()
if err := hnd(ts, bestH); err != nil { if err := hnd(ts, bestH); err != nil {
return err return err
} }
e.lk.Lock()
bestH = e.tsc.best().Height()
} }
if bestH >= h+uint64(confidence)+e.gcConfidence { if bestH >= h+uint64(confidence)+e.gcConfidence {

View File

@ -364,6 +364,74 @@ func TestAtStartConfidence(t *testing.T) {
require.Equal(t, false, reverted) require.Equal(t, false, reverted)
} }
func TestAtChained(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(ts *types.TipSet, curH uint64) error {
return events.ChainAt(func(ts *types.TipSet, curH uint64) error {
require.Equal(t, 10, int(ts.Height()))
applied = true
return nil
}, func(ts *types.TipSet) error {
reverted = true
return nil
}, 3, 10)
}, func(ts *types.TipSet) error {
reverted = true
return nil
}, 3, 5)
require.NoError(t, err)
fcs.advance(0, 15, nil)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
}
func TestAtChainedConfidence(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
fcs.advance(0, 15, nil)
var applied bool
var reverted bool
err := events.ChainAt(func(ts *types.TipSet, curH uint64) error {
return events.ChainAt(func(ts *types.TipSet, curH uint64) error {
require.Equal(t, 10, int(ts.Height()))
applied = true
return nil
}, func(ts *types.TipSet) error {
reverted = true
return nil
}, 3, 10)
}, func(ts *types.TipSet) error {
reverted = true
return nil
}, 3, 5)
require.NoError(t, err)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
}
func TestCalled(t *testing.T) { func TestCalled(t *testing.T) {
fcs := &fakeCS{ fcs := &fakeCS{
t: t, t: t,