Author: toad
Date: 2006-09-02 14:11:22 +0000 (Sat, 02 Sep 2006)
New Revision: 10350
Modified:
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/PeerNode.java
Log:
Fix a deadlock, prevent several potential deadlocks.
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-09-02
13:49:31 UTC (rev 10349)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-09-02
14:11:22 UTC (rev 10350)
@@ -1038,9 +1038,9 @@
throw new IllegalArgumentException();
PeerNode pn = (PeerNode)peer;
byte[] newBuf = preformat(buf, offset, length);
- try{
- processOutgoingPreformatted(newBuf, 0, newBuf.length, pn, -1, null,
alreadyReportedBytes);
- }catch (NotConnectedException e){
+ try {
+ processOutgoingPreformatted(newBuf, 0, newBuf.length, pn, -1,
null, alreadyReportedBytes);
+ } catch (NotConnectedException e){
pn.invalidate();
pn.setPeerNodeStatus(System.currentTimeMillis());
throw e;
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-09-02 13:49:31 UTC
(rev 10349)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-09-02 14:11:22 UTC
(rev 10350)
@@ -878,7 +878,6 @@
isConnected = false;
isRoutable = false;
completedHandshake = false;
- setPeerNodeStatus(now);
// Prevent sending packets to the node until that happens.
if(currentTracker != null)
currentTracker.disconnected();
@@ -887,11 +886,10 @@
if(unverifiedTracker != null)
unverifiedTracker.disconnected();
// DO NOT clear trackers, so can still receive.
+ sendHandshakeTime = now;
}
node.lm.lostOrRestartedNode(this);
- synchronized(this) {
- sendHandshakeTime = now;
- }
+ setPeerNodeStatus(now);
}
public void forceDisconnect() {
@@ -1384,7 +1382,6 @@
}
if(prev != null)
prev.deprecated();
- setPeerNodeStatus(now);
}
synchronized(this) {
Logger.normal(this, "Completed handshake with "+this+"
on "+replyTo+" - current: "+currentTracker+" old: "+previousTracker+"
unverified: "+unverifiedTracker+" bootID: "+thisBootID+" getName():
"+getName());
@@ -1479,7 +1476,7 @@
* if necessary.
*/
public void verified(KeyTracker tracker) {
- long now = System.currentTimeMillis();
+ long now = System.currentTimeMillis();
synchronized(this) {
if(tracker == unverifiedTracker) {
if(logMINOR) Logger.minor(this, "Promoting unverified tracker
"+tracker+" for "+getPeer());
@@ -1494,11 +1491,11 @@
isConnected = true;
neverConnected = false;
peerAddedTime = 0; // don't store anymore
- setPeerNodeStatus(now);
ctx = null;
maybeSendInitialMessages();
} else return;
}
+ setPeerNodeStatus(now);
node.peers.addConnectedPeer(this);
}
@@ -1979,7 +1976,6 @@
int x =
node.random.nextInt(routingBackoffLength);
routingBackedOffUntil = now + x;
setLastBackoffReason( reason );
- setPeerNodeStatus(now);
String reasonWrapper = "";
if( 0 <= reason.length()) {
reasonWrapper = " because of
'"+reason+"'";
@@ -1988,8 +1984,10 @@
if(logMINOR) Logger.minor(this, "Backing
off"+reasonWrapper+": routingBackoffLength="+routingBackoffLength+", until
"+x+"ms on "+peer);
} else {
if(logMINOR) Logger.minor(this, "Ignoring
localRejectedOverload: "+(routingBackedOffUntil-now)+"ms remaining on routing
backoff on "+peer);
+ return;
}
}
+ setPeerNodeStatus(now);
}
/**
@@ -2007,11 +2005,12 @@
if(now > routingBackedOffUntil) {
routingBackoffLength =
INITIAL_ROUTING_BACKOFF_LENGTH;
if(logMINOR) Logger.minor(this, "Resetting
routing backoff on "+peer);
- setPeerNodeStatus(now);
} else {
if(logMINOR) Logger.minor(this, "Ignoring
successNotOverload: "+(routingBackedOffUntil-now)+"ms remaining on routing
backoff on "+peer);
+ return;
}
}
+ setPeerNodeStatus(now);
}
Object pingSync = new Object();
@@ -2075,8 +2074,8 @@
}
if(shouldDisconnectNow()){
- invalidate();
- setPeerNodeStatus(now);
+ invalidate();
+ setPeerNodeStatus(now);
}
}
@@ -2272,6 +2271,9 @@
public void setPeerNodeStatus(long now) {
long localRoutingBackedOffUntil = getRoutingBackedOffUntil();
synchronized(this) {
+ if(isConnected && this.currentTracker.isDeprecated()) {
+ Logger.error(this, "Connected but primary
tracker deprecated ?!?! on "+this+" : "+currentTracker, new Exception("debug"));
+ }
int oldPeerNodeStatus = peerNodeStatus;
if(isRoutable()) { // Function use also updates
timeLastConnected and timeLastRoutable
peerNodeStatus =
Node.PEER_NODE_STATUS_CONNECTED;