[freenet-cvs] r13518 - in trunk/freenet/src/freenet/node: . updater

toad at freenetproject.org toad at freenetproject.org
Mon Jun 11 19:05:58 UTC 2007


Author: toad
Date: 2007-06-11 19:05:58 +0000 (Mon, 11 Jun 2007)
New Revision: 13518

Modified:
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
   trunk/freenet/src/freenet/node/updater/NodeUpdater.java
   trunk/freenet/src/freenet/node/updater/RevocationChecker.java
Log:
Send UOMAnnounce at appropriate times. Not broadcast on startup, but is sent on connect if there is anything interesting to say. Is also sent when major developments occur i.e. when we find the jar, when we have 3 consecutive DNFs on the revocation fetch, etc.

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java	2007-06-11 18:43:31 UTC (rev 13517)
+++ trunk/freenet/src/freenet/node/PeerNode.java	2007-06-11 19:05:58 UTC (rev 13518)
@@ -1650,6 +1650,9 @@
         } catch (NotConnectedException e) {
             Logger.error(this, "Completed handshake with "+getPeer()+" but disconnected ("+isConnected+ ':' +currentTracker+"!!!: "+e, e);
         }
+        
+        if(node.nodeUpdater != null)
+        	node.nodeUpdater.maybeSendUOMAnnounce(this);
     }
     
     private void sendIPAddressMessage() {

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java	2007-06-11 18:43:31 UTC (rev 13517)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java	2007-06-11 19:05:58 UTC (rev 13518)
@@ -11,10 +11,12 @@
 import freenet.config.SubConfig;
 import freenet.io.comm.DMT;
 import freenet.io.comm.Message;
+import freenet.io.comm.NotConnectedException;
 import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
 import freenet.node.Node;
 import freenet.node.NodeStarter;
+import freenet.node.PeerNode;
 import freenet.node.Version;
 import freenet.node.updater.UpdateDeployContext.UpdateCatastropheException;
 import freenet.node.useralerts.RevocationKeyFoundUserAlert;
@@ -53,7 +55,8 @@
 	final boolean shouldUpdateExt;
 	/** Currently deploying an update? */
 	boolean isDeployingUpdate;
-	boolean started;
+	final Object broadcastUOMAnnouncesSync = new Object();
+	boolean broadcastUOMAnnounces = false;
 	
 	Node node;
 	
@@ -136,18 +139,19 @@
 
 	public void start() throws InvalidConfigValueException {
 		
-		Message msg = getUOMAnnouncement();
-		node.peers.localBroadcast(msg, true);
-		
-		synchronized(this) {
-			started = true;
-		}
-		
 		node.clientCore.alerts.register(alert);
         
         enable(wasEnabledOnStartup);
 	}
 	
+	void broadcastUOMAnnounces() {
+		synchronized(broadcastUOMAnnouncesSync) {
+			Message msg = getUOMAnnouncement();
+			node.peers.localBroadcast(msg, true);
+			broadcastUOMAnnounces = true;
+		}
+	}
+
 	private Message getUOMAnnouncement() {
 		return DMT.createUOMAnnounce(updateURI.toString(), extURI.toString(), revocationURI.toString(), hasBeenBlown, 
 				mainUpdater == null ? -1 : mainUpdater.getFetchedVersion(),
@@ -159,6 +163,20 @@
 				(int)node.nodeStats.getNodeAveragePingTime(), (int)node.nodeStats.getBwlimitDelayTime());
 	}
 
+	public void maybeSendUOMAnnounce(PeerNode peer) {
+		synchronized(broadcastUOMAnnouncesSync) {
+			if(!broadcastUOMAnnounces) return; // because of sync object, haven't entered block yet, so will send to this peer
+		}
+		synchronized(this) {
+			if((!hasBeenBlown) && (mainUpdater == null || mainUpdater.getFetchedVersion() <= 0)) return;
+		}
+		try {
+			peer.sendAsync(getUOMAnnouncement(), null, 0, null);
+		} catch (NotConnectedException e) {
+			// Sad, but ignore it
+		}
+	}
+	
 	/**
 	 * Is auto-update enabled?
 	 */
@@ -518,7 +536,7 @@
 	 * Called when a new jar has been downloaded.
 	 * @param isExt If true, the new jar is the ext jar; if false, it is the main jar.
 	 */
-	void onDownloadedNewJar(boolean isExt) {
+	void onDownloadedNewJar(boolean isExt, boolean isNew) {
 		synchronized(this) {
 			if(isExt) {
 				hasNewExtJar = true;
@@ -529,6 +547,8 @@
 			}
 		}
 		revocationChecker.start(true);
+		if(!isAutoUpdateAllowed)
+			broadcastUOMAnnounces();
 	}
 
 	/**
@@ -580,6 +600,7 @@
 			// we don't need to advertize updates : we are not going to do them
 			killUpdateAlerts();
 		}
+		broadcastUOMAnnounces();
 	}
 
 	/**
@@ -593,6 +614,7 @@
 	public void noRevocationFound() {
 		deployUpdate(); // May have been waiting for the revocation.
 		// If we're still here, we didn't update.
+		broadcastUOMAnnounces();
 		node.ps.queueTimedJob(new Runnable() {
 			public void run() {
 				revocationChecker.start(false);

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdater.java	2007-06-11 18:43:31 UTC (rev 13517)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdater.java	2007-06-11 19:05:58 UTC (rev 13518)
@@ -178,6 +178,7 @@
 	
 	public void onSuccess(FetchResult result, ClientGetter state) {
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
+		boolean isNew;
 		synchronized(this) {
 			if(result == null || result.asBucket() == null || result.asBucket().size() == 0) {
 				tempBlobFile.delete();
@@ -206,9 +207,9 @@
 			this.cg = null;
 			if(this.result != null) this.result.asBucket().free();
 			this.result = result;
-			if(fetchedVersion <= currentVersion) return;
+			isNew = (fetchedVersion > currentVersion);
 		}
-		manager.onDownloadedNewJar(extUpdate);
+		manager.onDownloadedNewJar(extUpdate, isNew);
 	}
 
 	public void onFailure(FetchException e, ClientGetter state) {

Modified: trunk/freenet/src/freenet/node/updater/RevocationChecker.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/RevocationChecker.java	2007-06-11 18:43:31 UTC (rev 13517)
+++ trunk/freenet/src/freenet/node/updater/RevocationChecker.java	2007-06-11 19:05:58 UTC (rev 13518)
@@ -131,15 +131,7 @@
 	public void onSuccess(FetchResult result, ClientGetter state) {
 		// The key has been blown !
 		// FIXME: maybe we need a bigger warning message.
-		if(!tmpBlobFile.renameTo(blobFile)) {
-			blobFile.delete();
-			if(!tmpBlobFile.renameTo(blobFile)) {
-				Logger.error(this, "Not able to rename binary blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able to tell other peers about this revocation");
-				System.err.println("Not able to rename binary blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able to tell other peers about this revocation");
-			}
-		}
-		if(tmpBlobFile != null)
-			tmpBlobFile.renameTo(blobFile);
+		moveBlob();
 		String msg = null;
 		try {
 			byte[] buf = result.asByteArray();
@@ -157,6 +149,18 @@
 		manager.blow(msg);
 	}
 
+	private void moveBlob() {
+		if(!tmpBlobFile.renameTo(blobFile)) {
+			blobFile.delete();
+			if(!tmpBlobFile.renameTo(blobFile)) {
+				Logger.error(this, "Not able to rename binary blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able to tell other peers about this revocation");
+				System.err.println("Not able to rename binary blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able to tell other peers about this revocation");
+			}
+		}
+		if(tmpBlobFile != null)
+			tmpBlobFile.renameTo(blobFile);
+	}
+
 	public void onFailure(FetchException e, ClientGetter state) {
 		Logger.minor(this, "Revocation fetch failed: "+e);
 		if(tmpBlobFile != null) tmpBlobFile.delete();
@@ -167,6 +171,7 @@
 		if(errorCode == FetchException.CANCELLED) return; // cancelled by us above, or killed; either way irrelevant and doesn't need to be restarted
 		if(e.isFatal()) {
 			manager.blow("Permanent error fetching revocation (error inserting the revocation key?): "+e.toString());
+			moveBlob(); // other peers need to know
 			return;
 		}
 		if(e.newURI != null) {




More information about the cvs mailing list