Hi,
I've written a patch to address #500:
https://bugs.freenetproject.org/view.php?id=500
It needs to be reviewed before it's commited.
NextGen$
-------------- next part --------------
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/clients/http/N2NTMToadlet.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/clients/http/N2NTMToadlet.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/clients/http/N2NTMToadlet.java (working copy)
@@ -164,7 +164,7 @@
buf.append("PeerNode.hashCode
'"+request.getParam("hashcode")+"' not found.<br /><br />\n");
buf.append("</div>");
buf.append("</div>");
- } else if(!pn.isConnected() &&
!pn.isVerifiedIncompatibleNewerVersion() &&
!pn.isVerifiedIncompatibleOlderVersion()) {
+ } else if(!pn.isConnected()) {
ctx.getPageMaker().makeHead(buf, "Node To
Node Text Message Failed");
buf.append("<div class=\"infobox
infobox-error\">");
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/io/comm/DummyPeerContext.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/io/comm/DummyPeerContext.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/io/comm/DummyPeerContext.java (working copy)
@@ -22,8 +22,11 @@
// Do nothing
}
+ public boolean isReallyConnected() {
+ return false;
+ }
+
public boolean isConnected() {
return false;
}
-
}
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/io/comm/PeerContext.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/io/comm/PeerContext.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/io/comm/PeerContext.java
(working copy)
@@ -13,6 +13,9 @@
/** Force the peer to disconnect */
void forceDisconnect();
- /** Is the peer connected? If we can't tell, return true. */
+ /** Is the peer connected? Have we established the session link? */
boolean isConnected();
+
+ /** Is the peer connected? are we able to route requests to it? */
+ boolean isReallyConnected();
}
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/CHKInsertSender.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/CHKInsertSender.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/CHKInsertSender.java (working copy)
@@ -646,7 +646,7 @@
MessageFilter mf = null;
for(int i=0;i<waiters.length;i++) {
AwaitingCompletion awc = waiters[i];
- if(!awc.pn.isConnected()) {
+ if(!awc.pn.isReallyConnected()) {
Logger.normal(this, "Disconnected:
"+awc.pn+" in "+CHKInsertSender.this);
continue;
}
@@ -678,7 +678,7 @@
}
if(noTimeLeft) {
for(int
i=0;i<waiters.length;i++) {
-
if(!waiters[i].pn.isConnected()) continue;
+
if(!waiters[i].pn.isReallyConnected()) continue;
if(!waiters[i].completedTransfer) {
waiters[i].completedTransfer(false);
}
@@ -745,7 +745,7 @@
if(noTimeLeft) {
Logger.minor(this, "Overall
timeout on "+CHKInsertSender.this);
for(int
i=0;i<waiters.length;i++) {
-
if(!waiters[i].pn.isConnected()) continue;
+
if(!waiters[i].pn.isReallyConnected()) continue;
if(!waiters[i].receivedCompletionNotice)
waiters[i].completed(false, false);
if(!waiters[i].completedTransfer)
@@ -770,7 +770,7 @@
boolean completedTransfers = true;
synchronized(nodesWaitingForCompletion) {
for(int i=0;i<waiters.length;i++) {
- if(!waiters[i].pn.isConnected())
continue;
+ if(!waiters[i].pn.isReallyConnected())
continue;
if(!waiters[i].completedTransfer) {
completedTransfers = false;
break;
@@ -786,7 +786,7 @@
}
completedTransfers = true;
for(int
i=0;i<waiters.length;i++) {
-
if(!waiters[i].pn.isConnected()) continue;
+
if(!waiters[i].pn.isReallyConnected()) continue;
if(!waiters[i].completedTransfer) {
completedTransfers = false;
break;
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/FNPPacketMangler.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/FNPPacketMangler.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/FNPPacketMangler.java (working copy)
@@ -126,7 +126,7 @@
if(tryProcessAuth(buf, offset, length, pn, peer)) return;
}
}
- if(opn != null && !opn.isConnected())
+ if(opn != null && !opn.isReallyConnected())
Logger.minor(this,"Unmatchable packet from "+peer);
else
Logger.error(this,"Unmatchable packet from "+peer);
@@ -1398,6 +1398,11 @@
public boolean isDisconnected(PeerContext context) {
if(context == null) return false;
- return !((PeerNode)context).isConnected();
+ return !((PeerNode)context).isReallyConnected();
+ }
+
+ public boolean isRestricted(PeerContext context) {
+ if(context == null) return false;
+ return (!((PeerNode)context).isReallyConnected() &&
((PeerNode)context).isConnected());
}
}
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/IPDetectorPluginManager.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/IPDetectorPluginManager.java (working copy)
@@ -153,7 +153,7 @@
// Unique IP address?
Peer peer = p.getPeer();
InetAddress addr =
peer.getAddress(false);
- if(p.isConnected() && peer !=
null && addr != null && IPUtil.checkAddress(peer.getAddress())) {
+ if(p.isReallyConnected() &&
peer != null && addr != null && IPUtil.checkAddress(peer.getAddress())) {
// Connected node, on a
real internet IP address.
// Is it internal?
boolean internal =
false;
@@ -246,11 +246,10 @@
// No locally detected IP, only
one or two connections.
// Have we had more relatively
recently?
int count = 0;
- long timeref = now;
- if(firstTimeMaybeFakePeers > 0)
timeref = firstTimeMaybeFakePeers;
+
for(int i=0;i<peers.length;i++)
{
PeerNode p = peers[i];
- if((!p.isConnected())
|| now - p.lastReceivedPacketTime() < 5*60*1000) {
+
if((!p.isReallyConnected()) || now - p.lastReceivedPacketTime() < 5*60*1000) {
// Not
connected now but has been within the past 5 minutes.
count++;
}
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/InsertHandler.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/InsertHandler.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/InsertHandler.java
(working copy)
@@ -39,7 +39,6 @@
private byte[] headers;
private BlockReceiver br;
private Thread runThread;
- private boolean sentSuccess;
PartiallyReceivedBlock prb;
@@ -103,7 +102,7 @@
if(msg == null) {
try {
- if(source.isConnected() && startTime >
(source.timeLastConnected()+Node.HANDSHAKE_TIMEOUT*4))
+ if(source.isReallyConnected() && startTime >
(source.timeLastConnected()+Node.HANDSHAKE_TIMEOUT*4))
Logger.error(this, "Did not receive DataInsert
on "+uid+" from "+source+" !");
Message tooSlow = DMT.createFNPRejectedTimeout(uid);
source.sendAsync(tooSlow, null, 0, null);
@@ -144,7 +143,6 @@
if(htl == 0) {
canCommit = true;
msg = DMT.createFNPInsertReply(uid);
- sentSuccess = true;
try {
source.send(msg, null);
} catch (NotConnectedException e) {
@@ -253,7 +251,6 @@
if(status == CHKInsertSender.SUCCESS) {
msg = DMT.createFNPInsertReply(uid);
- sentSuccess = true;
try {
source.send(msg, null);
} catch (NotConnectedException e) {
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java
(working copy)
@@ -634,7 +634,7 @@
*/
public int allocateOutgoingPacketNumber() throws KeyChangedException,
NotConnectedException {
int packetNumber;
- if(!pn.isConnected()) throw new NotConnectedException();
+ if(!pn.isReallyConnected()) throw new NotConnectedException();
synchronized(this) {
if(isDeprecated) throw new KeyChangedException();
packetNumber = nextPacketNumber++;
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/LocationManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/LocationManager.java (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/LocationManager.java (working copy)
@@ -124,7 +124,7 @@
PeerNode[] peers = node.peers.connectedPeers;
for(int i=0;i<peers.length;i++) {
PeerNode pn = peers[i];
- if(pn.isConnected()) {
+ if(pn.isReallyConnected()) {
double ploc =
pn.getLocation().getValue();
if(ploc == myLoc) {
myFlag = true;
@@ -386,7 +386,7 @@
}
if(reply == null) {
- if(pn.isConnected() && System.currentTimeMillis() -
pn.timeLastConnected() > TIMEOUT*2) {
+ if(pn.isReallyConnected() && System.currentTimeMillis() -
pn.timeLastConnected() > TIMEOUT*2) {
// Timed out! Abort...
Logger.error(this, "Timed out waiting for
SwapRejected/SwapReply on "+uid);
}
@@ -421,7 +421,7 @@
}
if(reply == null) {
- if(pn.isConnected() && System.currentTimeMillis() -
pn.timeLastConnected() > TIMEOUT*2) {
+ if(pn.isReallyConnected() && System.currentTimeMillis() -
pn.timeLastConnected() > TIMEOUT*2) {
// Hrrrm!
Logger.error(this, "Timed out waiting for SwapComplete
- malicious node?? on "+uid);
}
Index: /home/nextgens/src/eclipse/Freenet
0.7/src/freenet/node/NodeDispatcher.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/NodeDispatcher.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/NodeDispatcher.java
(working copy)
@@ -50,7 +50,32 @@
Logger.minor(this, "Lost connection replying to "+m);
}
return true;
+ }else if(spec == DMT.FNPLinkPing) {
+ long id = m.getLong(DMT.PING_SEQNO);
+ Message msg = DMT.createFNPLinkPong(id);
+ try {
+ source.sendAsync(msg, null, 0, null);
+ } catch (NotConnectedException e) {
+ // Ignore
+ }
+ return true;
+ } else if(spec == DMT.FNPLinkPong) {
+ long id = m.getLong(DMT.PING_SEQNO);
+ source.receivedLinkPong(id);
+ return true;
+ } else if(spec == DMT.FNPDetectedIPAddress) {
+ Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS);
+ source.setRemoteDetectedPeer(p);
+ node.redetectAddress();
+ } else if(spec == DMT.FNPVoid) {
+ return true;
+ } else if(spec == DMT.nodeToNodeTextMessage) {
+ node.receivedNodeToNodeTextMessage(m);
+ return true;
}
+
+ if(!source.isReallyConnected()) return false;
+
if(spec == DMT.FNPLocChangeNotification) {
double newLoc = m.getDouble(DMT.LOCATION);
source.updateLocation(newLoc);
@@ -79,29 +104,7 @@
return handleInsertRequest(m, false);
} else if(spec == DMT.FNPSSKInsertRequest) {
return handleInsertRequest(m, true);
- } else if(spec == DMT.FNPLinkPing) {
- long id = m.getLong(DMT.PING_SEQNO);
- Message msg = DMT.createFNPLinkPong(id);
- try {
- source.sendAsync(msg, null, 0, null);
- } catch (NotConnectedException e) {
- // Ignore
- }
- return true;
- } else if(spec == DMT.FNPLinkPong) {
- long id = m.getLong(DMT.PING_SEQNO);
- source.receivedLinkPong(id);
- return true;
- } else if(spec == DMT.FNPDetectedIPAddress) {
- Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS);
- source.setRemoteDetectedPeer(p);
- node.redetectAddress();
- } else if(spec == DMT.FNPVoid) {
- return true;
- } else if(spec == DMT.nodeToNodeTextMessage) {
- node.receivedNodeToNodeTextMessage(m);
- return true;
- }
+ }
return false;
}
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java
(working copy)
@@ -154,7 +154,10 @@
if(pn.isConnected()) {
if(pn.shouldDisconnectNow()) {
- pn.forceDisconnect();
+ // we don't disconnect but we mark it incompatible
+ pn.invalidate();
+ pn.setPeerNodeStatus(now);
+ Logger.normal(this, "shouldDisconnect has returned true
: marking the peer as incompatible");
continue;
}
@@ -175,7 +178,7 @@
try {
pn.sendAnyUrgentNotifications();
} catch (PacketSequenceException e) {
- Logger.error(this, "Caught "+e+" - disconnecting", e);
+ Logger.error(this, "Caught "+e+" - while sending urgent
notifications : disconnecting", e);
pn.forceDisconnect();
}
} else {
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java
(working copy)
@@ -180,7 +180,7 @@
}
public void addConnectedPeer(PeerNode pn) {
- if(!pn.isConnected()) {
+ if(!pn.isReallyConnected()) {
Logger.minor(this, "Not connected: "+pn);
return;
}
@@ -272,7 +272,7 @@
locs = new double[connectedPeers.length];
int x = 0;
for(int i=0;i<conns.length;i++) {
- if(conns[i].isConnected())
+ if(conns[i].isReallyConnected())
locs[x++] = conns[i].getLocation().getValue();
}
// Wipe out any information contained in the order
@@ -294,7 +294,7 @@
for(int i=0;i<5;i++) {
PeerNode pn =
connectedPeers[node.random.nextInt(connectedPeers.length)];
if(pn == exclude) continue;
- if(pn.isConnected()) return pn;
+ if(pn.isReallyConnected()) return pn;
}
// None of them worked
// Move the un-connected ones out
@@ -304,7 +304,7 @@
for(int i=0;i<myPeers.length;i++) {
PeerNode pn = myPeers[i];
if(pn == exclude) continue;
- if(pn.isConnected()) {
+ if(pn.isReallyConnected()) {
v.add(pn);
} else {
Logger.minor(this, "Excluding "+pn+" because is disconnected");
@@ -311,7 +311,7 @@
}
}
int lengthWithoutExcluded = v.size();
- if(exclude != null && exclude.isConnected())
+ if(exclude != null && exclude.isReallyConnected())
v.add(exclude);
PeerNode[] newConnectedPeers = new PeerNode[v.size()];
newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
@@ -348,7 +348,7 @@
PeerNode best = null;
for(int i=0;i<peers.length;i++) {
PeerNode p = peers[i];
- if(!p.isConnected()) continue;
+ if(!p.isReallyConnected()) continue;
double diff = distance(p, loc);
if(diff < bestDiff) {
best = p;
@@ -423,7 +423,7 @@
Logger.minor(this, "Skipping (req came from): "+p.getPeer());
continue;
}
- if(!p.isConnected()) {
+ if(!p.isReallyConnected()) {
Logger.minor(this, "Skipping (not connected): "+p.getPeer());
continue;
}
@@ -580,7 +580,7 @@
public boolean anyConnectedPeers() {
PeerNode[] conns = connectedPeers;
for(int i=0;i<conns.length;i++) {
- if(conns[i].isConnected()) return true;
+ if(conns[i].isReallyConnected()) return true;
}
return false;
}
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java
(working copy)
@@ -680,8 +680,17 @@
* Note possible deadlocks! PeerManager calls this, we call
* PeerManager in e.g. verified.
*/
+ public boolean isReallyConnected() {
+ return isConnected;
+ }
+
+ /**
+ * the node has established the session link : doesn't mean we can route
to it!
+ * check isReallyConnected() insteed.
+ */
public boolean isConnected() {
- return isConnected;
+ // maybe we should check the protocol versions too
+ return (isConnected || (hasCompletedHandshake() &&
(isVerifiedIncompatibleNewerVersion() ||
isVerifiedIncompatibleOlderVersion())));
}
/**
@@ -694,7 +703,7 @@
*/
public void sendAsync(Message msg, AsyncMessageCallback cb, int
alreadyReportedBytes, ByteCounter ctr) throws NotConnectedException {
Logger.minor(this, "Sending async: "+msg+" : "+cb+" on "+this);
- if(!isConnected) throw new NotConnectedException();
+ if(!isConnected()) throw new NotConnectedException();
MessageItem item = new MessageItem(msg, cb == null ? null : new
AsyncMessageCallback[] {cb}, alreadyReportedBytes, ctr);
synchronized(routingBackoffSync) {
reportBackoffStatus(System.currentTimeMillis());
@@ -732,6 +741,7 @@
synchronized(this) {
// Force renegotiation.
isConnected = false;
+ completedHandshake = false;
setPeerNodeStatus(now);
// Prevent sending packets to the node until that happens.
if(currentTracker != null)
@@ -1110,27 +1120,18 @@
} catch (NumberFormatException e) {
// ignore
}
- Logger.normal(this, "Not connecting to "+this+" -
reverse invalid version "+Version.getVersionString()+" for peer's
lastGoodversion: "+lastGoodVersion);
+ Logger.normal(this, "Connecting to "+this+" - reverse
invalid version "+Version.getVersionString()+" for peer's lastGoodversion:
"+lastGoodVersion);
verifiedIncompatibleNewerVersion = true;
isConnected = false;
- setPeerNodeStatus(now);
- node.peers.disconnected(this);
- return false;
- } else {
- verifiedIncompatibleNewerVersion = false;
- setPeerNodeStatus(now);
- }
- if(invalidVersion()) {
- Logger.normal(this, "Not connecting to "+this+" -
invalid version "+version);
+ }else if(invalidVersion()) {
+ Logger.normal(this, "Connecting to "+this+" - invalid
version "+version);
verifiedIncompatibleOlderVersion = true;
isConnected = false;
- setPeerNodeStatus(now);
- node.peers.disconnected(this);
- return false;
} else {
verifiedIncompatibleOlderVersion = false;
- setPeerNodeStatus(now);
}
+ setPeerNodeStatus(now);
+
KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
changedIP(replyTo);
if(thisBootID != this.bootID) {
@@ -1164,7 +1165,6 @@
unverifiedTracker = null;
if(previousTracker != null)
previousTracker.deprecated();
- isConnected = true;
neverConnected = false;
peerAddedTime = 0; // don't store anymore
setPeerNodeStatus(now);
@@ -1170,7 +1170,7 @@
setPeerNodeStatus(now);
ctx = null;
}
- if(!isConnected)
+ if(!isConnected())
node.peers.disconnected(this);
Logger.normal(this, "Completed handshake with "+this+" on
"+replyTo+" - current: "+currentTracker+" old: "+previousTracker+" unverified:
"+unverifiedTracker+" bootID: "+thisBootID+" myName: "+myName);
try {
@@ -1196,7 +1196,8 @@
else return;
if(unverifiedTracker != null) return;
}
- sendInitialMessages();
+ if(isReallyConnected())
+ sendInitialMessages();
}
/**
@@ -1207,7 +1208,7 @@
Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);
try {
- sendAsync(locMsg, null, 0, null);
+ sendAsync(locMsg, null, 0, null);
sendAsync(ipMsg, null, 0, null);
} catch (NotConnectedException e) {
Logger.error(this, "Completed handshake with "+getPeer()+" but
disconnected!!!", new Exception("error"));
@@ -1453,8 +1454,16 @@
}
public String getStatus() {
+ String status;
+ if(isReallyConnected())
+ status = new String("CONNECTED");
+ else if(isConnected())
+ status = new String("INCOMPATIBLE");
+ else
+ status = new String("DISCONNECTED");
+
return
- (isConnected ? "CONNECTED " : "DISCONNECTED") + " " +
getPeer()+" "+myName+" "+currentLocation.getValue()+" "+getVersion()+" backoff:
"+routingBackoffLength+" ("+(Math.max(routingBackedOffUntil -
System.currentTimeMillis(),0))+")";
+ status + " " + getPeer()+" "+myName+"
"+currentLocation.getValue()+" "+getVersion()+" backoff:
"+routingBackoffLength+" ("+(Math.max(routingBackedOffUntil -
System.currentTimeMillis(),0))+")";
}
public String getTMCIPeerInfo() {
@@ -1774,7 +1783,8 @@
pingAverage.report(now - startTime);
Logger.minor(this, "Reporting ping time to "+this+" :
"+(now - startTime));
}
- if(verifiedIncompatibleOlderVersion)
+
+ if(shouldDisconnectNow())
forceDisconnect();
}
@@ -2052,8 +2062,14 @@
* This will return true if our lastGoodBuild has changed due to a
timed mandatory.
*/
public synchronized boolean shouldDisconnectNow() {
+ if(!isReallyConnected()) return false;
verifiedIncompatibleOlderVersion = invalidVersion();
- return verifiedIncompatibleOlderVersion;
+ verifiedIncompatibleNewerVersion = reverseInvalidVersion();
+ return verifiedIncompatibleOlderVersion ||
verifiedIncompatibleNewerVersion;
+ }
+
+ public synchronized void invalidate() {
+ isConnected = false;
}
public boolean allowLocalAddresses() {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20060709/9bc4dc2f/attachment.pgp>