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
This commit is contained in:
zzz
2020-12-16 09:40:39 -05:00
parent b9444cdc51
commit 4aefe4bf7a
3 changed files with 20 additions and 4 deletions

View File

@@ -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

View File

@@ -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 = "";

View File

@@ -1491,7 +1491,8 @@ public class PeerState {
synchronized(this) {
retransmitTimer = _retransmitTimer;
}
List<OutboundMessageState> rv = allocateSend2(retransmitTimer > 0 && now >= retransmitTimer, now);
boolean canSendOld = retransmitTimer > 0 && now >= retransmitTimer;
List<OutboundMessageState> 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;
}