Author: toad
Date: 2006-06-14 23:40:14 +0000 (Wed, 14 Jun 2006)
New Revision: 9205
Modified:
trunk/freenet/src/freenet/node/ARKFetcher.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/Version.java
Log:
814: Fix a deadlock.
Modified: trunk/freenet/src/freenet/node/ARKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/node/ARKFetcher.java 2006-06-14 23:17:10 UTC
(rev 9204)
+++ trunk/freenet/src/freenet/node/ARKFetcher.java 2006-06-14 23:40:14 UTC
(rev 9205)
@@ -112,19 +112,21 @@
getter.cancel();
}
- public synchronized void onSuccess(FetchResult result, ClientGetter
state) {
+ public void onSuccess(FetchResult result, ClientGetter state) {
Logger.minor(this, "Fetched ARK for "+peer, new
Exception("debug"));
- started = false;
- // Fetcher context specifies an upper bound on size.
- backoff = MIN_BACKOFF;
-
- if(isFetching) {
- node.removeARKFetcher(identity,this);
- isFetching = false;
+ synchronized(this) {
+ started = false;
+ // Fetcher context specifies an upper bound on size.
+ backoff = MIN_BACKOFF;
+
+ if(isFetching) {
+ node.removeARKFetcher(identity,this);
+ isFetching = false;
+ }
+
+ getter = null;
}
- getter = null;
-
ArrayBucket bucket = (ArrayBucket) result.asBucket();
byte[] data = bucket.toByteArray();
String ref;
@@ -145,26 +147,30 @@
}
}
- public synchronized void onFailure(FetchException e, ClientGetter
state) {
- started = false;
- Logger.minor(this, "Failed to fetch ARK for "+peer+" : "+e, e);
-
- if(isFetching) {
- node.removeARKFetcher(identity,this);
- isFetching = false;
+ public void onFailure(FetchException e, ClientGetter state) {
+ synchronized(this) {
+ started = false;
+ Logger.minor(this, "Failed to fetch ARK for "+peer+" :
"+e, e);
+
+ if(isFetching) {
+ node.removeARKFetcher(identity,this);
+ isFetching = false;
+ }
+
+ // If it's a redirect, follow the redirect and update
the ARK.
+ // If it's any other error, wait a while then retry.
+ getter = null;
+ if(!shouldRun) return;
+ if(e.newURI == null) {
+ backoff += backoff;
+ if(backoff > MAX_BACKOFF) backoff = MAX_BACKOFF;
+ }
}
-
- // If it's a redirect, follow the redirect and update the ARK.
- // If it's any other error, wait a while then retry.
- getter = null;
- if(!shouldRun) return;
if(e.newURI != null) {
peer.updateARK(e.newURI);
queueWithBackoff();
return;
}
- backoff += backoff;
- if(backoff > MAX_BACKOFF) backoff = MAX_BACKOFF;
Logger.minor(this, "Failed to fetch ARK for "+peer+", now
backing off ARK fetches for "+(int) (backoff / 1000)+" seconds");
// We may be on the PacketSender thread.
// FIXME should this be exponential backoff?
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-06-14 23:17:10 UTC
(rev 9204)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-06-14 23:40:14 UTC
(rev 9205)
@@ -1065,99 +1065,101 @@
* @param replyTo
* @return True unless we rejected the handshake, or it failed to parse.
*/
- public synchronized boolean completedHandshake(long thisBootID, byte[]
data, int offset, int length, BlockCipher encCipher, byte[] encKey, Peer
replyTo, boolean unverified) {
- long now = System.currentTimeMillis();
- completedHandshake = true;
- handshakeCount = 0;
+ public boolean completedHandshake(long thisBootID, byte[] data, int
offset, int length, BlockCipher encCipher, byte[] encKey, Peer replyTo, boolean
unverified) {
+ long now = System.currentTimeMillis();
arkFetcher.stop();
- bogusNoderef = false;
- try {
- // First, the new noderef
- processNewNoderef(data, offset, length);
- } catch (FSParseException e1) {
- bogusNoderef = true;
- Logger.error(this, "Failed to parse new noderef for "+this+":
"+e1, e1);
- // Treat as invalid version
- }
- if(reverseInvalidVersion()) {
- try {
-
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(lastGoodVersion));
- } catch (NumberFormatException e) {
- // ignore
- }
- Logger.normal(this, "Not 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);
- verifiedIncompatibleOlderVersion = true;
- isConnected = false;
- setPeerNodeStatus(now);
- node.peers.disconnected(this);
- return false;
- } else {
- verifiedIncompatibleOlderVersion = false;
- setPeerNodeStatus(now);
- }
- KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
- changedIP(replyTo);
- if(thisBootID != this.bootID) {
- connectedTime = System.currentTimeMillis();
- Logger.minor(this, "Changed boot ID from "+bootID+" to
"+thisBootID+" for "+getPeer());
- isConnected = false; // Will be reset below
- setPeerNodeStatus(now);
- if(previousTracker != null) {
- KeyTracker old = previousTracker;
- previousTracker = null;
- old.completelyDeprecated(newTracker);
- }
- previousTracker = null;
- if(currentTracker != null) {
- KeyTracker old = currentTracker;
- currentTracker = null;
- old.completelyDeprecated(newTracker);
- }
- this.bootID = thisBootID;
- node.lm.lostOrRestartedNode(this);
- } // else it's a rekey
-
- if(unverified) {
- unverifiedTracker = newTracker;
- ctx = null;
- Logger.minor(this, "sentHandshake() being called for
unverifiedTracker: "+getPeer());
- sentHandshake();
- } else {
- previousTracker = currentTracker;
- currentTracker = newTracker;
- unverifiedTracker = null;
- if(previousTracker != null)
- previousTracker.deprecated();
- isConnected = true;
- neverConnected = false;
- peerAddedTime = 0; // don't store anymore
- setPeerNodeStatus(now);
- ctx = null;
- }
- 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 {
- receivedPacket(unverified);
- } catch (NotConnectedException e) {
- Logger.error(this, "Disconnected in completedHandshake
with "+this);
- return true; // i suppose
- }
- if(isConnected)
- node.peers.addConnectedPeer(this);
- sentInitialMessages = false;
- return true;
+ synchronized(this) {
+ completedHandshake = true;
+ handshakeCount = 0;
+ bogusNoderef = false;
+ try {
+ // First, the new noderef
+ processNewNoderef(data, offset, length);
+ } catch (FSParseException e1) {
+ bogusNoderef = true;
+ Logger.error(this, "Failed to parse new noderef for
"+this+": "+e1, e1);
+ // Treat as invalid version
+ }
+ if(reverseInvalidVersion()) {
+ try {
+
node.setNewestPeerLastGoodVersion(Version.getArbitraryBuildNumber(lastGoodVersion));
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ Logger.normal(this, "Not 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);
+ verifiedIncompatibleOlderVersion = true;
+ isConnected = false;
+ setPeerNodeStatus(now);
+ node.peers.disconnected(this);
+ return false;
+ } else {
+ verifiedIncompatibleOlderVersion = false;
+ setPeerNodeStatus(now);
+ }
+ KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
+ changedIP(replyTo);
+ if(thisBootID != this.bootID) {
+ connectedTime = System.currentTimeMillis();
+ Logger.minor(this, "Changed boot ID from "+bootID+" to
"+thisBootID+" for "+getPeer());
+ isConnected = false; // Will be reset below
+ setPeerNodeStatus(now);
+ if(previousTracker != null) {
+ KeyTracker old = previousTracker;
+ previousTracker = null;
+ old.completelyDeprecated(newTracker);
+ }
+ previousTracker = null;
+ if(currentTracker != null) {
+ KeyTracker old = currentTracker;
+ currentTracker = null;
+ old.completelyDeprecated(newTracker);
+ }
+ this.bootID = thisBootID;
+ node.lm.lostOrRestartedNode(this);
+ } // else it's a rekey
+
+ if(unverified) {
+ unverifiedTracker = newTracker;
+ ctx = null;
+ Logger.minor(this, "sentHandshake() being called for
unverifiedTracker: "+getPeer());
+ sentHandshake();
+ } else {
+ previousTracker = currentTracker;
+ currentTracker = newTracker;
+ unverifiedTracker = null;
+ if(previousTracker != null)
+ previousTracker.deprecated();
+ isConnected = true;
+ neverConnected = false;
+ peerAddedTime = 0; // don't store anymore
+ setPeerNodeStatus(now);
+ ctx = null;
+ }
+ 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 {
+ receivedPacket(unverified);
+ } catch (NotConnectedException e) {
+ Logger.error(this, "Disconnected in completedHandshake
with "+this);
+ return true; // i suppose
+ }
+ if(isConnected)
+ node.peers.addConnectedPeer(this);
+ sentInitialMessages = false;
+ return true;
+ }
}
boolean sentInitialMessages = false;
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-14 23:17:10 UTC (rev
9204)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-14 23:40:14 UTC (rev
9205)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 813;
+ private static final int buildNumber = 814;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 765;