[freenet-cvs] r20902 - in branches/db4o/freenet/src/freenet: client/async node

toad at freenetproject.org toad at freenetproject.org
Tue Jul 1 12:16:03 UTC 2008


Author: toad
Date: 2008-07-01 12:16:03 +0000 (Tue, 01 Jul 2008)
New Revision: 20902

Modified:
   branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
   branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
   branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
   branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
   branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
   branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
   branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
   branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
   branches/db4o/freenet/src/freenet/client/async/USKInserter.java
   branches/db4o/freenet/src/freenet/client/async/USKManager.java
   branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
   branches/db4o/freenet/src/freenet/node/SendableGet.java
   branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
Log:
When registering a big (multi-segment) splitfile, add the RegisterMe and schedule each segment as a separate job.
On a large splitfile (ISO size), we were getting *very* long stalls while every block in the splitfile was addPendingKeys()'ed.

Modified: branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -95,7 +95,7 @@
 				}
 				return true; // We will retry, just not yet. See requeueAfterCooldown(Key).
 			} else {
-				schedule(container, context, true);
+				schedule(container, context, false, true);
 			}
 			return true;
 		}
@@ -199,7 +199,7 @@
 		}
 		if(Logger.shouldLog(Logger.MINOR, this))
 			Logger.minor(this, "Requeueing after cooldown "+key+" for "+this);
-		schedule(container, context, true);
+		schedule(container, context, false, true);
 	}
 	
 }

Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetState.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetState.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -11,7 +11,7 @@
  */
 public interface ClientGetState {
 
-	public void schedule(ObjectContainer container, ClientContext context, boolean probablyNotInStore);
+	public void schedule(ObjectContainer container, ClientContext context, boolean delayedRegister, boolean probablyNotInStore);
 
 	public void cancel(ObjectContainer container, ClientContext context);
 

Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetter.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetter.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -113,7 +113,7 @@
 						return false;
 					}
 				}
-				currentState.schedule(container, context, false);
+				currentState.schedule(container, context, false, false);
 			}
 			if(cancelled) cancel();
 		} catch (MalformedURLException e) {

Modified: branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -155,14 +155,14 @@
 		choosenPriorityScheduler = val;
 	}
 	
-	public void register(final SendableRequest req, boolean probablyNotInStore) {
-		register(req, databaseExecutor.onThread(), null, probablyNotInStore);
+	public void register(final SendableRequest req, boolean regmeOnly, boolean probablyNotInStore) {
+		register(req, databaseExecutor.onThread(), regmeOnly, null, probablyNotInStore);
 	}
 	
 	/**
 	 * Register and then delete the RegisterMe which is passed in to avoid querying.
 	 */
-	public void register(final SendableRequest req, boolean onDatabaseThread, RegisterMe reg, final boolean probablyNotInStore) {
+	public void register(final SendableRequest req, boolean onDatabaseThread, final boolean regmeOnly, RegisterMe reg, final boolean probablyNotInStore) {
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
 		if(logMINOR) Logger.minor(this, "Registering "+req, new Exception("debug"));
 		final boolean persistent = req.persistent();
@@ -172,6 +172,19 @@
 			final SendableGet getter = (SendableGet)req;
 			
 			if(persistent && onDatabaseThread) {
+				if(regmeOnly) {
+					assert(reg == null);
+					reg = schedCore.queueRegister(getter, databaseExecutor, selectorContainer);
+					final RegisterMe regme = reg;
+					clientContext.jobRunner.queue(new DBJob() {
+
+						public void run(ObjectContainer container, ClientContext context) {
+							register(req, true, false, regme, probablyNotInStore);
+						}
+						
+					}, NativeThread.NORM_PRIORITY+1, false);
+					return;
+				}
 				schedCore.addPendingKeys(getter, selectorContainer);
 				final Object[] keyTokens = getter.sendableKeys(selectorContainer);
 				final ClientKey[] keys = new ClientKey[keyTokens.length];

Modified: branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -530,7 +530,7 @@
 					Logger.minor(this, "Running RegisterMe for "+reg.getter+" : "+reg.key.addedTime+" : "+reg.key.priority);
 				// Don't need to activate, fields should exist? FIXME
 				try {
-					sched.register(reg.getter, true, reg, false);
+					sched.register(reg.getter, true, false, reg, false);
 				} catch (Throwable t) {
 					Logger.error(this, "Caught "+t+" running RegisterMeRunner", t);
 					// Cancel the request, and commit so it isn't tried again.

Modified: branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -199,7 +199,7 @@
 		}
 		if(persistent)
 			container.set(this);
-		getScheduler(context).register(this, false);
+		getScheduler(context).register(this, false, false);
 	}
 
 	private void fail(InsertException e, ObjectContainer container, ClientContext context) {
@@ -263,7 +263,7 @@
 			if(persistent)
 				container.set(this);
 		} else {
-			getScheduler(context).register(this, false);
+			getScheduler(context).register(this, false, false);
 		}
 	}
 

Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -522,7 +522,7 @@
 					f.addDecompressor(codec);
 				}
 				parent.onTransition(this, f, container);
-				f.schedule(container, context, false);
+				f.schedule(container, context, false, false);
 				if(persistent) {
 					container.set(metaStrings);
 					container.set(this);
@@ -599,7 +599,7 @@
 				SplitFileFetcher sf = new SplitFileFetcher(metadata, rcb, parent, ctx, 
 						decompressors, clientMetadata, actx, recursionLevel, returnBucket, token, container);
 				parent.onTransition(this, sf, container);
-				sf.schedule(container, context, false);
+				sf.schedule(container, context, false, false);
 				rcb.onBlockSetFinished(this, container, context);
 				// Clear our own metadata, we won't need it any more.
 				// For multi-level metadata etc see above.
@@ -925,7 +925,7 @@
 				if(l == usk.suggestedEdition) {
 					SingleFileFetcher sf = new SingleFileFetcher(parent, cb, clientMetadata, key, metaStrings, key.getURI().addMetaStrings(metaStrings),
 							0, ctx, actx, null, null, maxRetries, recursionLevel+1, dontTellClientGet, token, false, returnBucket, true, container, context);
-					sf.schedule(container, context, false);
+					sf.schedule(container, context, false, false);
 				} else {
 					cb.onFailure(new FetchException(FetchException.PERMANENT_REDIRECT, newUSK.getURI().addMetaStrings(metaStrings)), null, container, context);
 				}

Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -326,12 +326,14 @@
 		}
 	}
 
