From 0ee8d7da0f55b498ae9937689b8c64ce76d0925b Mon Sep 17 00:00:00 2001 From: catbref Date: Thu, 31 Dec 2020 11:26:13 +0000 Subject: [PATCH] Improve removal of expired PRESENCE txns in websocket cache --- .../api/websocket/PresenceWebSocket.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java index 5fd191f0..26d131c4 100644 --- a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java @@ -32,6 +32,7 @@ import org.qortal.repository.RepositoryManager; import org.qortal.transaction.PresenceTransaction.PresenceType; import org.qortal.transaction.Transaction.TransactionType; import org.qortal.utils.Base58; +import org.qortal.utils.NTP; @WebSocket @SuppressWarnings("serial") @@ -98,7 +99,14 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { @Override public void listen(Event event) { - if (!(event instanceof Controller.NewTransactionEvent)) + // We use NewBlockEvent as a proxy for 1-minute timer + if (!(event instanceof Controller.NewTransactionEvent) && !(event instanceof Controller.NewBlockEvent)) + return; + + removeOldEntries(); + + if (event instanceof Controller.NewBlockEvent) + // We only wanted a chance to cull old entries return; TransactionData transactionData = ((Controller.NewTransactionEvent) event).getTransactionData(); @@ -224,4 +232,13 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { return typedPubkeyTimestamps.compute(pubKey58, (somePubKey58, currentTimestamp) -> (currentTimestamp == null || currentTimestamp < ourTimestamp) ? ourTimestamp : currentTimestamp); } + private static void removeOldEntries() { + long now = NTP.getTime(); + + currentEntries.entrySet().forEach(entry -> { + long expiryThreshold = now - entry.getKey().getLifetime(); + entry.getValue().entrySet().removeIf(pubkeyTimestamp -> pubkeyTimestamp.getValue() < expiryThreshold); + }); + } + }