Author: toad
Date: 2008-06-30 22:35:30 +0000 (Mon, 30 Jun 2008)
New Revision: 20879

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:
Finish registration immediately if retrying, rather than waiting for datastore 
checks to complete.
Improves efficiency: parent grab array gets set, so we don't add the same N 
blocks over and over again to the pending keys list.

Modified: 
branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java   
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java   
2008-06-30 22:35:30 UTC (rev 20879)
@@ -96,7 +96,7 @@
                                }
                                return true; // We will retry, just not yet. 
See requeueAfterCooldown(Key).
                        } else {
-                               schedule(container, context);
+                               schedule(container, context, true);
                        }
                        return true;
                }
@@ -192,7 +192,7 @@
                }
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Requeueing after cooldown "+key+" 
for "+this);
-               schedule(container, context);
+               schedule(container, context, true);
        }

 }

Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetState.java  
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetState.java  
2008-06-30 22:35:30 UTC (rev 20879)
@@ -11,7 +11,7 @@
  */
 public interface ClientGetState {

-       public void schedule(ObjectContainer container, ClientContext context);
+       public void schedule(ObjectContainer container, ClientContext context, 
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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetter.java    
2008-06-30 22:35:30 UTC (rev 20879)
@@ -113,7 +113,7 @@
                                                return false;
                                        }
                                }
-                               currentState.schedule(container, context);
+                               currentState.schedule(container, context, 
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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-06-30 22:35:30 UTC (rev 20879)
@@ -155,14 +155,14 @@
                choosenPriorityScheduler = val;
        }

-       public void register(final SendableRequest req) {
-               register(req, databaseExecutor.onThread(), null);
+       public void register(final SendableRequest req, boolean 
probablyNotInStore) {
+               register(req, databaseExecutor.onThread(), 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) {
+       public void register(final SendableRequest req, boolean 
onDatabaseThread, 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();
@@ -173,11 +173,21 @@

                        if(persistent && onDatabaseThread) {
                                schedCore.addPendingKeys(getter, 
selectorContainer);
-                               if(reg == null)
-                                       reg = schedCore.queueRegister(getter, 
databaseExecutor, selectorContainer);
-                               final RegisterMe regme = reg;
                                final Object[] keyTokens = 
getter.sendableKeys(selectorContainer);
                                final ClientKey[] keys = new 
ClientKey[keyTokens.length];
+                               
+                               if(probablyNotInStore) {
+                                       // Complete the registration *before* 
checking the store.
+                                       // Check the store anyway though!
+                                       finishRegister(req, persistent, false, 
true, reg);
+                                       // RegisterMe has been deleted or was 
null in the first place.
+                                       reg = null;
+                               } else {
+                                       if(reg == null)
+                                               reg = 
schedCore.queueRegister(getter, databaseExecutor, selectorContainer);
+                               }
+                               final RegisterMe regme = reg;
+                               
                                for(int i=0;i<keyTokens.length;i++) {
                                        keys[i] = getter.getKey(keyTokens[i], 
selectorContainer);
                                        selectorContainer.activate(keys[i], 5);
@@ -199,9 +209,18 @@
                                                container.activate(getter, 1);
                                                
schedCore.addPendingKeys(getter, container);
                                                RegisterMe reg = regme;
-                                               if(reg == null)
-                                                       reg = 
schedCore.queueRegister(getter, databaseExecutor, container);
+                                               if(probablyNotInStore) {
+                                                       // Complete the 
registration *before* checking the store.
+                                                       // Check the store 
anyway though!
+                                                       finishRegister(req, 
persistent, false, true, reg);
+                                                       // RegisterMe has been 
deleted or was null in the first place.
+                                                       reg = null;
+                                               } else {
+                                                       if(reg == null)
+                                                               reg = 
schedCore.queueRegister(getter, databaseExecutor, container);
+                                               }
                                                final RegisterMe regInner = reg;
+                                               
                                                final Object[] keyTokens = 
getter.sendableKeys(container);
                                                final ClientKey[] keys = new 
ClientKey[keyTokens.length];
                                                for(int 
i=0;i<keyTokens.length;i++) {
@@ -360,7 +379,8 @@
                                        Logger.minor(this, "finishRegister() 
for "+req);
                                if(anyValid)
                                        schedCore.innerRegister(req, random, 
selectorContainer);
-                               selectorContainer.delete(reg);
+                               if(reg != null)
+                                       selectorContainer.delete(reg);
                                maybeFillStarterQueue(selectorContainer, 
clientContext);
                                starter.wakeUp();
                        } else {
@@ -372,7 +392,8 @@
                                                        Logger.minor(this, 
"finishRegister() for "+req);
                                                if(anyValid)
                                                        
schedCore.innerRegister(req, random, container);
-                                               container.delete(reg);
+                                               if(reg != null)
+                                                       container.delete(reg);
                                                
maybeFillStarterQueue(container, context);
                                                starter.wakeUp();
                                        }

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-30 16:13:25 UTC (rev 20878)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-30 22:35:30 UTC (rev 20879)
@@ -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);
+                                       sched.register(reg.getter, true, 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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java     
2008-06-30 22:35:30 UTC (rev 20879)
@@ -199,7 +199,7 @@
                }
                if(persistent)
                        container.set(this);
-               getScheduler(context).register(this);
+               getScheduler(context).register(this, false);
        }

        private void fail(InsertException e, ObjectContainer container, 
ClientContext context) {
@@ -263,7 +263,7 @@
                        if(persistent)
                                container.set(this);
                } else {
-                       getScheduler(context).register(this);
+                       getScheduler(context).register(this, false);
                }
        }


Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-06-30 22:35:30 UTC (rev 20879)
@@ -513,7 +513,7 @@
                                        f.addDecompressor(codec);
                                }
                                parent.onTransition(this, f, container);
-                               f.schedule(container, context);
+                               f.schedule(container, context, false);
                                if(persistent) {
                                        container.set(metaStrings);
                                        container.set(this);
@@ -590,7 +590,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);
+                               sf.schedule(container, context, false);
                                rcb.onBlockSetFinished(this, container, 
context);
                                // Clear our own metadata, we won't need it any 
more.
                                // For multi-level metadata etc see above.
@@ -913,7 +913,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);
+                                       sf.schedule(container, context, 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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java        
2008-06-30 22:35:30 UTC (rev 20879)
@@ -326,12 +326,12 @@
                }
        }

-       public void schedule(ObjectContainer container, ClientContext context) {
+       public void schedule(ObjectContainer container, ClientContext context, 
boolean probablyNotInStore) {
                if(persistent)
                        container.activate(this, 1);
                if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this, 
"Scheduling "+this);
                for(int i=0;i<segments.length;i++) {
-                       segments[i].schedule(container, context);
+                       segments[i].schedule(container, context, 
probablyNotInStore);
                }
        }


Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-30 22:35:30 UTC (rev 20879)
@@ -620,7 +620,7 @@
                parentFetcher.segmentFinished(this, container, context);
        }

