From 2bc285a8a0c13a92ac2cf707e7827ba1a5188dee Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 15 Feb 2026 08:19:37 -0500 Subject: [PATCH] Console: Improve efficiency of transport+cost search --- .../i2p/router/web/helpers/NetDbRenderer.java | 67 ++++++++++++++----- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java index e364ff62f..bf01b45be 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java @@ -252,8 +252,9 @@ class NetDbRenderer { filterSigType(routers, type); if (etype != null && !routers.isEmpty()) filterEncType(routers, etype); + // if cost is set also, we filter for that here if (tr != null && !routers.isEmpty()) - filterTransport(routers, tr); + filterTransport(routers, tr, cost); if (family != null && !routers.isEmpty()) filterFamily(routers, family); if (ip != null && !routers.isEmpty()) { @@ -270,7 +271,8 @@ class NetDbRenderer { filterIP(routers, ipv6, altIPv6); if (ssucaps != null && !routers.isEmpty()) filterSSUCaps(routers, ssucaps); - if (cost != 0 && !routers.isEmpty()) + // if transport was set also, we filtered for that above + if (cost != 0 && tr == null && !routers.isEmpty()) filterCost(routers, cost); if (itag != null && !routers.isEmpty()) filterITag(routers, itag); @@ -490,9 +492,10 @@ class NetDbRenderer { /** * Remove all non-matching from routers + * @param cost if nonzero, filter for that also * @since 0.9.64 split out from above */ - private static void filterTransport(Set routers, String tr) { + private static void filterTransport(Set routers, String tr, int cost) { String transport; int mode; if (tr.equals("NTCP_1")) { @@ -511,26 +514,56 @@ class NetDbRenderer { transport = tr; mode = 4; } + + loop: for (Iterator iter = routers.iterator(); iter.hasNext(); ) { RouterInfo ri = iter.next(); - RouterAddress ra = ri.getTargetAddress(transport); - if (ra != null) { - switch (mode) { - case 0: - case 2: - if (ra.getOption("v") == null) + if (cost == 0) { + // just look for any matching + RouterAddress ra = ri.getTargetAddress(transport); + if (ra != null) { + switch (mode) { + case 0: + case 2: + if (ra.getOption("v") == null) + continue; + break; + + case 1: + case 3: + if (ra.getOption("v") != null) + continue; + break; + + case 4: continue; - break; - case 1: - case 3: - if (ra.getOption("v") != null) - continue; - break; + } + } + } else { + // go through all matching and compare cost + List ras = ri.getTargetAddresses(transport); + if (!ras.isEmpty()) { + for (RouterAddress ra : ras) { + switch (mode) { + case 0: + case 2: + if (ra.getOption("v") == null && cost == ra.getCost()) + continue loop; + break; - case 4: - continue; + case 1: + case 3: + if (ra.getOption("v") != null && cost == ra.getCost()) + continue loop; + break; + case 4: + if (cost == ra.getCost()) + continue loop; + break; + } + } } } iter.remove();