r27126 - in trunk/freenet/src/freenet: client/async client/events node/fcp

[email protected] Mon, 20 Apr 2009 23:08:21 +0000
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
Author: toad
Date: 2009-04-20 23:08:21 +0000 (Mon, 20 Apr 2009)
New Revision: 27126

Added:
   trunk/freenet/src/freenet/client/events/SendingToNetworkEvent.java
   trunk/freenet/src/freenet/node/fcp/SendingToNetworkMessage.java
Modified:
   trunk/freenet/src/freenet/client/async/BaseManifestPutter.java
   trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/ClientGetter.java
   trunk/freenet/src/freenet/client/async/ClientPutter.java
   trunk/freenet/src/freenet/client/async/ClientRequester.java
   trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java
   trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
   trunk/freenet/src/freenet/client/async/USKFetcher.java
   trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
   trunk/freenet/src/freenet/client/async/USKRetriever.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
Log:
New progress event/message: SendingToNetworkEvent, SendingToNetworkMessage
Sent when we realise that we won't be able to fetch every block from the datastore.


Modified: trunk/freenet/src/freenet/client/async/BaseManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseManifestPutter.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/BaseManifestPutter.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -611,6 +611,11 @@
 			return super.toString();
 		}
 
+		@Override
+		protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+			// Ignore
+		}
+
 	}
 
 	// if true top level metadata is a container
@@ -1863,5 +1868,11 @@
 			currentDir = dirStack.pop();
 		}
 	}
+	
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		// Ignore
+	}
+
 }
 

Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -354,7 +354,13 @@
 	
 	@Override
 	public void preRegister(ObjectContainer container, ClientContext context, boolean toNetwork) {
-		// Ignore
+		boolean deactivate = false;
+		if(persistent) {
+			deactivate = !container.ext().isActive(parent);
+			container.activate(parent, 1);
+		}
+		parent.toNetwork(container, context);
+		if(deactivate) container.deactivate(parent, 1);
 	}
 
 }

Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -15,6 +15,7 @@
 import freenet.client.FetchContext;
 import freenet.client.FetchException;
 import freenet.client.FetchResult;
+import freenet.client.events.SendingToNetworkEvent;
 import freenet.client.events.SplitfileProgressEvent;
 import freenet.keys.ClientKeyBlock;
 import freenet.keys.FreenetURI;
@@ -311,6 +312,15 @@
 		}
 		ctx.eventProducer.produceEvent(new SplitfileProgressEvent(this.totalBlocks, this.successfulBlocks, this.failedBlocks, this.fatallyFailedBlocks, this.minSuccessBlocks, this.blockSetFinalized), container, context);
 	}
+	
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		if(persistent()) {
+			container.activate(ctx, 1);
+			container.activate(ctx.eventProducer, 1);
+		}
+		ctx.eventProducer.produceEvent(new SendingToNetworkEvent(), container, context);
+	}
 
 	public void onBlockSetFinished(ClientGetState state, ObjectContainer container, ClientContext context) {
 		if(logMINOR)

Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientPutter.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/ClientPutter.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -12,6 +12,7 @@
 import freenet.client.InsertContext;
 import freenet.client.InsertException;
 import freenet.client.Metadata;
+import freenet.client.events.SendingToNetworkEvent;
 import freenet.client.events.SplitfileProgressEvent;
 import freenet.keys.BaseClientKey;
 import freenet.keys.FreenetURI;
@@ -318,6 +319,15 @@
 		ctx.eventProducer.produceEvent(new SplitfileProgressEvent(this.totalBlocks, this.successfulBlocks, this.failedBlocks, this.fatallyFailedBlocks, this.minSuccessBlocks, this.blockSetFinalized), container, context);
 	}
 	
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		if(persistent()) {
+			container.activate(ctx, 1);
+			container.activate(ctx.eventProducer, 1);
+		}
+		ctx.eventProducer.produceEvent(new SendingToNetworkEvent(), container, context);
+	}
+
 	public void onBlockSetFinished(ClientPutState state, ObjectContainer container, ClientContext context) {
 		if(Logger.shouldLog(Logger.MINOR, this))
 			Logger.minor(this, "Set finished", new Exception("debug"));

Modified: trunk/freenet/src/freenet/client/async/ClientRequester.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequester.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/ClientRequester.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -87,6 +87,7 @@
 	protected int minSuccessBlocks;
 	/** Has totalBlocks stopped growing? */
 	protected boolean blockSetFinalized;
+	protected boolean sentToNetwork;
 
 	public void blockSetFinalized(ObjectContainer container, ClientContext context) {
 		synchronized(this) {
@@ -171,6 +172,17 @@
 	}
 
 	public abstract void notifyClients(ObjectContainer container, ClientContext context);
+	
+	public void toNetwork(ObjectContainer container, ClientContext context) {
+		synchronized(this) {
+			if(sentToNetwork) return;
+			sentToNetwork = true;
+			if(persistent()) container.store(this);
+		}
+		innerToNetwork(container, context);
+	}
+	
+	protected abstract void innerToNetwork(ObjectContainer container, ClientContext context);
 
 	/** Get client context object */
 	public RequestClient getClient() {

Modified: trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -137,6 +137,11 @@
 	public void onTransition(ClientGetState oldState, ClientGetState newState, ObjectContainer container) {
 		// Ignore
 	}
+	
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		// Ignore
+	}
 
 	@Override
 	public void cancel(ObjectContainer container, ClientContext context) {

Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -507,6 +507,11 @@
 			return true;
 		}
 
+		@Override
+		protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+			// Ignore
+		}
+
 	}
 
 	private HashMap<String,Object> putHandlersByName;
