Console: Limit banlist output, add page links

Fix concurrent mod exception rendering banlist caused by switch to LHM
This commit is contained in:
zzz
2026-02-26 10:07:48 -05:00
parent f976b6ac1c
commit 04780cae4c
7 changed files with 125 additions and 6 deletions
@@ -25,30 +25,63 @@ import net.i2p.router.web.Messages;
* Moved from Banlist.java
*/
class BanlistRenderer {
static final int PAGE_SIZE = 2048;
private int _pageSize = PAGE_SIZE;
private int _page;
private final RouterContext _context;
public BanlistRenderer(RouterContext context) {
_context = context;
}
/**
* @param page 0-based
* @since 0.9.69
*/
public void setPage(int page) {
_page = page;
}
/**
* @since 0.9.69
*/
public void setPageSize(int ps) {
_pageSize = ps;
}
public void renderStatusHTML(Writer out) throws IOException {
StringBuilder buf = new StringBuilder(2048);
Map<Hash, Banlist.Entry> entries = new TreeMap<Hash, Banlist.Entry>(HashComparator.getInstance());
entries.putAll(_context.banlist().getEntries());
_context.banlist().getEntries(entries);
buf.append("<h3 id=\"bannedpeers\">").append(_t("Banned Peers"));
if (entries.isEmpty()) {
int sz = entries.size();
if (sz == 0) {
buf.append("</h3><i>").append(_t("none")).append("</i>");
out.append(buf);
return;
} else {
buf.append(" (").append(entries.size()).append(")</h3>");
buf.append(" (").append(sz).append(")</h3>");
}
boolean morePages = false;
int toSkip = _pageSize * _page;
int last = Math.min(toSkip + _pageSize, sz);
if (last < sz)
morePages = true;
if (_page > 0 || morePages)
outputPageLinks(buf, _page, _pageSize, morePages);
buf.append("<ul id=\"banlist\">");
String unban = _t("unban now");
int i = 0;
for (Map.Entry<Hash, Banlist.Entry> e : entries.entrySet()) {
if (i++ < toSkip)
continue;
if (i > last)
break;
Hash key = e.getKey();
Banlist.Entry entry = e.getValue();
long expires = entry.expireOn-_context.clock().now();
@@ -85,10 +118,33 @@ class BanlistRenderer {
}
}
buf.append("</ul>\n");
if (_page > 0 || morePages)
outputPageLinks(buf, _page, _pageSize, morePages);
out.append(buf);
out.flush();
}
/**
* @since 0.9.69
*/
private void outputPageLinks(StringBuilder buf, int page, int pageSize, boolean morePages) {
buf.append("<div class=\"netdbnotfound\">");
if (page > 0) {
buf.append("<a href=\"/profiles?f=3&amp;pg=").append(page)
.append("&amp;ps=").append(pageSize).append("\">");
buf.append(_t("Previous Page"));
buf.append("</a>&nbsp;&nbsp;&nbsp;");
}
buf.append(_t("Page")).append(' ').append(page + 1);
if (morePages) {
buf.append("&nbsp;&nbsp;&nbsp;<a href=\"/profiles?f=3&amp;pg=").append(page + 2)
.append("&amp;ps=").append(pageSize).append("\">");
buf.append(_t("Next Page"));
buf.append("</a>");
}
buf.append("</div>");
}
/** translate a string */
private String _t(String s) {
return Messages.getString(s, _context);
@@ -38,6 +38,8 @@ public class PeerHelper extends HelperBase {
private String _urlBase;
private String _transport;
private boolean _graphical;
private int _pageSize = BanlistRenderer.PAGE_SIZE;
private int _page;
private static final String titles[] = {
_x("Status"),
@@ -80,6 +82,31 @@ public class PeerHelper extends HelperBase {
/** @since 0.9.38 */
public void setTransport(String t) { _transport = t; }
/**
* @param page 1-based
* @since 0.9.69
*/
public void setPage(String page) {
if (page != null) {
try {
_page = Integer.parseInt(page) - 1;
if (_page < 0)
_page = 0;
} catch (NumberFormatException nfe) {}
}
}
/**
* @since 0.9.69
*/
public void setPageSize(String ps) {
if (ps != null) {
try {
_pageSize = Integer.parseInt(ps);
} catch (NumberFormatException nfe) {}
}
}
/**
* call for non-text-mode browsers
* @since 0.9.38
@@ -164,6 +191,8 @@ public class PeerHelper extends HelperBase {
_context.commSystem().renderStatusHTML(_out, _urlBase, _sortFlags);
} else if ("banned".equals(_transport)) {
BanlistRenderer br = new BanlistRenderer(_context);
br.setPage(_page);
br.setPageSize(_pageSize);
br.renderStatusHTML(_out);
} else if (_transport != null) {
boolean rendered = false;
@@ -8,6 +8,8 @@ import net.i2p.router.web.HelperBase;
public class ProfilesHelper extends HelperBase {
private int _full;
private boolean _graphical;
private int _pageSize = BanlistRenderer.PAGE_SIZE;
private int _page;
private static final String titles[] =
{_x("High Capacity"), // 0
@@ -31,6 +33,31 @@ public class ProfilesHelper extends HelperBase {
}
}
/**
* @param page 1-based
* @since 0.9.69
*/
public void setPage(String page) {
if (page != null) {
try {
_page = Integer.parseInt(page) - 1;
if (_page < 0)
_page = 0;
} catch (NumberFormatException nfe) {}
}
}
/**
* @since 0.9.69
*/
public void setPageSize(String ps) {
if (ps != null) {
try {
_pageSize = Integer.parseInt(ps);
} catch (NumberFormatException nfe) {}
}
}
/**
* call for non-text-mode browsers
* @since 0.9.1
@@ -69,6 +96,8 @@ public class ProfilesHelper extends HelperBase {
public String getBanlistSummary() {
try {
BanlistRenderer rend = new BanlistRenderer(_context);
rend.setPage(_page);
rend.setPageSize(_pageSize);
rend.renderStatusHTML(_out);
} catch (IOException ioe) {
ioe.printStackTrace();
+2
View File
@@ -20,5 +20,7 @@
<jsp:setProperty name="peerHelper" property="urlBase" value="peers.jsp" />
<jsp:setProperty name="peerHelper" property="sort" value="<%=request.getParameter(\"sort\") != null ? request.getParameter(\"sort\") : \"\"%>" />
<jsp:setProperty name="peerHelper" property="transport" value="<%=request.getParameter(\"tx\")%>" />
<jsp:setProperty name="peerHelper" property="page" value="<%=request.getParameter(\"pg\")%>" />
<jsp:setProperty name="peerHelper" property="pageSize" value="<%=request.getParameter(\"ps\")%>" />
<jsp:getProperty name="peerHelper" property="peerSummary" />
</div></body></html>
+2
View File
@@ -18,5 +18,7 @@
profilesHelper.allowGraphical();
%>
<jsp:setProperty name="profilesHelper" property="full" value="<%=request.getParameter(\"f\")%>" />
<jsp:setProperty name="profilesHelper" property="page" value="<%=request.getParameter(\"pg\")%>" />
<jsp:setProperty name="profilesHelper" property="pageSize" value="<%=request.getParameter(\"ps\")%>" />
<jsp:getProperty name="profilesHelper" property="summary" />
</div></div></body></html>
+2 -2
View File
@@ -126,9 +126,9 @@ public class Banlist {
* For BanlistRenderer in router console.
* Note - may contain expired entries.
*/
public Map<Hash, Entry> getEntries() {
public void getEntries(Map<Hash, Entry> rv) {
synchronized(_entries) {
return Collections.unmodifiableMap(_entries);
rv.putAll(_entries);
}
}
@@ -1056,7 +1056,8 @@ public class Analysis extends JobImpl implements RouterApp, Runnable {
private static final long DAY = 24*60*60*1000L;
public void addProfilePoints(List<RouterInfo> ris, Map<Hash, Points> points) {
Map<Hash, Banlist.Entry> banEntries = _context.banlist().getEntries();
Map<Hash, Banlist.Entry> banEntries = new HashMap<Hash, Banlist.Entry>(1024);
_context.banlist().getEntries(banEntries);
long now = _context.clock().now();
RateAverages ra = RateAverages.getTemp();
for (RouterInfo info : ris) {