Author: toad
Date: 2007-07-13 11:04:44 +0000 (Fri, 13 Jul 2007)
New Revision: 14060
Modified:
trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
trunk/freenet/src/freenet/node/DarknetPeerNode.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/useralerts/PeerManagerUserAlert.java
Log:
New connection failure code: CONN_ERROR - any unknown connection failure e.g.
bogus noderef. Usually caused by a buggy node.
Modified: trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
2007-07-13 10:06:45 UTC (rev 14059)
+++ trunk/freenet/src/freenet/clients/http/ConnectionsToadlet.java
2007-07-13 11:04:44 UTC (rev 14060)
@@ -160,9 +160,10 @@
int numberOfListening =
PeerNodeStatus.getPeerStatusCount(peerNodeStatuses,
PeerManager.PEER_NODE_STATUS_LISTENING);
int numberOfListenOnly =
PeerNodeStatus.getPeerStatusCount(peerNodeStatuses,
PeerManager.PEER_NODE_STATUS_LISTEN_ONLY);
int numberOfClockProblem =
PeerNodeStatus.getPeerStatusCount(peerNodeStatuses,
PeerManager.PEER_NODE_STATUS_CLOCK_PROBLEM);
+ int numberOfError =
PeerNodeStatus.getPeerStatusCount(peerNodeStatuses,
PeerManager.PEER_NODE_STATUS_CONN_ERROR);
int numberOfSimpleConnected = numberOfConnected +
numberOfRoutingBackedOff;
- int numberOfNotConnected = numberOfTooNew + numberOfTooOld +
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled +
numberOfBursting + numberOfListening + numberOfListenOnly +
numberOfClockProblem;
+ int numberOfNotConnected = numberOfTooNew + numberOfTooOld +
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled +
numberOfBursting + numberOfListening + numberOfListenOnly +
numberOfClockProblem + numberOfError;
String titleCountString = null;
if(advancedModeEnabled) {
titleCountString = "(" + numberOfConnected + '/' +
numberOfRoutingBackedOff + '/' + numberOfTooNew + '/' + numberOfTooOld + '/' +
numberOfNotConnected + ')';
@@ -295,6 +296,11 @@
peerStatsListenOnlyListItem.addChild("span",
new String[] { "class", "title", "style" }, new String[] {
"peer_clock_problem", l10n("clockProblem"), "border-bottom: 1px dotted; cursor:
help;" }, l10n("clockProblemShort"));
peerStatsListenOnlyListItem.addChild("span",
":\u00a0" + numberOfClockProblem);
}
+ if (numberOfError > 0) {
+ HTMLNode peerStatsListenOnlyListItem =
peerStatsList.addChild("li").addChild("span");
+ peerStatsListenOnlyListItem.addChild("span",
new String[] { "class", "title", "style" }, new String[] {
"peer_clock_problem", l10n("error"), "border-bottom: 1px dotted; cursor: help;"
}, l10n("errorShort"));
+ peerStatsListenOnlyListItem.addChild("span",
":\u00a0" + numberOfError);
+ }
// Peer routing backoff reason box
if(advancedModeEnabled) {
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-07-13
10:06:45 UTC (rev 14059)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-07-13
11:04:44 UTC (rev 14060)
@@ -113,6 +113,8 @@
DarknetConnectionsToadlet.disabled=Not connected and disabled: because the
user has instructed the node not to connect to these peers.
DarknetConnectionsToadlet.disabledShort=Disabled
DarknetConnectionsToadlet.enterDescription=Enter description:
+DarknetConnectionsToadlet.error=Connection failed (corrupt?)
+DarknetConnectionsToadlet.errorShort=Error
DarknetConnectionsToadlet.failedToAddNodeInternalError=Unable to parse the
given text as a node reference. Please report the following to the developers:
DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=Failed to Add
Node: Internal Error
DarknetConnectionsToadlet.failedToAddNodeTitle=Failed To Add Node
@@ -599,6 +601,8 @@
OpennetConnectionsToadlet.peersListTitle=My Opennet Peers (untrusted peers
added by the node)
PNGFilter.invalidHeader=The file you tried to fetch is not a PNG. It does not
include a valid PNG header. It might be some other file format, and your
browser may do something dangerous with it, therefore we have blocked it.
PNGFilter.invalidHeaderTitle=Not a PNG - invalid header
+PeerManagerUserAlert.connErrorTitle=Some peers cannot connect
+PeerManagerUserAlert.connError=${count} of your peers cannot connect for an
unknown reason, possibly because of a buggy node or a corrupt node reference.
PeerManagerUserAlert.clockProblemTitle=Clock problem
PeerManagerUserAlert.clockProblem=${count} of your nodes are unable to connect
because their system clock is more than 24 hours different to yours. Please
check whether your computer has the correct time. Incorrect time will cause
many node and client mechanisms to fail.
PeerManagerUserAlert.noConns=This node has not been able to connect to any
other nodes so far; it will not be able to function normally. Hopefully some of
your peers will connect soon; if not, try to get some more peers. You need at
least 3 peers at any time, and should aim for 5-10.
Modified: trunk/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-07-13 10:06:45 UTC
(rev 14059)
+++ trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-07-13 11:04:44 UTC
(rev 14060)
@@ -221,6 +221,7 @@
if(status == PeerManager.PEER_NODE_STATUS_CONNECTED ||
status ==
PeerManager.PEER_NODE_STATUS_CLOCK_PROBLEM ||
status ==
PeerManager.PEER_NODE_STATUS_ROUTING_BACKED_OFF ||
+ status ==
PeerManager.PEER_NODE_STATUS_CONN_ERROR ||
status == PeerManager.PEER_NODE_STATUS_TOO_NEW
||
status == PeerManager.PEER_NODE_STATUS_TOO_OLD)
return status;
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2007-07-13 10:06:45 UTC
(rev 14059)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2007-07-13 11:04:44 UTC
(rev 14060)
@@ -88,6 +88,7 @@
public static final int PEER_NODE_STATUS_LISTENING = 9;
public static final int PEER_NODE_STATUS_LISTEN_ONLY = 10;
public static final int PEER_NODE_STATUS_CLOCK_PROBLEM = 11;
+ public static final int PEER_NODE_STATUS_CONN_ERROR = 12;
/**
* Create a PeerManager by reading a list of peers from
@@ -844,6 +845,7 @@
ua.peers = peers;
ua.neverConn =
getPeerNodeStatusSize(PEER_NODE_STATUS_NEVER_CONNECTED);
ua.clockProblem =
getPeerNodeStatusSize(PEER_NODE_STATUS_CLOCK_PROBLEM);
+ ua.connError =
getPeerNodeStatusSize(PEER_NODE_STATUS_CONN_ERROR);
}
if(anyConnectedPeers())
node.onConnectedPeer();
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2007-07-13 10:06:45 UTC
(rev 14059)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2007-07-13 11:04:44 UTC
(rev 14060)
@@ -1399,7 +1399,10 @@
boolean routable = true;
boolean newer = false;
boolean older = false;
- if(reverseInvalidVersion()) {
+ if(bogusNoderef) {
+ Logger.normal(this, "Not connecting to "+this+" - bogus
noderef");
+ routable = false;
+ } else if(reverseInvalidVersion()) {
try {
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(getLastGoodVersion()));
} catch (NumberFormatException e) {
@@ -1410,7 +1413,7 @@
} else {
newer = false;
}
- if(invalidVersion()) {
+ if(forwardInvalidVersion()) {
Logger.normal(this, "Not connecting to "+this+" -
invalid version "+getVersion());
older = true;
routable = false;
@@ -1591,11 +1594,15 @@
}
private synchronized boolean invalidVersion() {
- return bogusNoderef || (!Version.checkGoodVersion(version));
+ return bogusNoderef || forwardInvalidVersion() ||
reverseInvalidVersion();
}
+ private synchronized boolean forwardInvalidVersion() {
+ return !Version.checkGoodVersion(version);
+ }
+
private synchronized boolean reverseInvalidVersion() {
- return bogusNoderef ||
(!Version.checkArbitraryGoodVersion(Version.getVersionString(),lastGoodVersion));
+ return
!Version.checkArbitraryGoodVersion(Version.getVersionString(),lastGoodVersion);
}
public boolean publicInvalidVersion() {
@@ -2366,6 +2373,8 @@
previousRoutingBackoffReason = null;
}
}
+ } else if(isConnected() && bogusNoderef) {
+ peerNodeStatus =
PeerManager.PEER_NODE_STATUS_CONN_ERROR;
} else if(isConnected() && verifiedIncompatibleNewerVersion) {
peerNodeStatus = PeerManager.PEER_NODE_STATUS_TOO_NEW;
} else if(isConnected && verifiedIncompatibleOlderVersion) {
@@ -2434,7 +2443,7 @@
}
synchronized void updateShouldDisconnectNow() {
- verifiedIncompatibleOlderVersion = invalidVersion();
+ verifiedIncompatibleOlderVersion = forwardInvalidVersion();
verifiedIncompatibleNewerVersion = reverseInvalidVersion();
}
Modified: trunk/freenet/src/freenet/node/useralerts/PeerManagerUserAlert.java
===================================================================
--- trunk/freenet/src/freenet/node/useralerts/PeerManagerUserAlert.java
2007-07-13 10:06:45 UTC (rev 14059)
+++ trunk/freenet/src/freenet/node/useralerts/PeerManagerUserAlert.java
2007-07-13 11:04:44 UTC (rev 14060)
@@ -14,6 +14,7 @@
public int peers = 0;
public int neverConn = 0;
public int clockProblem = 0;
+ public int connError = 0;
boolean isValid=true;
int bwlimitDelayTime = 1;
int nodeAveragePingTime = 1;
@@ -32,8 +33,11 @@
static final int MAX_NEVER_CONNECTED_PEER_ALERT_THRESHOLD = 5;
/** How many peers with clock problems can we have without getting
alerted about too many */
- static final int MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD = 5;
+ static final int MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD = 5;
+ /** How many peers with unknown connection errors can we have without
getting alerted */
+ static final int MIN_CONN_ERROR_ALERT_THRESHOLD = 5;
+
/** How many peers we can have without getting alerted about too many */
static final int MAX_PEER_ALERT_THRESHOLD = 100;
@@ -57,8 +61,10 @@
return l10n("onlyFewConnsTitle", "count",
Integer.toString(conns));
if(neverConn > MAX_NEVER_CONNECTED_PEER_ALERT_THRESHOLD)
return l10n("tooManyNeverConnectedTitle");
- if(clockProblem > MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD)
+ if(clockProblem > MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD)
return l10n("clockProblemTitle");
+ if(connError > MIN_CONN_ERROR_ALERT_THRESHOLD)
+ return l10n("connErrorTitle");
if((peers - conns) > MAX_DISCONN_PEER_ALERT_THRESHOLD)
return l10n("tooManyDisconnectedTitle");
if(conns > MAX_CONN_ALERT_THRESHOLD)
@@ -94,8 +100,10 @@
return l10n("noPeersTestnet");
else
return l10n("noPeersDarknet");
- } else if(conns < 3 && clockProblem >
MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
+ } else if(conns < 3 && clockProblem >
MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
s = l10n("clockProblem", "count",
Integer.toString(clockProblem));
+ } else if(conns < 3 && connError >
MIN_CONN_ERROR_ALERT_THRESHOLD) {
+ s = l10n("connError", "count",
Integer.toString(connError));
} else if(conns == 0) {
return l10n("noConns");
} else if(conns == 1) {
@@ -104,8 +112,10 @@
return l10n("twoConns");
} else if(neverConn > MAX_NEVER_CONNECTED_PEER_ALERT_THRESHOLD)
{
s = l10n("tooManyNeverConnected", "count",
Integer.toString(neverConn));
- } else if(clockProblem >
MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
+ } else if(clockProblem >
MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
s = l10n("clockProblem", "count",
Integer.toString(clockProblem));
+ } else if(connError > MIN_CONN_ERROR_ALERT_THRESHOLD) {
+ s = l10n("connError", "count",
Integer.toString(connError));
} else if((peers - conns) > MAX_DISCONN_PEER_ALERT_THRESHOLD){
s = l10n("tooManyDisconnected", new String[] { "count",
"max" },
new String[] {
Integer.toString(disconnected),
Integer.toString(MAX_DISCONN_PEER_ALERT_THRESHOLD)});
@@ -160,8 +170,10 @@
alertNode.addChild("#", l10n("noPeersTestnet"));
else
alertNode.addChild("#",
l10n("noPeersDarknet"));
- } else if(conns < 3 && clockProblem >
MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
+ } else if(conns < 3 && clockProblem >
MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
alertNode.addChild("#", l10n("clockProblem", "count",
Integer.toString(clockProblem)));
+ } else if(conns < 3 && connError >
MIN_CONN_ERROR_ALERT_THRESHOLD) {
+ alertNode.addChild("#", l10n("connError", "count",
Integer.toString(connError)));
} else if (conns == 0) {
alertNode.addChild("#", l10n("noConns"));
} else if (conns == 1) {
@@ -172,8 +184,10 @@
L10n.addL10nSubstitution(alertNode,
"PeerManagerUserAlert.tooManyNeverConnectedWithLink",
new String[] { "link", "/link", "count"
},
new String[] { "<a
href=\"/friends/myref.fref\">", "</a>", Integer.toString(neverConn) });
- } else if (clockProblem >
MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
+ } else if (clockProblem >
MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) {
alertNode.addChild("#", l10n("clockProblem", "count",
Integer.toString(clockProblem)));
+ } else if(connError > MIN_CONN_ERROR_ALERT_THRESHOLD) {
+ alertNode.addChild("#", l10n("connError", "count",
Integer.toString(connError)));
} else if ((peers - conns) > MAX_DISCONN_PEER_ALERT_THRESHOLD) {
alertNode.addChild("#", l10n("tooManyDisconnected", new
String[] { "count", "max" }, new String[] { Integer.toString(disconnected),
Integer.toString(MAX_DISCONN_PEER_ALERT_THRESHOLD)}));
} else if (conns > MAX_CONN_ALERT_THRESHOLD) {
@@ -219,7 +233,8 @@
((peers - conns) >
MAX_DISCONN_PEER_ALERT_THRESHOLD) ||
(conns > MAX_CONN_ALERT_THRESHOLD) ||
(peers > MAX_PEER_ALERT_THRESHOLD) ||
- (clockProblem >
MAX_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) ||
+ (clockProblem >
MIN_CLOCK_PROBLEM_PEER_ALERT_THRESHOLD) ||
+ (connError > MIN_CONN_ERROR_ALERT_THRESHOLD) ||
(n.bwlimitDelayAlertRelevant &&
(bwlimitDelayTime > NodeStats.MAX_BWLIMIT_DELAY_TIME_ALERT_THRESHOLD)) ||
(n.nodeAveragePingAlertRelevant &&
(nodeAveragePingTime > NodeStats.MAX_NODE_AVERAGE_PING_TIME_ALERT_THRESHOLD)) ||
(oldestNeverConnectedPeerAge >
MAX_OLDEST_NEVER_CONNECTED_PEER_AGE_ALERT_THRESHOLD)) &&