@@ -1771,5 +1776,11 @@
 		}
 		putHandlersByName2.put(name, ph);
 	}
+	
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		// Ignore
+	}
+
 }
 

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -866,7 +866,13 @@
 	
 	@Override
 	public void preRegister(ObjectContainer container, ClientContext context, boolean toNetwork) {
-		// Ignore
+		boolean deactivate = false;
+		if(persistent) {
+			deactivate = !container.ext().isActive(parent);
+			container.activate(parent, 1);
+		}
+		parent.toNetwork(container, context);
+		if(deactivate) container.deactivate(parent, 1);
 	}
 
 }

Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -819,6 +819,8 @@
 					checkedDatastoreUpTo = lastCheck;
 				}
 				if(logMINOR) Logger.minor(this, "Checked datastore, finishing registration for "+attempts.length+" checkers for "+USKFetcher.this+" for "+origUSK);
+				if(attempts.length > 0)
+					parent.toNetwork(container, context);
 				for(int i=0;i<attempts.length;i++) {
 					long lastEd = uskManager.lookupLatestSlot(origUSK);
 					// FIXME not sure this condition works, test it!

Modified: trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -76,4 +76,9 @@
 	public void cancel(ObjectContainer container, ClientContext context) {
 		super.cancel();
 	}
+
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		// Ignore
+	}
 }

Modified: trunk/freenet/src/freenet/client/async/USKRetriever.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKRetriever.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/client/async/USKRetriever.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -123,4 +123,9 @@
 		super.cancel();
 	}
 
+	@Override
+	protected void innerToNetwork(ObjectContainer container, ClientContext context) {
+		// Ignore
+	}
+
 }

Added: trunk/freenet/src/freenet/client/events/SendingToNetworkEvent.java
===================================================================
--- trunk/freenet/src/freenet/client/events/SendingToNetworkEvent.java	                        (rev 0)
+++ trunk/freenet/src/freenet/client/events/SendingToNetworkEvent.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -0,0 +1,15 @@
+package freenet.client.events;
+
+public class SendingToNetworkEvent implements ClientEvent {
+	
+	final static int CODE = 0x0A;
+
+	public int getCode() {
+		return CODE;
+	}
+
+	public String getDescription() {
+		return "Sending to network";
+	}
+
+}

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java	2009-04-20 22:31:47 UTC (rev 27125)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -22,6 +22,7 @@
 import freenet.client.async.DBJob;
 import freenet.client.events.ClientEvent;
 import freenet.client.events.ClientEventListener;
+import freenet.client.events.SendingToNetworkEvent;
 import freenet.client.events.SplitfileProgressEvent;
 import freenet.keys.FreenetURI;
 import freenet.support.Fields;
@@ -54,6 +55,7 @@
 
 	// Verbosity bitmasks
 	private int VERBOSITY_SPLITFILE_PROGRESS = 1;
+	private int VERBOSITY_SENT_TO_NETWORK = 2;
 
 	// Stuff waiting for reconnection
 	/** Did the request succeed? Valid if finished. */