-       public void schedule(ObjectContainer container, ClientContext context) {
+       public void schedule(ObjectContainer container, ClientContext context, 
boolean probablyNotInStore) {
                if(persistent) {
                        container.activate(this, 1);
                        container.activate(parentFetcher, 1);
@@ -633,7 +633,7 @@
                        for(int 
i=0;i<dataRetries.length+checkRetries.length;i++)
                                seg.add(i, true, container, context, false);

-                       seg.schedule(container, context);
+                       seg.schedule(container, context, probablyNotInStore);
                        synchronized(this) {
                                scheduled = true;
                        }
@@ -807,7 +807,7 @@
                if(v != null) {
                        for(int i=0;i<v.size();i++) {
                                if(v.get(i) == segment) foundCaller = true;
-                               ((SplitFileFetcherSubSegment) 
v.get(i)).schedule(container, context);
+                               ((SplitFileFetcherSubSegment) 
v.get(i)).schedule(container, context, true);
                        }
                }
                return foundCaller;

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-06-30 16:13:25 UTC (rev 20878)
+++ 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-06-30 22:35:30 UTC (rev 20879)
@@ -456,7 +456,7 @@
                }
                if(persistent)
                        container.set(blockNums);
-               if(schedule) schedule(container, context);
+               if(schedule) schedule(container, context, 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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcher.java      
2008-06-30 22:35:30 UTC (rev 20879)
@@ -159,7 +159,7 @@
                                if(logMINOR)
                                        Logger.minor(this, "Checker == null in 
schedule() for "+this, new Exception("debug"));
                        } else
-                               checker.schedule(container, context);
+                               checker.schedule(container, context, 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);
+                       schedule(container, context, false);
                } else {
                        uskManager.ticker.queueTimedJob(new Runnable() {
                                public void run() {
-                                       USKFetcher.this.schedule(null, context);
+                                       USKFetcher.this.schedule(null, context, 
false);
                                }
                        }, delay);
                }
        }

-       public void schedule(ObjectContainer container, ClientContext context) {
+       public void schedule(ObjectContainer container, ClientContext context, 
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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java   
2008-06-30 22:35:30 UTC (rev 20879)
@@ -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); // non-persistent
+               fetcher.schedule(null, context, false); // non-persistent
        }

        public void cancel(ObjectContainer container, ClientContext context) {
@@ -118,7 +118,7 @@
                return token;
        }

-       public void schedule(ObjectContainer container, ClientContext context) {
+       public void schedule(ObjectContainer container, ClientContext context, 
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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKInserter.java     
2008-06-30 22:35:30 UTC (rev 20879)
@@ -78,7 +78,7 @@
                        if(finished) return;
                        fetcher = 
context.uskManager.getFetcherForInsertDontSchedule(pubUSK, 
parent.priorityClass, this, parent.getClient(), container, context);
                }
-               fetcher.schedule(container, context);
+               fetcher.schedule(container, context, 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-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKManager.java      
2008-06-30 22:35:30 UTC (rev 20879)
@@ -140,7 +140,7 @@
                                fetcher.cancel(null, context);
                        }
                }
-               if(sched != null) sched.schedule(null, context);
+               if(sched != null) sched.schedule(null, context, 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);
+                                       fetcher.schedule(null, context, false);
                                }
                        }, 0);
                }

Modified: branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKRetriever.java    
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKRetriever.java    
2008-06-30 22:35:30 UTC (rev 20879)
@@ -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);
+                       getter.schedule(null, context, 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-06-30 
16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/node/SendableGet.java     2008-06-30 
22:35:30 UTC (rev 20879)
@@ -99,10 +99,10 @@
                return true;
        }

-       public void schedule(ObjectContainer container, ClientContext context) {
+       public void schedule(ObjectContainer container, ClientContext context, 
boolean assumeNotInStore) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Scheduling "+this);
-               getScheduler(context).register(this);
+               getScheduler(context).register(this, assumeNotInStore);
        }

        public ClientRequestScheduler getScheduler(ClientContext context) {

Modified: branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java    
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java    
2008-06-30 22:35:30 UTC (rev 20879)
@@ -110,7 +110,7 @@

        public void schedule() {
                finished = false; // can reschedule
-               scheduler.register(this);
+               scheduler.register(this, false);
        }

        public void cancel(ObjectContainer container, ClientContext context) {


Reply via email to