r26961 - trunk/freenet/src/freenet/client/async

[email protected] Sat, 18 Apr 2009 13:45:11 +0000
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
Author: toad
Date: 2009-04-18 13:45:11 +0000 (Sat, 18 Apr 2009)
New Revision: 26961

Modified:
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/USKManager.java
Log:
Fetch content in temporary background fetcher, hence fix regression.
FIXME: priorities are set to IMMEDIATE_SPLITFILE for easy testing, should be reverted when current changes finished.


Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java	2009-04-18 13:34:54 UTC (rev 26960)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java	2009-04-18 13:45:11 UTC (rev 26961)
@@ -1078,7 +1078,7 @@
 			long edition = context.uskManager.lookupKnownGood(usk);
 			if(edition <= usk.suggestedEdition) {
 				// Background fetch - start background fetch first so can pick up updates in the datastore during registration.
-				context.uskManager.startTemporaryBackgroundFetcher(usk, context);
+				context.uskManager.startTemporaryBackgroundFetcher(usk, context, ctx, true);
 				edition = context.uskManager.lookupKnownGood(usk);
 				if(edition > usk.suggestedEdition) {
 					if(logMINOR) Logger.minor(SingleFileFetcher.class, "Redirecting to edition "+edition);

Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java	2009-04-18 13:34:54 UTC (rev 26960)
+++ trunk/freenet/src/freenet/client/async/USKManager.java	2009-04-18 13:45:11 UTC (rev 26961)
@@ -9,6 +9,11 @@
 import com.db4o.ObjectContainer;
 
 import freenet.client.FetchContext;
+import freenet.client.FetchException;
+import freenet.client.HighLevelSimpleClient;
+import freenet.client.NullClientCallback;
+import freenet.clients.http.FProxyToadlet;
+import freenet.keys.FreenetURI;
 import freenet.keys.USK;
 import freenet.node.NodeClientCore;
 import freenet.node.RequestClient;
@@ -16,6 +21,7 @@
 import freenet.support.Executor;
 import freenet.support.LRUQueue;
 import freenet.support.Logger;
+import freenet.support.io.NullBucket;
 
 /**
  * Tracks the latest version of every known USK.
@@ -45,14 +51,20 @@
 	final LRUQueue<USK> temporaryBackgroundFetchersLRU;
 	
 	final FetchContext backgroundFetchContext;
+	/** This one actually fetches data */
+	final FetchContext realFetchContext;
 	
 	final Executor executor;
 	
 	private ClientContext context;
 	
 	public USKManager(NodeClientCore core) {
-		backgroundFetchContext = core.makeClient(RequestStarter.UPDATE_PRIORITY_CLASS).getFetchContext();
+		HighLevelSimpleClient client = core.makeClient(RequestStarter.UPDATE_PRIORITY_CLASS);
+		client.setMaxIntermediateLength(FProxyToadlet.MAX_LENGTH);
+		client.setMaxLength(FProxyToadlet.MAX_LENGTH);
+		backgroundFetchContext = client.getFetchContext();
 		backgroundFetchContext.followRedirects = false;
+		realFetchContext = client.getFetchContext();
 		latestKnownGoodByClearUSK = new HashMap<USK, Long>();
 		latestSlotByClearUSK = new HashMap<USK, Long>();
 		subscribersByClearUSK = new HashMap<USK, USKCallback[]>();
@@ -114,7 +126,7 @@
 		return getFetcher(usk, persistent ? new FetchContext(backgroundFetchContext, FetchContext.IDENTICAL_MASK, false, null) : backgroundFetchContext, true, client.persistent(), cb, true, container, context);
 	}
 
-	public void startTemporaryBackgroundFetcher(USK usk, ClientContext context) {
+	public void startTemporaryBackgroundFetcher(USK usk, ClientContext context, final FetchContext fctx, boolean prefetchContent) {
 		USK clear = usk.clearCopy();
 		USKFetcher sched = null;
 		Vector<USKFetcher> toCancel = null;
@@ -127,10 +139,41 @@
 //			}
 			USKFetcher f = backgroundFetchersByClearUSK.get(clear);
 			if(f == null) {
-				f = new USKFetcher(usk, this, backgroundFetchContext, new USKFetcherWrapper(usk, RequestStarter.UPDATE_PRIORITY_CLASS, this), 3, false, false);
+				f = new USKFetcher(usk, this, backgroundFetchContext, new USKFetcherWrapper(usk, RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS, this), 3, false, false);
 				sched = f;
 				backgroundFetchersByClearUSK.put(clear, f);
 			}
+			if(prefetchContent)
+				f.addCallback(new USKFetcherCallback() {
+
+					public void onCancelled(ObjectContainer container, ClientContext context) {
+						// Ok
+					}
+
+					public void onFailure(ObjectContainer container, ClientContext context) {
+						// Ok
+					}
+
+					public void onFoundEdition(long l, USK key, ObjectContainer container, ClientContext context, boolean metadata, short codec, byte[] data, boolean newKnownGood, boolean newSlotToo) {
+						FreenetURI uri = key.copy(l).getURI();
+						final ClientGetter get = new ClientGetter(new NullClientCallback(), uri, new FetchContext(fctx, FetchContext.IDENTICAL_MASK, false, null), RequestStarter.UPDATE_PRIORITY_CLASS, USKManager.this, new NullBucket(), null);
+						try {
+							get.start(null, context);
+						} catch (FetchException e) {
+							// Ignore
+						}
+					}
+
+					public short getPollingPriorityNormal() {
+						return RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS;
+					}
+
+					public short getPollingPriorityProgress() {
+						return RequestStarter.IMMEDIATE_SPLITFILE_PRIORITY_CLASS;
+					}
+					
+					
+				});
 			temporaryBackgroundFetchersLRU.push(clear);
 			while(temporaryBackgroundFetchersLRU.size() > NodeClientCore.maxBackgroundUSKFetchers) {
 				USK del = temporaryBackgroundFetchersLRU.pop();