From c456ef490590d1edc7c83af2c62100eb594fd6c5 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Tue, 3 Dec 2019 21:21:31 -0800 Subject: [PATCH 1/4] reproduce events double trigger issue in test --- chain/events/events_test.go | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 034f0ce5f..73f51b543 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -258,6 +258,44 @@ func TestAt(t *testing.T) { require.Equal(t, false, reverted) } +func TestAtDoubleTrigger(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(_ context.Context, ts *types.TipSet, curH uint64) error { + require.Equal(t, 5, int(ts.Height())) + require.Equal(t, 8, int(curH)) + applied = true + return nil + }, func(_ context.Context, ts *types.TipSet) error { + reverted = true + return nil + }, 3, 5) + require.NoError(t, err) + + fcs.advance(0, 6, nil) + require.False(t, applied) + require.False(t, reverted) + + fcs.advance(0, 1, nil) + require.True(t, applied) + require.False(t, reverted) + applied = false + + fcs.advance(2, 2, nil) + require.False(t, applied) + require.False(t, reverted) +} + func TestAtNullTrigger(t *testing.T) { fcs := &fakeCS{ t: t, From cb19ca499e9392c94811aba781c58bcf8a7d151c Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Tue, 3 Dec 2019 21:24:17 -0800 Subject: [PATCH 2/4] add extra check for apply being called iff revert happens --- chain/events/events_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 73f51b543..934f8b43e 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -294,6 +294,10 @@ func TestAtDoubleTrigger(t *testing.T) { fcs.advance(2, 2, nil) require.False(t, applied) require.False(t, reverted) + + fcs.advance(4, 4, nil) + require.True(t, applied) + require.True(t, reverted) } func TestAtNullTrigger(t *testing.T) { From 7d80cbfbdfb6b405bdcb68ed11e0a6a9f62c3f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 4 Dec 2019 13:41:22 +0100 Subject: [PATCH 3/4] events: Fix double trigger in CalledAt --- chain/events/events.go | 1 + chain/events/events_height.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/chain/events/events.go b/chain/events/events.go index 80028965b..cc51fbfae 100644 --- a/chain/events/events.go +++ b/chain/events/events.go @@ -24,6 +24,7 @@ type RevertHandler func(ctx context.Context, ts *types.TipSet) error type heightHandler struct { confidence int + called bool handle HeightHandler revert RevertHandler diff --git a/chain/events/events_height.go b/chain/events/events_height.go index e7a81d735..a407d167a 100644 --- a/chain/events/events_height.go +++ b/chain/events/events_height.go @@ -40,6 +40,7 @@ func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error { ctx, span := trace.StartSpan(ctx, "events.HeightRevert") err := e.heightTriggers[tid].revert(ctx, ts) + e.heightTriggers[tid].called = false span.End() @@ -82,6 +83,11 @@ func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error { apply := func(h uint64, ts *types.TipSet) error { for _, tid := range e.htTriggerHeights[h] { hnd := e.heightTriggers[tid] + if hnd.called { + return nil + } + hnd.called = true + triggerH := h - uint64(hnd.confidence) incTs, err := e.tsc.getNonNull(triggerH) From 631a9cd3b6aff65679e87240b41d9a0e66206050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 4 Dec 2019 13:58:22 +0100 Subject: [PATCH 4/4] events: Fix double apply in events.Called as well --- chain/events/events_called.go | 4 ++++ chain/events/events_test.go | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/chain/events/events_called.go b/chain/events/events_called.go index 00b86bfee..106251b81 100644 --- a/chain/events/events_called.go +++ b/chain/events/events_called.go @@ -183,6 +183,10 @@ func (e *calledEvents) applyWithConfidence(ts *types.TipSet) { } for _, event := range events { + if event.called { + continue + } + trigger := e.triggers[event.trigger] if trigger.disabled { continue diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 934f8b43e..7ffa5aa28 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -604,6 +604,12 @@ func TestCalled(t *testing.T) { require.Equal(t, false, reverted) applied = false + // dip below confidence + fcs.advance(2, 2, nil) // H=10 (confidence=3, apply) + + require.Equal(t, false, applied) + require.Equal(t, false, reverted) + require.Equal(t, uint64(7), appliedTs.Height()) require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String()) require.Equal(t, uint64(10), appliedH)