Author: toad
Date: 2008-11-14 13:08:14 +0000 (Fri, 14 Nov 2008)
New Revision: 23570
Modified:
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/KeyTracker.java
trunk/freenet/src/freenet/node/StillNotAckedException.java
Log:
Warn the user via a useralert when peers are being disconnected due to packet
not acked.
This is a better alternative to flooding the logs - it still gets reported, and
the user's node doesn't get DoSed.
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2008-11-14
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2008-11-14
13:08:14 UTC (rev 23570)
@@ -472,6 +472,8 @@
FileOffer.succeededReceiveTitle=Successfully received file
FileOffer.succeededReceiveHeader=The transfer of the file ${filename} from
${node} was a success.
FileOffer.succeededReceiveShort=Successfully received ${filename} from ${node}.
+FNPPacketMangler.somePeersDisconnectedStillNotAcked=Probably a bug: please
report: ${count} peers forcibly disconnected due to not acknowledging packets
in 10 minutes.
+FNPPacketMangler.somePeersDisconnectedStillNotAckedDetail=${count} of your
peers are having severe problems. This is probably due to a bug in the code.
Please report it to us at the bug tracker at
${link}https://bugs.freenetproject.org/${/link} or at [EMAIL PROTECTED] Please
include this message and what version of the node you are running. The affected
peers (you may not want to include this in your bug report if they are darknet
peers) are:
GIFFilter.invalidHeader=The file does not contain a valid GIF header.
GIFFilter.invalidHeaderTitle=Invalid header
GIFFilter.notGif=The file you tried to fetch is not a GIF. It might be some
other file format, and your browser may do something dangerous with it,
therefore we have blocked it.
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2008-11-14
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2008-11-14
13:08:14 UTC (rev 23570)
@@ -8,6 +8,7 @@
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedList;
import net.i2p.util.NativeBigInteger;
@@ -39,8 +40,11 @@
import freenet.io.comm.ReferenceSignatureVerificationException;
import freenet.io.comm.SocketHandler;
import freenet.io.comm.Peer.LocalAddressException;
+import freenet.l10n.L10n;
+import freenet.node.useralerts.UserAlert;
import freenet.support.ByteArrayWrapper;
import freenet.support.Fields;
+import freenet.support.HTMLNode;
import freenet.support.HexUtil;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
@@ -2358,6 +2362,7 @@
} catch (StillNotAckedException e) {
Logger.error(this, "Forcing disconnect on
"+tracker.pn+" for "+tracker+" because packets not acked after 10 minutes!");
tracker.pn.forceDisconnect(true);
+ disconnectedStillNotAcked(tracker);
throw new NotConnectedException();
}
@@ -2554,6 +2559,106 @@
return ret;
}
+ private HashSet<Peer> peersWithProblems = new HashSet<Peer>();
+
+ private void disconnectedStillNotAcked(KeyTracker tracker) {
+ synchronized(peersWithProblems) {
+ peersWithProblems.add(tracker.pn.getPeer());
+ if(peersWithProblems.size() > 1) return;
+ }
+ node.clientCore.alerts.register(disconnectedStillNotAckedAlert);
+ }
+
+ private UserAlert disconnectedStillNotAckedAlert = new UserAlert() {
+
+ public String anchor() {
+ return "disconnectedStillNotAcked";
+ }
+
+ public String dismissButtonText() {
+ return null;
+ }
+
+ public short getPriorityClass() {
+ return UserAlert.ERROR;
+ }
+
+ public String getShortText() {
+ int sz;
+ synchronized(peersWithProblems) {
+ sz = peersWithProblems.size();
+ }
+ return l10n("somePeersDisconnectedStillNotAcked",
"count", Integer.toString(sz));
+ }
+
+ public HTMLNode getHTMLText() {
+ HTMLNode div = new HTMLNode("div");
+ Peer[] peers;
+ synchronized(peersWithProblems) {
+ peers = peersWithProblems.toArray(new
Peer[peersWithProblems.size()]);
+ }
+ L10n.addL10nSubstitution(div,
"FNPPacketMangler.somePeersDisconnectedStillNotAckedDetail",
+ new String[] { "count", "link", "/link"
}
+ , new String[] {
Integer.toString(peers.length), "<a
href=\"/__CHECKED_HTTPS_=https://bugs.freenetproject.org/\">", "</a>" });
+ HTMLNode list = div.addChild("ul");
+ for(Peer peer : peers) {
+ list.addChild("li", peer.toString());
+ }
+ return div;
+ }
+
+ public String getText() {
+ StringBuffer sb = new StringBuffer();
+ Peer[] peers;
+ synchronized(peersWithProblems) {
+ peers = peersWithProblems.toArray(new
Peer[peersWithProblems.size()]);
+ }
+
sb.append(l10n("somePeersDisconnectedStillNotAckedDetail",
+ new String[] { "count", "link", "/link"
},
+ new String[] {
Integer.toString(peers.length), "", "" } ));
+ sb.append('\n');
+ for(Peer peer : peers) {
+ sb.append('\t');
+ sb.append(peer.toString());
+ sb.append('\n');
+ }
+ return sb.toString();
+ }
+
+ public String getTitle() {
+ return getShortText();
+ }
+
+ public Object getUserIdentifier() {
+ return FNPPacketMangler.this;
+ }
+
+ public boolean isEventNotification() {
+ return false;
+ }
+
+ public boolean isValid() {
+ return true;
+ }
+
+ public void isValid(boolean validity) {
+ // Ignore
+ }
+
+ public void onDismiss() {
+ // Ignore
+ }
+
+ public boolean shouldUnregisterOnDismiss() {
+ return false;
+ }
+
+ public boolean userCanDismiss() {
+ return false;
+ }
+
+ };
+
/**
* Encrypt and send a packet.
* @param plaintext The packet's plaintext, including all formatting,
@@ -2623,6 +2728,14 @@
return output.length + sock.getHeadersLength();
}
+ protected String l10n(String key, String[] patterns, String[] values) {
+ return L10n.getString("FNPPacketMangler."+key, patterns,
values);
+ }
+
+ protected String l10n(String key, String pattern, String value) {
+ return L10n.getString("FNPPacketMangler."+key, pattern, value);
+ }
+
/* (non-Javadoc)
* @see
freenet.node.OutgoingPacketMangler#sendHandshake(freenet.node.PeerNode)
*/
Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java 2008-11-14 13:04:13 UTC
(rev 23569)
+++ trunk/freenet/src/freenet/node/KeyTracker.java 2008-11-14 13:08:14 UTC
(rev 23570)
@@ -859,7 +859,7 @@
Logger.minor(this, "Packet " + qr.packetNumber + " sent over " + (now -
qr.createdTime) + "ms ago and still not acked on " + this + " for " + pn);
if(now - qr.createdTime
> 10 * 60 * 1000) {
Logger.error(this, "Packet " + qr.packetNumber + " sent over " + (now -
qr.createdTime) + "ms ago and still not acked on " + this + " for " + pn);
- throw new
StillNotAckedException();
+ throw new
StillNotAckedException(this);
}
}
packetNumbers[realLength++] =
packetNumber;
Modified: trunk/freenet/src/freenet/node/StillNotAckedException.java
===================================================================
--- trunk/freenet/src/freenet/node/StillNotAckedException.java 2008-11-14
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/node/StillNotAckedException.java 2008-11-14
13:08:14 UTC (rev 23570)
@@ -12,4 +12,10 @@
*/
public class StillNotAckedException extends Exception {
+ public StillNotAckedException(KeyTracker tracker) {
+ this.tracker = tracker;
+ }
+
+ final KeyTracker tracker;
+
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs