From be758c8fdcb9c0d1cc523c796fd5414432a39d8d Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 6 Aug 2020 13:02:52 +0200 Subject: [PATCH 1/4] PingPong expiration --- src/neo/Network/P2P/TaskManager.cs | 7 +++++-- src/neo/Network/P2P/TaskSession.cs | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 3eab30ba2e..d31e3f2165 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -301,14 +301,17 @@ private void SendPingMessage() { var node = item.Key; var session = item.Value; - if (Blockchain.Singleton.Height >= session.LastBlockIndex - && TimeProvider.Current.UtcNow.ToTimestampMS() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentBlockHash)?.Timestamp) + + if (session.ExpireTime < DateTime.UtcNow || + (Blockchain.Singleton.Height >= session.LastBlockIndex + && TimeProvider.Current.UtcNow.ToTimestampMS() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentBlockHash)?.Timestamp)) { if (session.InvTasks.Remove(MemPoolTaskHash)) { node.Tell(Message.Create(MessageCommand.Mempool)); } node.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); + session.ExpireTime = DateTime.UtcNow.AddSeconds(PingCoolingOffPeriod); } } } diff --git a/src/neo/Network/P2P/TaskSession.cs b/src/neo/Network/P2P/TaskSession.cs index 859f282d35..5dae3afdc8 100644 --- a/src/neo/Network/P2P/TaskSession.cs +++ b/src/neo/Network/P2P/TaskSession.cs @@ -15,6 +15,7 @@ internal class TaskSession public uint LastBlockIndex { get; set; } public uint TimeoutTimes = 0; public uint InvalidBlockCount = 0; + public DateTime ExpireTime = DateTime.MinValue; public TaskSession(VersionPayload version) { From 46dc099ce3d7617702d6954728cbbfe6bca350d9 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 6 Aug 2020 13:07:40 +0200 Subject: [PATCH 2/4] ms --- src/neo/Network/P2P/TaskManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index d31e3f2165..729c526e13 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -311,7 +311,7 @@ private void SendPingMessage() node.Tell(Message.Create(MessageCommand.Mempool)); } node.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); - session.ExpireTime = DateTime.UtcNow.AddSeconds(PingCoolingOffPeriod); + session.ExpireTime = DateTime.UtcNow.AddMilliseconds(PingCoolingOffPeriod); } } } From f51365c163c7c5eb331b38685abfb7a1891c6fe4 Mon Sep 17 00:00:00 2001 From: Shargon Date: Thu, 6 Aug 2020 13:09:26 +0200 Subject: [PATCH 3/4] Change to TimeProvider.Current.UtcNow --- src/neo/Network/P2P/TaskManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index 729c526e13..aa4ef5c1d8 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -302,7 +302,7 @@ private void SendPingMessage() var node = item.Key; var session = item.Value; - if (session.ExpireTime < DateTime.UtcNow || + if (session.ExpireTime < TimeProvider.Current.UtcNow || (Blockchain.Singleton.Height >= session.LastBlockIndex && TimeProvider.Current.UtcNow.ToTimestampMS() - PingCoolingOffPeriod >= Blockchain.Singleton.GetBlock(Blockchain.Singleton.CurrentBlockHash)?.Timestamp)) { @@ -311,7 +311,7 @@ private void SendPingMessage() node.Tell(Message.Create(MessageCommand.Mempool)); } node.Tell(Message.Create(MessageCommand.Ping, PingPayload.Create(Blockchain.Singleton.Height))); - session.ExpireTime = DateTime.UtcNow.AddMilliseconds(PingCoolingOffPeriod); + session.ExpireTime = TimeProvider.Current.UtcNow.AddMilliseconds(PingCoolingOffPeriod); } } } From 23adce9e57a1df2cd37860f18bd704079fda8988 Mon Sep 17 00:00:00 2001 From: Shargon Date: Tue, 11 Aug 2020 11:27:50 +0200 Subject: [PATCH 4/4] Optimize --- src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs | 13 +++++++------ src/neo/Network/P2P/TaskManager.cs | 11 ++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs index 9e73809cc1..530b777601 100644 --- a/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs +++ b/src/neo/Network/P2P/RemoteNode.ProtocolHandler.cs @@ -292,6 +292,7 @@ private void OnInventoryReceived(IInventory inventory) system.Blockchain.Tell(inventory, ActorRefs.NoSender); pendingKnownHashes.Remove(inventory.Hash); knownHashes.Add(inventory.Hash); + if (inventory is Block b) UpdateLastBlockIndex(b.Index, false); } private void OnInvMessageReceived(InvPayload payload) @@ -323,13 +324,13 @@ private void OnMemPoolMessageReceived() private void OnPingMessageReceived(PingPayload payload) { - UpdateLastBlockIndex(payload); + UpdateLastBlockIndex(payload.LastBlockIndex, true); EnqueueMessage(Message.Create(MessageCommand.Pong, PingPayload.Create(Blockchain.Singleton.Height, payload.Nonce))); } private void OnPongMessageReceived(PingPayload payload) { - UpdateLastBlockIndex(payload); + UpdateLastBlockIndex(payload.LastBlockIndex, true); } private void OnVerackMessageReceived() @@ -375,12 +376,12 @@ private void RefreshPendingKnownHashes() } } - private void UpdateLastBlockIndex(PingPayload payload) + private void UpdateLastBlockIndex(uint lastBlockIndex, bool requestTasks) { - if (payload.LastBlockIndex > LastBlockIndex) + if (lastBlockIndex > LastBlockIndex) { - LastBlockIndex = payload.LastBlockIndex; - system.TaskManager.Tell(new TaskManager.Update { LastBlockIndex = LastBlockIndex }); + LastBlockIndex = lastBlockIndex; + system.TaskManager.Tell(new TaskManager.Update { LastBlockIndex = LastBlockIndex, RequestTasks = requestTasks }); } } } diff --git a/src/neo/Network/P2P/TaskManager.cs b/src/neo/Network/P2P/TaskManager.cs index f4428c1785..5bea005a36 100644 --- a/src/neo/Network/P2P/TaskManager.cs +++ b/src/neo/Network/P2P/TaskManager.cs @@ -15,7 +15,7 @@ namespace Neo.Network.P2P internal class TaskManager : UntypedActor { public class Register { public VersionPayload Version; } - public class Update { public uint LastBlockIndex; } + public class Update { public uint LastBlockIndex; public bool RequestTasks; } public class NewTasks { public InvPayload Payload; } public class RestartTasks { public InvPayload Payload; } private class Timer { } @@ -129,7 +129,7 @@ protected override void OnReceive(object message) OnRegister(register.Version); break; case Update update: - OnUpdate(update.LastBlockIndex); + OnUpdate(update); break; case NewTasks tasks: OnNewTasks(tasks.Payload); @@ -169,12 +169,13 @@ private void OnRegister(VersionPayload version) RequestTasks(); } - private void OnUpdate(uint lastBlockIndex) + private void OnUpdate(Update update) { if (!sessions.TryGetValue(Sender, out TaskSession session)) return; - session.LastBlockIndex = lastBlockIndex; - RequestTasks(); + session.LastBlockIndex = update.LastBlockIndex; + session.ExpireTime = TimeProvider.Current.UtcNow.AddMilliseconds(PingCoolingOffPeriod); + if (update.RequestTasks) RequestTasks(); } private void OnRestartTasks(InvPayload payload)