From a8e751189514d89eece9a6b4901cc7491bd354b9 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 3 Sep 2020 17:36:12 +0200 Subject: [PATCH 01/13] Remove one ping message --- src/neo/Ledger/Blockchain.cs | 2 -- src/neo/Network/P2P/TaskManager.cs | 6 +++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index f186d9363f..68042fc29a 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -336,8 +336,6 @@ private VerifyResult OnNewBlock(Block block) return VerifyResult.Invalid; block_cache.TryAdd(block.Hash, block); block_cache_unverified.Remove(block.Index); - // We can store the new block in block_cache and tell the new height to other nodes before Persist(). - system.LocalNode.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Singleton.Height + 1))); Persist(block); SaveHeaderHashList(); if (block_cache_unverified.TryGetValue(Height + 1, out LinkedList unverifiedBlocks)) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index e4e526e63d..b4e9dd8ed8 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -74,7 +74,11 @@ private bool AssignSyncTask(uint index, TaskSession filterSession = null) private void OnBlock(Block block) { var session = sessions.Values.FirstOrDefault(p => p.IndexTasks.ContainsKey(block.Index)); - if (session is null) return; + if (session is null) + { + RequestTasks(); + return; + } session.IndexTasks.Remove(block.Index); receivedBlockIndex.TryAdd(block.Index, session); RequestTasks(); From 54a898597183626ddf937fa0bcb6ee014b6034ca Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 3 Sep 2020 17:38:48 +0200 Subject: [PATCH 02/13] Optimize --- src/neo/Network/P2P/TaskManager.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index b4e9dd8ed8..032cbda2fe 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -74,13 +74,11 @@ private bool AssignSyncTask(uint index, TaskSession filterSession = null) private void OnBlock(Block block) { var session = sessions.Values.FirstOrDefault(p => p.IndexTasks.ContainsKey(block.Index)); - if (session is null) + if (session != null) { - RequestTasks(); - return; + session.IndexTasks.Remove(block.Index); + receivedBlockIndex.TryAdd(block.Index, session); } - session.IndexTasks.Remove(block.Index); - receivedBlockIndex.TryAdd(block.Index, session); RequestTasks(); } From 8d87a3b0f2c1c5d2f76d7a712076af09f91278fc Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 3 Sep 2020 17:41:08 +0200 Subject: [PATCH 03/13] Optimize --- src/neo/Network/P2P/TaskManager.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 032cbda2fe..5c06d6aee5 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -74,11 +74,13 @@ private bool AssignSyncTask(uint index, TaskSession filterSession = null) private void OnBlock(Block block) { var session = sessions.Values.FirstOrDefault(p => p.IndexTasks.ContainsKey(block.Index)); - if (session != null) + if (session is null) { - session.IndexTasks.Remove(block.Index); - receivedBlockIndex.TryAdd(block.Index, session); + SendPingMessage(); + return; } + session.IndexTasks.Remove(block.Index); + receivedBlockIndex.TryAdd(block.Index, session); RequestTasks(); } From 3d30a4c0245bd3f7442f3d7cc0c3982c40ea9961 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 12 Sep 2020 13:18:56 +0200 Subject: [PATCH 04/13] Cache last ping height --- src/neo/Ledger/Blockchain.cs | 2 ++ src/neo/Network/P2P/LocalNode.cs | 3 +++ src/neo/Network/P2P/RemoteNode.cs | 8 ++++++++ src/neo/Network/P2P/TaskManager.cs | 8 ++------ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 6c56fdce65..52883850aa 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -357,6 +357,8 @@ private VerifyResult OnNewBlock(Block block) Self.Tell(unverifiedBlock, ActorRefs.NoSender); block_cache_unverified.Remove(Height + 1); } + // We can store the new block in block_cache and tell the new height to other nodes after Persist(). + system.LocalNode.Tell(PingPayload.Create(Singleton.Height)); } return VerifyResult.Succeed; } diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index c8bc937001..75c34a8ec8 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -190,6 +190,9 @@ protected override void OnReceive(object message) case Message msg: BroadcastMessage(msg); break; + case PingPayload ping: + foreach (var connection in RemoteNodes.Keys) connection.Tell(ping); + break; case RelayDirectly relay: OnRelayDirectly(relay.Inventory); break; diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index b1457a8522..40d88f2c27 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -29,6 +29,7 @@ internal class Relay { public IInventory Inventory; } public int ListenerTcpPort { get; private set; } = 0; public VersionPayload Version { get; private set; } public uint LastBlockIndex { get; private set; } = 0; + public uint LastHeightSent { get; private set; } = 0; public bool IsFullNode { get; private set; } = false; public RemoteNode(NeoSystem system, object connection, IPEndPoint remote, IPEndPoint local) @@ -126,6 +127,13 @@ protected override void OnReceive(object message) case Message msg: EnqueueMessage(msg); break; + case PingPayload ping: + if (LastBlockIndex < ping.LastBlockIndex) + { + LastBlockIndex = ping.LastBlockIndex; + EnqueueMessage(Message.Create(MessageCommand.Ping, ping)); + } + break; case IInventory inventory: OnSend(inventory); break; diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 5c06d6aee5..6456c0b319 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -74,11 +74,7 @@ private bool AssignSyncTask(uint index, TaskSession filterSession = null) private void OnBlock(Block block) { var session = sessions.Values.FirstOrDefault(p => p.IndexTasks.ContainsKey(block.Index)); - if (session is null) - { - SendPingMessage(); - return; - } + if (session is null) return; session.IndexTasks.Remove(block.Index); receivedBlockIndex.TryAdd(block.Index, session); RequestTasks(); @@ -325,7 +321,7 @@ private void SendPingMessage() { node.Tell(Message.Create(MessageCommand.Mempool)); } - node.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); + node.Tell(PingPayload.Create(Blockchain.Singleton.Height)); session.ExpireTime = TimeProvider.Current.UtcNow.AddMilliseconds(PingCoolingOffPeriod); } } From 0e6d37127c237235d9de3cc6280815092d8e23ac Mon Sep 17 00:00:00 2001 From: Shargon Date: Sat, 12 Sep 2020 13:28:14 +0200 Subject: [PATCH 05/13] Fix --- src/neo/Network/P2P/RemoteNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 40d88f2c27..ff17bbfe4e 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -128,9 +128,9 @@ protected override void OnReceive(object message) EnqueueMessage(msg); break; case PingPayload ping: - if (LastBlockIndex < ping.LastBlockIndex) + if (LastHeightSent < ping.LastBlockIndex) { - LastBlockIndex = ping.LastBlockIndex; + LastHeightSent = ping.LastBlockIndex; EnqueueMessage(Message.Create(MessageCommand.Ping, ping)); } break; From 6307dc653684e4f7b1338e0d5b0fe7c933594a04 Mon Sep 17 00:00:00 2001 From: Shargon Date: Sun, 13 Sep 2020 11:43:29 +0200 Subject: [PATCH 06/13] Use message instead of payload --- src/neo/Ledger/Blockchain.cs | 2 +- src/neo/Network/P2P/LocalNode.cs | 3 --- src/neo/Network/P2P/RemoteNode.cs | 8 +++----- src/neo/Network/P2P/TaskManager.cs | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 52883850aa..8600414e06 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -358,7 +358,7 @@ private VerifyResult OnNewBlock(Block block) block_cache_unverified.Remove(Height + 1); } // We can store the new block in block_cache and tell the new height to other nodes after Persist(). - system.LocalNode.Tell(PingPayload.Create(Singleton.Height)); + system.LocalNode.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Singleton.Height))); } return VerifyResult.Succeed; } diff --git a/src/neo/Network/P2P/LocalNode.cs b/src/neo/Network/P2P/LocalNode.cs index 75c34a8ec8..c8bc937001 100644 --- a/src/neo/Network/P2P/LocalNode.cs +++ b/src/neo/Network/P2P/LocalNode.cs @@ -190,9 +190,6 @@ protected override void OnReceive(object message) case Message msg: BroadcastMessage(msg); break; - case PingPayload ping: - foreach (var connection in RemoteNodes.Keys) connection.Tell(ping); - break; case RelayDirectly relay: OnRelayDirectly(relay.Inventory); break; diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index ff17bbfe4e..8e05778064 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -125,14 +125,12 @@ protected override void OnReceive(object message) RefreshPendingKnownHashes(); break; case Message msg: - EnqueueMessage(msg); - break; - case PingPayload ping: - if (LastHeightSent < ping.LastBlockIndex) + if (msg.Command == MessageCommand.Ping && msg.Payload is PingPayload ping) { + if (LastHeightSent > ping.LastBlockIndex) return; LastHeightSent = ping.LastBlockIndex; - EnqueueMessage(Message.Create(MessageCommand.Ping, ping)); } + EnqueueMessage(msg); break; case IInventory inventory: OnSend(inventory); diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 6456c0b319..e4e526e63d 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -321,7 +321,7 @@ private void SendPingMessage() { node.Tell(Message.Create(MessageCommand.Mempool)); } - node.Tell(PingPayload.Create(Blockchain.Singleton.Height)); + node.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); session.ExpireTime = TimeProvider.Current.UtcNow.AddMilliseconds(PingCoolingOffPeriod); } } From 503f3cfb09bc7cec769e1f06fe333012d5bf424d Mon Sep 17 00:00:00 2001 From: Shargon Date: Sun, 13 Sep 2020 11:44:08 +0200 Subject: [PATCH 07/13] Or equal --- src/neo/Network/P2P/RemoteNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 8e05778064..05d8a7a168 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -127,7 +127,7 @@ protected override void OnReceive(object message) case Message msg: if (msg.Command == MessageCommand.Ping && msg.Payload is PingPayload ping) { - if (LastHeightSent > ping.LastBlockIndex) return; + if (LastHeightSent >= ping.LastBlockIndex) return; LastHeightSent = ping.LastBlockIndex; } EnqueueMessage(msg); From 09f5699c8a3f5482b3e7f3e3b5dfc291c3958dd6 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 15 Sep 2020 22:39:21 +0800 Subject: [PATCH 08/13] Update RemoteNode.cs --- src/neo/Network/P2P/RemoteNode.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 05d8a7a168..36af24a0db 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -125,10 +125,11 @@ protected override void OnReceive(object message) RefreshPendingKnownHashes(); break; case Message msg: - if (msg.Command == MessageCommand.Ping && msg.Payload is PingPayload ping) + if (msg.Command == MessageCommand.Ping) { - if (LastHeightSent >= ping.LastBlockIndex) return; - LastHeightSent = ping.LastBlockIndex; + PingPayload payload = (PingPayload)msg.Payload; + if (LastHeightSent >= payload.LastBlockIndex) break; + LastHeightSent = payload.LastBlockIndex; } EnqueueMessage(msg); break; From 35ffa68f34c765945631ac39fda0bd3a91c117be Mon Sep 17 00:00:00 2001 From: Shargon Date: Fri, 18 Sep 2020 11:29:55 +0200 Subject: [PATCH 09/13] Qiao-Jin feedback --- src/neo/Network/P2P/TaskManager.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index e4e526e63d..9f7091d93a 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -77,7 +77,7 @@ private void OnBlock(Block block) if (session is null) return; session.IndexTasks.Remove(block.Index); receivedBlockIndex.TryAdd(block.Index, session); - RequestTasks(); + RequestTasks(false); } private void OnInvalidBlock(Block invalidBlock) @@ -167,7 +167,7 @@ private void OnRegister(VersionPayload version) if (session.IsFullNode) session.InvTasks.TryAdd(MemPoolTaskHash, TimeProvider.Current.UtcNow); sessions.TryAdd(Sender, session); - RequestTasks(); + RequestTasks(true); } private void OnUpdate(Update update) @@ -176,7 +176,7 @@ private void OnUpdate(Update update) return; session.LastBlockIndex = update.LastBlockIndex; session.ExpireTime = TimeProvider.Current.UtcNow.AddMilliseconds(PingCoolingOffPeriod); - if (update.RequestTasks) RequestTasks(); + if (update.RequestTasks) RequestTasks(true); } private void OnRestartTasks(InvPayload payload) @@ -258,7 +258,7 @@ private void OnTimer() } } } - RequestTasks(); + RequestTasks(true); } protected override void PostStop() @@ -272,11 +272,11 @@ public static Props Props(NeoSystem system) return Akka.Actor.Props.Create(() => new TaskManager(system)).WithMailbox("task-manager-mailbox"); } - private void RequestTasks() + private void RequestTasks(bool sendPing) { if (sessions.Count() == 0) return; - SendPingMessage(); + if (sendPing) SendPingMessage(); while (failedSyncTasks.Count() > 0) { From 4bac9ef6f827e67ecd4436f10374f732b021ed19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Naz=C3=A1rio=20Coelho?= Date: Mon, 21 Sep 2020 08:36:45 -0300 Subject: [PATCH 10/13] Remove duplicate Sessions.Count check --- src/neo/Network/P2P/TaskManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index e20c17c6a0..4f4397aedb 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -300,8 +300,6 @@ private void RequestTasks(bool sendPing) private void SendPingMessage() { - if (sessions.Count == 0) return; - TrimmedBlock block; using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) { From 3319328d20a91480289b98971373c9a132130d4b Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 22 Sep 2020 00:10:18 +0200 Subject: [PATCH 11/13] Or pong --- src/neo/Network/P2P/RemoteNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 36af24a0db..e492e2cf05 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -125,7 +125,7 @@ protected override void OnReceive(object message) RefreshPendingKnownHashes(); break; case Message msg: - if (msg.Command == MessageCommand.Ping) + if (msg.Command == MessageCommand.Ping || msg.Command == MessageCommand.Pong) { PingPayload payload = (PingPayload)msg.Payload; if (LastHeightSent >= payload.LastBlockIndex) break; From d8a488b4676e6f54010e08a8555e28096f944f72 Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 22 Sep 2020 00:14:52 +0200 Subject: [PATCH 12/13] Avoid ping but no pongs, and Pong set the LastHeightSent --- src/neo/Network/P2P/RemoteNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index e492e2cf05..45707257d1 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -128,7 +128,7 @@ protected override void OnReceive(object message) if (msg.Command == MessageCommand.Ping || msg.Command == MessageCommand.Pong) { PingPayload payload = (PingPayload)msg.Payload; - if (LastHeightSent >= payload.LastBlockIndex) break; + if (msg.Command == MessageCommand.Ping && LastHeightSent >= payload.LastBlockIndex) break; LastHeightSent = payload.LastBlockIndex; } EnqueueMessage(msg); From 1e101907a1670697c28f1b291241ab55644052f1 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 22 Sep 2020 09:36:28 +0800 Subject: [PATCH 13/13] fix --- src/neo/Network/P2P/RemoteNode.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.cs b/src/neo/Network/P2P/RemoteNode.cs index 45707257d1..15bb8c342c 100644 --- a/src/neo/Network/P2P/RemoteNode.cs +++ b/src/neo/Network/P2P/RemoteNode.cs @@ -125,11 +125,12 @@ protected override void OnReceive(object message) RefreshPendingKnownHashes(); break; case Message msg: - if (msg.Command == MessageCommand.Ping || msg.Command == MessageCommand.Pong) + if (msg.Payload is PingPayload payload) { - PingPayload payload = (PingPayload)msg.Payload; - if (msg.Command == MessageCommand.Ping && LastHeightSent >= payload.LastBlockIndex) break; - LastHeightSent = payload.LastBlockIndex; + if (payload.LastBlockIndex > LastHeightSent) + LastHeightSent = payload.LastBlockIndex; + else if (msg.Command == MessageCommand.Ping) + break; } EnqueueMessage(msg); break;