From 6cc360e0f7f35aa9de30974b5e86e50feca9a5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 7 Nov 2019 10:02:29 +0100 Subject: [PATCH] events: Execute Called handlers in the correct tipset --- chain/events/events_called.go | 14 +++++++---- chain/events/events_test.go | 46 +++++++++++++++++------------------ 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/chain/events/events_called.go b/chain/events/events_called.go index c51d9bef6..94368214e 100644 --- a/chain/events/events_called.go +++ b/chain/events/events_called.go @@ -24,7 +24,7 @@ type triggerH = uint64 // `ts` is the tipset, in which the `msg` is included. // `curH`-`ts.Height` = `confidence` -type CalledHandler func(msg *types.Message, ts *types.TipSet, curH uint64) (bool, error) +type CalledHandler func(msg *types.Message, ts *types.TipSet, curH uint64) (more bool, err error) // CheckFunc is used for atomicity guarantees. If the condition the callbacks // wait for has already happened in tipset `ts` @@ -147,7 +147,11 @@ func (e *calledEvents) checkNewCalls(ts *types.TipSet) { func (e *calledEvents) queueForConfidence(triggerId uint64, msg *types.Message, ts *types.TipSet) { trigger := e.triggers[triggerId] - triggerH := ts.Height() + uint64(trigger.confidence) + + // messages are not applied in the tipset they are included in + appliedH := ts.Height() + 1 + + triggerH := appliedH + uint64(trigger.confidence) byOrigH, ok := e.confQueue[triggerH] if !ok { @@ -155,13 +159,13 @@ func (e *calledEvents) queueForConfidence(triggerId uint64, msg *types.Message, e.confQueue[triggerH] = byOrigH } - byOrigH[ts.Height()] = append(byOrigH[ts.Height()], &queuedEvent{ + byOrigH[appliedH] = append(byOrigH[appliedH], &queuedEvent{ trigger: triggerId, - h: ts.Height(), + h: appliedH, msg: msg, }) - e.revertQueue[ts.Height()] = append(e.revertQueue[ts.Height()], triggerH) // todo: dedupe? + e.revertQueue[appliedH] = append(e.revertQueue[appliedH], triggerH) } func (e *calledEvents) applyWithConfidence(ts *types.TipSet) { diff --git a/chain/events/events_test.go b/chain/events/events_test.go index d738edf86..27a3edf03 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -526,28 +526,28 @@ func TestCalled(t *testing.T) { // create additional block so we are above confidence threshold - fcs.advance(0, 1, nil) // H=9 (confidence=3, apply) + fcs.advance(0, 2, nil) // H=10 (confidence=3, apply) require.Equal(t, true, applied) require.Equal(t, false, reverted) applied = false - require.Equal(t, uint64(6), appliedTs.Height()) - require.Equal(t, "bafkqaajq", appliedTs.Blocks()[0].Messages.String()) - require.Equal(t, uint64(9), appliedH) + require.Equal(t, uint64(7), appliedTs.Height()) + require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String()) + require.Equal(t, uint64(10), appliedH) require.Equal(t, t0123, appliedMsg.To) require.Equal(t, uint64(1), appliedMsg.Nonce) require.Equal(t, uint64(5), appliedMsg.Method) // revert some blocks, keep the message - fcs.advance(3, 1, nil) // H=7 (confidence=1) + fcs.advance(3, 1, nil) // H=8 (confidence=1) require.Equal(t, false, applied) require.Equal(t, false, reverted) // revert the message - fcs.advance(2, 1, nil) // H=6, we reverted ts with the msg + fcs.advance(2, 1, nil) // H=7, we reverted ts with the msg require.Equal(t, false, applied) require.Equal(t, true, reverted) @@ -561,7 +561,7 @@ func TestCalled(t *testing.T) { }, }) - fcs.advance(0, 4, map[int]cid.Cid{ // msg at H=7; H=10 (confidence=3) + fcs.advance(0, 5, map[int]cid.Cid{ // (confidence=3) 0: n2msg, }) @@ -569,16 +569,16 @@ func TestCalled(t *testing.T) { require.Equal(t, false, reverted) applied = false - require.Equal(t, uint64(7), appliedTs.Height()) - require.Equal(t, "bafkqaajr", appliedTs.Blocks()[0].Messages.String()) - require.Equal(t, uint64(10), appliedH) + require.Equal(t, uint64(9), appliedTs.Height()) + require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String()) + require.Equal(t, uint64(12), appliedH) require.Equal(t, t0123, appliedMsg.To) require.Equal(t, uint64(2), appliedMsg.Nonce) require.Equal(t, uint64(5), appliedMsg.Method) // revert and apply at different height - fcs.advance(4, 5, map[int]cid.Cid{ // msg at H=8; H=11 (confidence=3) + fcs.advance(4, 6, map[int]cid.Cid{ // (confidence=3) 1: n2msg, }) @@ -590,16 +590,16 @@ func TestCalled(t *testing.T) { reverted = false applied = false - require.Equal(t, uint64(8), appliedTs.Height()) - require.Equal(t, "bafkqaajr", appliedTs.Blocks()[0].Messages.String()) - require.Equal(t, uint64(11), appliedH) + require.Equal(t, uint64(11), appliedTs.Height()) + require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String()) + require.Equal(t, uint64(14), appliedH) require.Equal(t, t0123, appliedMsg.To) require.Equal(t, uint64(2), appliedMsg.Nonce) require.Equal(t, uint64(5), appliedMsg.Method) // call method again - fcs.advance(0, 4, map[int]cid.Cid{ // msg at H=12; H=15 + fcs.advance(0, 5, map[int]cid.Cid{ 0: n2msg, }) @@ -608,7 +608,7 @@ func TestCalled(t *testing.T) { applied = false // send and revert below confidence, then cross confidence - fcs.advance(0, 1, map[int]cid.Cid{ // msg at H=16; H=16 + fcs.advance(0, 2, map[int]cid.Cid{ 0: fcs.fakeMsgs(fakeMsg{ bmsgs: []*types.Message{ {To: t0123, From: t0123, Method: 5, Nonce: 3}, @@ -623,7 +623,7 @@ func TestCalled(t *testing.T) { // test timeout (it's set to 20 in the call to `events.Called` above) - fcs.advance(0, 6, nil) // H=25 + fcs.advance(0, 6, nil) require.Equal(t, false, applied) // not calling timeout as we received messages require.Equal(t, false, reverted) @@ -631,7 +631,7 @@ func TestCalled(t *testing.T) { // test unregistering with more more = false - fcs.advance(0, 4, map[int]cid.Cid{ // msg at H=26; H=29 + fcs.advance(0, 5, map[int]cid.Cid{ 0: fcs.fakeMsgs(fakeMsg{ bmsgs: []*types.Message{ {To: t0123, From: t0123, Method: 5, Nonce: 4}, // this signals we don't want more @@ -643,7 +643,7 @@ func TestCalled(t *testing.T) { require.Equal(t, false, reverted) applied = false - fcs.advance(0, 4, map[int]cid.Cid{ // msg at H=26; H=29 + fcs.advance(0, 5, map[int]cid.Cid{ 0: fcs.fakeMsgs(fakeMsg{ bmsgs: []*types.Message{ {To: t0123, From: t0123, Method: 5, Nonce: 5}, @@ -765,10 +765,10 @@ func TestCalledOrder(t *testing.T) { switch at { case 0: require.Equal(t, uint64(1), msg.Nonce) - require.Equal(t, uint64(3), ts.Height()) + require.Equal(t, uint64(4), ts.Height()) case 1: require.Equal(t, uint64(2), msg.Nonce) - require.Equal(t, uint64(4), ts.Height()) + require.Equal(t, uint64(5), ts.Height()) default: t.Fatal("apply should only get called twice, at: ", at) } @@ -777,9 +777,9 @@ func TestCalledOrder(t *testing.T) { }, func(_ context.Context, ts *types.TipSet) error { switch at { case 2: - require.Equal(t, uint64(4), ts.Height()) + require.Equal(t, uint64(5), ts.Height()) case 3: - require.Equal(t, uint64(3), ts.Height()) + require.Equal(t, uint64(4), ts.Height()) default: t.Fatal("revert should only get called twice, at: ", at) }