-	public void schedule(ObjectContainer container, ClientContext context, boolean probablyNotInStore) {
+	public void schedule(ObjectContainer container, ClientContext context, boolean regmeOnly, boolean probablyNotInStore) {
 		if(persistent)
 			container.activate(this, 1);
+		if(segments.length > 1)
+			regmeOnly = true;
 		if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this, "Scheduling "+this);
 		for(int i=0;i<segments.length;i++) {
-			segments[i].schedule(container, context, probablyNotInStore);
+			segments[i].schedule(container, context, true, probablyNotInStore);
 		}
 	}
 

Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -621,7 +621,7 @@
 		parentFetcher.segmentFinished(this, container, context);
 	}
 
-	public void schedule(ObjectContainer container, ClientContext context, boolean probablyNotInStore) {
+	public void schedule(ObjectContainer container, ClientContext context, boolean regmeOnly, boolean probablyNotInStore) {
 		if(persistent) {
 			container.activate(this, 1);
 			container.activate(parentFetcher, 1);
@@ -634,7 +634,7 @@
 			for(int i=0;i<dataRetries.length+checkRetries.length;i++)
 				seg.add(i, true, container, context, false);
 			
-			seg.schedule(container, context, probablyNotInStore);
+			seg.schedule(container, context, regmeOnly, probablyNotInStore);
 			synchronized(this) {
 				scheduled = true;
 			}
@@ -811,13 +811,13 @@
 				SplitFileFetcherSubSegment sub = (SplitFileFetcherSubSegment) v.get(i);
 				RandomGrabArray rga = sub.getParentGrabArray();
 				if(sub.getParentGrabArray() == null) {
-					sub.schedule(container, context, true);
+					sub.schedule(container, context, false, true);
 				} else {
 //					if(logMINOR) {
 						container.activate(rga, 1);
 						if(!rga.contains(sub, container)) {
 							Logger.error(this, "Sub-segment has RGA but isn't registered to it!!: "+sub+" for "+rga);
-							sub.schedule(container, context, true);
+							sub.schedule(container, context, false, true);
 						}
 						container.deactivate(rga, 1);
 //					}

Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -456,7 +456,7 @@
 		}
 		if(persistent)
 			container.set(blockNums);
-		if(schedule) schedule(container, context, true); // Retrying so not in store
+		if(schedule) schedule(container, context, false, true); // Retrying so not in store
 		else if(!dontSchedule)
 			// Already scheduled, however this key may not be registered.
 			getScheduler(context).addPendingKey(segment.getBlockKey(blockNo, container), this);

Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcher.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcher.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -159,7 +159,7 @@
 				if(logMINOR)
 					Logger.minor(this, "Checker == null in schedule() for "+this, new Exception("debug"));
 			} else
-				checker.schedule(container, context, false);
+				checker.schedule(container, context, false, false);
 		}
 		
 		public String toString() {
@@ -469,17 +469,17 @@
 	public void schedule(long delay, ObjectContainer container, final ClientContext context) {
 		assert(container == null);
 		if (delay<=0) {
-			schedule(container, context, false);
+			schedule(container, context, false, false);
 		} else {
 			uskManager.ticker.queueTimedJob(new Runnable() {
 				public void run() {
-					USKFetcher.this.schedule(null, context, false);
+					USKFetcher.this.schedule(null, context, false, false);
 				}
 			}, delay);
 		}
 	}
     
-	public void schedule(ObjectContainer container, ClientContext context, boolean probablyNotInStore) {
+	public void schedule(ObjectContainer container, ClientContext context, boolean regmeOnly, boolean probablyNotInStore) {
 		USKAttempt[] attempts;
 		long lookedUp = uskManager.lookup(origUSK);
 		synchronized(this) {

Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -91,7 +91,7 @@
 			usk = usk.copy(edition);
 		fetcher = manager.getFetcher(usk, ctx, new USKFetcherWrapper(usk, priority, client), keepLastData);
 		fetcher.addCallback(this);
-		fetcher.schedule(null, context, false); // non-persistent
+		fetcher.schedule(null, context, false, false); // non-persistent
 	}
 
 	public void cancel(ObjectContainer container, ClientContext context) {
@@ -118,7 +118,7 @@
 		return token;
 	}
 
-	public void schedule(ObjectContainer container, ClientContext context, boolean probablyNotInStore) {
+	public void schedule(ObjectContainer container, ClientContext context, boolean regmeOnly, boolean probablyNotInStore) {
 		start(context.uskManager, context);
 	}
 

Modified: branches/db4o/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKInserter.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/USKInserter.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -78,7 +78,7 @@
 			if(finished) return;
 			fetcher = context.uskManager.getFetcherForInsertDontSchedule(pubUSK, parent.priorityClass, this, parent.getClient(), container, context);
 		}
-		fetcher.schedule(container, context, false);
+		fetcher.schedule(container, context, false, false);
 	}
 
 	public void onFoundEdition(long l, USK key, ObjectContainer container, ClientContext context, boolean lastContentWasMetadata, short codec, byte[] hisData) {

Modified: branches/db4o/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKManager.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/USKManager.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -140,7 +140,7 @@
 				fetcher.cancel(null, context);
 			}
 		}
-		if(sched != null) sched.schedule(null, context, false);
+		if(sched != null) sched.schedule(null, context, false, false);
 	}
 	
 	void update(final USK origUSK, final long number, final ClientContext context) {
@@ -216,7 +216,7 @@
 		if(fetcher != null) {
 			ticker.queueTimedJob(new Runnable() {
 				public void run() {
-					fetcher.schedule(null, context, false);
+					fetcher.schedule(null, context, false, false);
 				}
 			}, 0);
 		}

Modified: branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKRetriever.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/client/async/USKRetriever.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -48,7 +48,7 @@
 			SingleFileFetcher getter =
 				(SingleFileFetcher) SingleFileFetcher.create(this, this, new ClientMetadata(), uri, ctx, new ArchiveContext(ctx.maxArchiveLevels), 
 						ctx.maxNonSplitfileRetries, 0, true, l, true, null, false, null, context);
-			getter.schedule(null, context, false);
+			getter.schedule(null, context, false, false);
 		} catch (MalformedURLException e) {
 			Logger.error(this, "Impossible: "+e, e);
 		} catch (FetchException e) {

Modified: branches/db4o/freenet/src/freenet/node/SendableGet.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SendableGet.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/node/SendableGet.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -99,10 +99,10 @@
 		return true;
 	}
 
-	public void schedule(ObjectContainer container, ClientContext context, boolean assumeNotInStore) {
+	public void schedule(ObjectContainer container, ClientContext context, boolean regmeOnly, boolean assumeNotInStore) {
 		if(Logger.shouldLog(Logger.MINOR, this))
 			Logger.minor(this, "Scheduling "+this);
-		getScheduler(context).register(this, assumeNotInStore);
+		getScheduler(context).register(this, regmeOnly, assumeNotInStore);
 	}
 	
 	public ClientRequestScheduler getScheduler(ClientContext context) {

Modified: branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java	2008-07-01 11:24:59 UTC (rev 20901)
+++ branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java	2008-07-01 12:16:03 UTC (rev 20902)
@@ -110,7 +110,7 @@
 
 	public void schedule() {
 		finished = false; // can reschedule
-		scheduler.register(this, false);
+		scheduler.register(this, false, false);
 	}
 
 	public void cancel(ObjectContainer container, ClientContext context) {




More information about the cvs mailing list