From 70e0c1e082a0c1b833d8a3106790f015c7c52382 Mon Sep 17 00:00:00 2001 From: Anton Nikiforov Date: Tue, 5 Dec 2023 11:16:44 +0300 Subject: [PATCH] [#841] ir: Execute `netmap.addPeerIR` only for state `online` Signed-off-by: Anton Nikiforov --- pkg/innerring/processors/netmap/handlers_test.go | 15 +++++++++++++++ pkg/innerring/processors/netmap/process_peers.go | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/innerring/processors/netmap/handlers_test.go b/pkg/innerring/processors/netmap/handlers_test.go index 164ee41d..6a66fe32 100644 --- a/pkg/innerring/processors/netmap/handlers_test.go +++ b/pkg/innerring/processors/netmap/handlers_test.go @@ -144,6 +144,21 @@ func TestAddPeer(t *testing.T) { time.Sleep(10 * time.Millisecond) } + require.Nil(t, nc.notaryInvokes, "invalid notary invokes") + + node.SetOnline() + ev = netmapEvent.AddPeer{ + NodeBytes: node.Marshal(), + Request: &payload.P2PNotaryRequest{ + MainTransaction: &transaction.Transaction{}, + }, + } + proc.handleAddPeer(ev) + + for proc.pool.Running() > 0 { + time.Sleep(10 * time.Millisecond) + } + require.EqualValues(t, []notaryInvoke{ { contract: nc.contractAddress, diff --git a/pkg/innerring/processors/netmap/process_peers.go b/pkg/innerring/processors/netmap/process_peers.go index 96b8c8e9..41e4bfb7 100644 --- a/pkg/innerring/processors/netmap/process_peers.go +++ b/pkg/innerring/processors/netmap/process_peers.go @@ -57,7 +57,12 @@ func (np *Processor) processAddPeer(ev netmapEvent.AddPeer) bool { updated := np.netmapSnapshot.touch(keyString, np.epochState.EpochCounter(), nodeInfoBinary) - if updated { + // `processAddPeer` reacts on `AddPeer` notification, `processNewEpoch` - on `NewEpoch`. + // This two notification produces in order - `NewEpoch` -> `AddPeer`. + // But there is no guarantee that code will be executed in the same order. + // That is why we need to perform `addPeerIR` only in case when node is online, + // because in scope of this method, contract set state `ONLINE` for the node. + if updated && nodeInfo.IsOnline() { np.log.Info(logs.NetmapApprovingNetworkMapCandidate, zap.String("key", keyString))