From 4aefe4bf7a231fdad1928ae91333aeaa194ff67e Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 16 Dec 2020 09:40:39 -0500 Subject: [PATCH] SSU: Fix OMF looping when timer isn't cancelled after last message acked Push out timer when no more bandwidth available Workarounds for now, more changes to follow --- history.txt | 7 +++++-- router/java/src/net/i2p/router/RouterVersion.java | 2 +- .../net/i2p/router/transport/udp/PeerState.java | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/history.txt b/history.txt index 0d8517cb3..6812caecc 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2020-12-16 zzz + * SSU: Fix occasional high CPU usage + 2020-12-11 zzz * Router (proposal 156): - Change router ECIES SKM to use N pattern @@ -8,10 +11,10 @@ 2020-12-06 zzz * Console, webapps: Move web resources to wars * i2psnark: - - Add support for web seeds + - Add support for web seeds (ticket #2780) - Preserve file attribute strings in metainfo * Streaming: Add Retry-After header to throttle response - * Util: Change DoH to RFC 8484 protocol + * Util: Change DoH to RFC 8484 protocol (ticket #2201) * 2020-12-01 0.9.48 released diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 0725033fa..f6e6df3a5 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 3; + public final static long BUILD = 4; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index 1fd369f79..380df52c9 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -1491,7 +1491,8 @@ public class PeerState { synchronized(this) { retransmitTimer = _retransmitTimer; } - List rv = allocateSend2(retransmitTimer > 0 && now >= retransmitTimer, now); + boolean canSendOld = retransmitTimer > 0 && now >= retransmitTimer; + List rv = allocateSend2(canSendOld, now); if (rv != null && !rv.isEmpty()) { synchronized(this) { long old = _retransmitTimer; @@ -1500,6 +1501,18 @@ public class PeerState { if (_log.shouldLog(Log.DEBUG)) _log.debug(_remotePeer + " allocated " + rv.size() + " pushing retransmitter from " + old + " to " + _retransmitTimer); } + } else if (canSendOld) { + // failsafe - push out or cancel timer to prevent looping + boolean isEmpty; + synchronized (_outboundMessages) { + isEmpty = _outboundMessages.isEmpty(); + } + synchronized(this) { + if (isEmpty) + _retransmitTimer = 0; + else + _retransmitTimer = now + 250; + } } return rv; }