@@ -72,6 +74,8 @@
 	/** Last progress message. Not persistent - FIXME this will be made persistent
 	 * when we have proper persistence at the ClientGetter level. */
 	private SimpleProgressMessage progressPending;
+	/** Have we received a SendingToNetworkEvent? */
+	private boolean sentToNetwork;
 
 	/**
 	 * Create one for a global-queued request not made by FCP.
@@ -499,10 +503,13 @@
 		handler.queue(msg);
 	}
 
-	private void trySendProgress(SimpleProgressMessage msg, FCPConnectionOutputHandler handler, ObjectContainer container) {
+	private void trySendProgress(FCPMessage msg, FCPConnectionOutputHandler handler, ObjectContainer container) {
 		if(persistenceType != ClientRequest.PERSIST_CONNECTION) {
 			FCPMessage oldProgress = progressPending;
-			progressPending = msg;
+			if(msg instanceof SimpleProgressMessage)
+				progressPending = (SimpleProgressMessage)msg;
+			else if(msg instanceof SendingToNetworkMessage)
+				sentToNetwork = true;
 			if(persistenceType == ClientRequest.PERSIST_FOREVER) {
 				container.store(this);
 				if(oldProgress != null) {
@@ -539,6 +546,8 @@
 					container.activate(progressPending, 5);
 				handler.queue(progressPending);
 			}
+			if(sentToNetwork)
+				handler.queue(new SendingToNetworkMessage(identifier, global));
 			if(finished)
 				trySendDataFoundOrGetFailed(handler, container);
 		}
@@ -659,11 +668,18 @@
 	public void receive(ClientEvent ce, ObjectContainer container, ClientContext context) {
 		// Don't need to lock, verbosity is final and finished is never unset.
 		if(finished) return;
-		if(!(((verbosity & VERBOSITY_SPLITFILE_PROGRESS) == VERBOSITY_SPLITFILE_PROGRESS) &&
-				(ce instanceof SplitfileProgressEvent)))
-			return;
-		final SimpleProgressMessage progress =
-			new SimpleProgressMessage(identifier, global, (SplitfileProgressEvent)ce);
+		final FCPMessage progress;
+		if(ce instanceof SplitfileProgressEvent) {
+			if(!((verbosity & VERBOSITY_SPLITFILE_PROGRESS) == VERBOSITY_SPLITFILE_PROGRESS))
+				return;
+			progress =
+				new SimpleProgressMessage(identifier, global, (SplitfileProgressEvent)ce);
+		} else if(ce instanceof SendingToNetworkEvent) {
+			if(!((verbosity & VERBOSITY_SENT_TO_NETWORK) == VERBOSITY_SENT_TO_NETWORK))
+				return;
+			progress = new SendingToNetworkMessage(identifier, global);
+		}
+		else return; // Don't know what to do with event
 		// container may be null...
 		if(persistenceType == PERSIST_FOREVER && container == null) {
 			context.jobRunner.queue(new DBJob() {

Added: trunk/freenet/src/freenet/node/fcp/SendingToNetworkMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SendingToNetworkMessage.java	                        (rev 0)
+++ trunk/freenet/src/freenet/node/fcp/SendingToNetworkMessage.java	2009-04-20 23:08:21 UTC (rev 27126)
@@ -0,0 +1,43 @@
+package freenet.node.fcp;
+
+import com.db4o.ObjectContainer;
+
+import freenet.node.Node;
+import freenet.support.SimpleFieldSet;
+
+public class SendingToNetworkMessage extends FCPMessage {
+
+	public static String NAME = "SendingToNetwork";
+	final String identifier;
+	final boolean global;
+	
+	public SendingToNetworkMessage(String id, boolean global2) {
+		this.identifier = id;
+		this.global = global2;
+	}
+
+	@Override
+	public SimpleFieldSet getFieldSet() {
+		SimpleFieldSet fs = new SimpleFieldSet(true);
+		fs.putSingle("Identifier", identifier);
+		fs.put("Global", global);
+		return fs;
+	}
+
+	@Override
+	public String getName() {
+		return NAME;
+	}
+
+	@Override
+	public void removeFrom(ObjectContainer container) {
+		container.delete(this);
+	}
+
+	@Override
+	public void run(FCPConnectionHandler handler, Node node)
+			throws MessageInvalidException {
+		// Not possible
+	}
+
+}