Author: toad
Date: 2006-08-19 21:26:29 +0000 (Sat, 19 Aug 2006)
New Revision: 10210

Added:
   trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
Modified:
   trunk/freenet/src/freenet/client/FetchWaiter.java
   trunk/freenet/src/freenet/client/PutWaiter.java
   trunk/freenet/src/freenet/client/async/BaseClientPutter.java
   trunk/freenet/src/freenet/client/async/ClientCallback.java
   trunk/freenet/src/freenet/client/async/ClientPutter.java
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java
   trunk/freenet/src/freenet/client/async/PutCompletionCallback.java
   trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java
   trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
   trunk/freenet/src/freenet/client/async/USKInserter.java
   trunk/freenet/src/freenet/clients/http/NinjaSpider.java
   trunk/freenet/src/freenet/clients/http/Spider.java
   trunk/freenet/src/freenet/node/ARKFetcher.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeARKInserter.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
   trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
   trunk/freenet/src/freenet/node/updater/NodeUpdater.java
   trunk/freenet/src/freenet/support/DoubleTokenBucket.java
   trunk/freenet/src/freenet/support/TokenBucket.java
Log:
Determine when an insert is fetchable, and send a new message PutFetchable when 
it is.
Don't start inserting the top before the bottom is fetchable (important with 
USKs).
Related changes.
Logging, investigating bwlimitDelay issues.

Modified: trunk/freenet/src/freenet/client/FetchWaiter.java
===================================================================
--- trunk/freenet/src/freenet/client/FetchWaiter.java   2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/client/FetchWaiter.java   2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -53,4 +53,8 @@
        public void onMajorProgress() {
                // Ignore
        }
+
+       public void onFetchable(BaseClientPutter state) {
+               // Ignore
+       }
 }

Modified: trunk/freenet/src/freenet/client/PutWaiter.java
===================================================================
--- trunk/freenet/src/freenet/client/PutWaiter.java     2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/client/PutWaiter.java     2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -62,4 +62,8 @@
                // Ignore
        }

+       public void onFetchable(BaseClientPutter state) {
+               // Ignore
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/BaseClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseClientPutter.java        
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/BaseClientPutter.java        
2006-08-19 21:26:29 UTC (rev 10210)
@@ -7,5 +7,5 @@
        }

        public abstract void onMajorProgress();
-       
+
 }

Modified: trunk/freenet/src/freenet/client/async/ClientCallback.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientCallback.java  2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/ClientCallback.java  2006-08-19 
21:26:29 UTC (rev 10210)
@@ -25,4 +25,7 @@
        /** Called when freenet.async thinks that the request should be 
serialized to
         * disk, if it is a persistent request. */
        public void onMajorProgress();
+
+       /** Called when the inserted data is fetchable (don't rely on this) */
+       public void onFetchable(BaseClientPutter state);
 }

Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientPutter.java    2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/ClientPutter.java    2006-08-19 
21:26:29 UTC (rev 10210)
@@ -187,5 +187,9 @@
                if(currentState == null) return null;
                return currentState.getProgressFieldset();
        }
+
+       public void onFetchable(ClientPutState state) {
+               client.onFetchable(this);
+       }

 }

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2006-08-19 21:26:29 UTC (rev 10210)
@@ -275,7 +275,7 @@
                                        continue;
                                }

-                               Logger.minor(this, "removeFirst() returning 
"+req+" ("+rga.getNumber()+")");
+                               Logger.minor(this, "removeFirst() returning 
"+req+" ("+rga.getNumber()+", prio "+req.getPriorityClass()+", retries 
"+req.getRetryCount()+")");
                                ClientRequester cr = req.getClientRequest();
                                HashSet v = (HashSet) 
allRequestsByClientRequest.get(cr);
                                v.remove(req);

Modified: trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java
===================================================================
--- trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java      
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java      
2006-08-19 21:26:29 UTC (rev 10210)
@@ -1,7 +1,6 @@
 package freenet.client.async;

-import java.util.LinkedList;
-import java.util.ListIterator;
+import java.util.Vector;

 import freenet.client.InserterException;
 import freenet.client.Metadata;
@@ -14,8 +13,9 @@
        // LinkedList's rather than HashSet's for memory reasons.
        // This class will not be used with large sets, so O(n) is cheaper than 
O(1) -
        // at least it is on memory!
-       private final LinkedList waitingFor;
-       private final LinkedList waitingForBlockSet;
+       private final Vector waitingFor;
+       private final Vector waitingForBlockSet;
+       private final Vector waitingForFetchable;
        private final PutCompletionCallback cb;
        private ClientPutState generator;
        private final BaseClientPutter parent;
@@ -26,31 +26,32 @@

        public MultiPutCompletionCallback(PutCompletionCallback cb, 
BaseClientPutter parent, Object token) {
                this.cb = cb;
-               this.waitingFor = new LinkedList();
-               this.waitingForBlockSet = new LinkedList();
+               waitingFor = new Vector();
+               waitingForBlockSet = new Vector();
+               waitingForFetchable = new Vector();
                this.parent = parent;
                this.token = token;
                finished = false;
        }

-       public synchronized void onSuccess(ClientPutState state) {
+       public void onSuccess(ClientPutState state) {
+               onBlockSetFinished(state);
+               onFetchable(state);
+               synchronized(this) {
                        if(finished) return;
                        waitingFor.remove(state);
                        if(!(waitingFor.isEmpty() && started))
                                return;
-               /* Using this.e here will cause complete to consider the
-                * insert as failed if onFailed has been called in the past
-                * for this request. This makes collisions work. It does
-                * mean that onSuccess gets called, and then we consider
-                * the insert to have failed, which may or may not make sense.
-                */
-               complete(this.e);
+               }
+               complete(null);
        }

        public void onFailure(InserterException e, ClientPutState state) {
                synchronized(this) {
                        if(finished) return;
                        waitingFor.remove(state);
+                       waitingForBlockSet.remove(state);
+                       waitingForFetchable.remove(state);
                        if(!(waitingFor.isEmpty() && started)) {
                                this.e = e;
                                return;
@@ -59,8 +60,15 @@
                complete(e);
        }

-       private synchronized void complete(InserterException e) {
-               finished = true;
+       private void complete(InserterException e) {
+               synchronized(this) {
+                       if(finished) return;
+                       finished = true;
+                       if(e != null && this.e != null && this.e != e) {
+                               Logger.error(this, "Completing with "+e+" but 
already set "+this.e);
+                       }
+                       if(e == null) e = this.e;
+               }
                if(e != null)
                        cb.onFailure(e, this);
                else
@@ -75,14 +83,18 @@
        public synchronized void add(ClientPutState ps) {
                if(finished) return;
                waitingFor.add(ps);
+               waitingForBlockSet.add(ps);
+               waitingForFetchable.add(ps);
        }

-       public synchronized void arm() {
+       public void arm() {
                boolean allDone;
                boolean allGotBlocks;
-               started = true;
-               allDone = waitingFor.isEmpty();
-               allGotBlocks = waitingForBlockSet.isEmpty();
+               synchronized(this) {
+                       started = true;
+                       allDone = waitingFor.isEmpty();
+                       allGotBlocks = waitingForBlockSet.isEmpty();
+               }

                if(allGotBlocks) {
                        cb.onBlockSetFinished(this);
@@ -116,12 +128,15 @@
                if(generator == oldState)
                        generator = newState;
                if(oldState == newState) return;
-               for(ListIterator i = waitingFor.listIterator(0);i.hasNext();) {
-                       if(i.next() == oldState) {
-                               i.remove();
-                               i.add(newState);
-                       }
+               for(int i=0;i<waitingFor.size();i++) {
+                       if(waitingFor.get(i) == oldState) waitingFor.set(i, 
newState);
                }
+               for(int i=0;i<waitingFor.size();i++) {
+                       if(waitingForBlockSet.get(i) == oldState) 
waitingForBlockSet.set(i, newState);
+               }
+               for(int i=0;i<waitingFor.size();i++) {
+                       if(waitingForFetchable.get(i) == oldState) 
waitingForFetchable.set(i, newState);
+               }
        }

        public synchronized void onMetadata(Metadata m, ClientPutState state) {
@@ -136,6 +151,7 @@
                synchronized(this) {
                        this.waitingForBlockSet.remove(state);
                        if(!started) return;
+                       if(!waitingForBlockSet.isEmpty()) return;
                }
                cb.onBlockSetFinished(this);
        }
@@ -152,4 +168,13 @@
                return null;
        }

+       public void onFetchable(ClientPutState state) {
+               synchronized(this) {
+                       this.waitingForFetchable.remove(state);
+                       if(!started) return;
+                       if(!waitingForFetchable.isEmpty()) return;
+               }
+               cb.onFetchable(this);
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/PutCompletionCallback.java
===================================================================
--- trunk/freenet/src/freenet/client/async/PutCompletionCallback.java   
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/PutCompletionCallback.java   
2006-08-19 21:26:29 UTC (rev 10210)
@@ -23,6 +23,12 @@
         */
        public void onMetadata(Metadata m, ClientPutState state);

+       /** Called when enough data has been inserted that the file can be
+        * retrieved, even if not all data has been inserted yet. Note that this
+        * is only supported for splitfiles; if you get onSuccess() first, 
assume
+        * that onFetchable() isn't coming. */
+       public void onFetchable(ClientPutState state);
+       
        /** Called when the ClientPutState knows that it knows about
         * all the blocks it will need to put.
         */

Modified: trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java      
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/SimpleHealingQueue.java      
2006-08-19 21:26:29 UTC (rev 10210)
@@ -110,4 +110,8 @@
                // Ignore
        }

+       public void onFetchable(ClientPutState state) {
+               // Ignore
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-08-19 21:26:29 UTC (rev 10210)
@@ -83,6 +83,7 @@

                public void onSuccess(ClientPutState state) {
                        Logger.minor(this, "Completed "+this);
+                       SimpleManifestPutter.this.onFetchable(this);
                        synchronized(SimpleManifestPutter.this) {
                                runningPutHandlers.remove(this);
                                if(!runningPutHandlers.isEmpty()) {
@@ -164,12 +165,18 @@
                public void onMajorProgress() {
                        SimpleManifestPutter.this.onMajorProgress();
                }
+
+               public void onFetchable(ClientPutState state) {
+                       SimpleManifestPutter.this.onFetchable(this);
+               }
+
        }

        private final HashMap putHandlersByName;
        private final HashSet runningPutHandlers;
        private final HashSet putHandlersWaitingForMetadata;
        private final HashSet waitingForBlockSets;
+       private final HashSet putHandlersWaitingForFetchable;
        private FreenetURI finalURI;
        private FreenetURI targetURI;
        private boolean finished;
@@ -179,6 +186,7 @@
        private boolean insertedAllFiles;
        private boolean insertedManifest;
        private final HashMap metadataPuttersByMetadata;
+       private final HashMap metadataPuttersUnfetchable;
        private final String defaultName;
        private int numberOfFiles;
        private long totalSize;
@@ -189,6 +197,7 @@
                new String[] { "index.html", "index.htm", "default.html", 
"default.htm" };
        private int bytesOnZip;
        private LinkedList elementsToPutInZip;
+       private boolean fetchable;

        public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler 
chkSched,
                        ClientRequestScheduler sskSched, HashMap 
manifestElements, short prioClass, FreenetURI target, 
@@ -202,8 +211,10 @@
                putHandlersByName = new HashMap();
                runningPutHandlers = new HashSet();
                putHandlersWaitingForMetadata = new HashSet();
+               putHandlersWaitingForFetchable = new HashSet();
                waitingForBlockSets = new HashSet();
                metadataPuttersByMetadata = new HashMap();
+               metadataPuttersUnfetchable = new HashMap();
                elementsToPutInZip = new LinkedList();
                makePutHandlers(manifestElements, putHandlersByName);
                checkZips();
@@ -286,6 +297,7 @@
                                                }
                                                runningPutHandlers.add(ph);
                                                
putHandlersWaitingForMetadata.add(ph);
+                                               
putHandlersWaitingForFetchable.add(ph);
                                                numberOfFiles++;
                                                totalSize += data.size();
                                        }
@@ -417,6 +429,7 @@
                                new SingleFileInserter(this, this, block, 
isMetadata, ctx, false, getCHKOnly, false, baseMetadata, 
insertAsArchiveManifest, true);
                        Logger.minor(this, "Inserting main metadata: 
"+metadataInserter);
                        this.metadataPuttersByMetadata.put(baseMetadata, 
metadataInserter);
+                       metadataPuttersUnfetchable.put(baseMetadata, 
metadataInserter);
                        metadataInserter.start(null);
                } catch (InserterException e) {
                        fail(e);
@@ -673,4 +686,29 @@
        public void onMajorProgress() {
                cb.onMajorProgress();
        }
+
+       protected void onFetchable(PutHandler handler) {
+               synchronized(this) {
+                       putHandlersWaitingForFetchable.remove(handler);
+                       if(fetchable) return;
+                       if(!putHandlersWaitingForFetchable.isEmpty()) return;
+                       if(!hasResolvedBase) return;
+                       if(!metadataPuttersUnfetchable.isEmpty()) return;
+                       fetchable = true;
+               }
+               cb.onFetchable(this);
+       }
+
+       public void onFetchable(ClientPutState state) {
+               Metadata m = (Metadata) state.getToken();
+               synchronized(this) {
+                       metadataPuttersUnfetchable.remove(m);
+                       if(!metadataPuttersUnfetchable.isEmpty()) return;
+                       if(fetchable) return;
+                       if(!putHandlersWaitingForFetchable.isEmpty()) return;
+                       fetchable = true;
+               }
+               cb.onFetchable(this);
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2006-08-19 21:26:29 UTC (rev 10210)
@@ -281,6 +281,8 @@
                boolean metaInsertSuccess;
                boolean splitInsertSetBlocks;
                boolean metaInsertSetBlocks;
+               boolean metaInsertStarted;
+               boolean metaFetchable;

                /**
                 * Create a SplitHandler from a stored progress SimpleFieldSet.
@@ -327,9 +329,6 @@
                        }

                        newSFI.schedule();
-                       if(newMetaPutter != null) {
-                               newMetaPutter.schedule();
-                       }
                }

                public SplitHandler() {
@@ -345,11 +344,16 @@

                public void onSuccess(ClientPutState state) {
                        Logger.minor(this, "onSuccess("+state+")");
+                       boolean lateStart = false;
                        synchronized(this) {
                                if(finished) return;
                                if(state == sfi) {
                                        Logger.minor(this, "Splitfile insert 
succeeded");
                                        splitInsertSuccess = true;
+                                       if(!metaInsertSuccess && 
!metaInsertStarted) {
+                                               Logger.error(this, "Splitfile 
insert succeeded but metadata not started, starting anyway...");
+                                               lateStart = true;
+                                       }
                                } else if(state == metadataPutter) {
                                        Logger.minor(this, "Metadata insert 
succeeded");
                                        metaInsertSuccess = true;
@@ -362,7 +366,10 @@
                                }
                                else return;
                        }
-                       cb.onSuccess(this);
+                       if(lateStart)
+                               startMetadata();
+                       else if(finished)
+                               cb.onSuccess(this);
                }

                public void onFailure(InserterException e, ClientPutState 
state) {
@@ -425,13 +432,6 @@
                                cb.onFailure(e1, this);
                                return;
                        }
-
-                       try {
-                               
((SingleFileInserter)metadataPutter).start(null);
-                       } catch (InserterException e1) {
-                               fail(e1);
-                               return;
-                       }
                }

                private void fail(InserterException e) {
@@ -511,7 +511,44 @@
                                fs.put("MetadataPutter", 
metadataPutter.getProgressFieldset());
                        return fs;
                }
+
+               public void onFetchable(ClientPutState state) {
+                       
+                       boolean meta;
+                       
+                       synchronized(this) {
+                               meta = (state == metadataPutter);
+                               if(meta) {
+                                       if(!metaInsertStarted) {
+                                               Logger.error(this, "Metadata 
insert not started yet got onFetchable for it: "+state+" on "+this);
+                                       }
+                                       if(metaFetchable) return;
+                                       metaFetchable = true;
+                               } else {
+                                       if(state != sfi) {
+                                               Logger.error(this, "onFetchable 
for unknown state "+state);
+                                               return;
+                                       }
+                                       if(metaInsertStarted) return;
+                                       metaInsertStarted = true;
+                               }
+                       }
+                       
+                       if(meta)
+                               cb.onFetchable(this);
+                       else
+                               startMetadata();
+               }

+               private void startMetadata() {
+                       try {
+                               
((SingleFileInserter)metadataPutter).start(null);
+                       } catch (InserterException e1) {
+                               fail(e1);
+                               return;
+                       }
+               }
+               
        }

        public BaseClientPutter getParent() {

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2006-08-19 21:26:29 UTC (rev 10210)
@@ -35,6 +35,7 @@
        final ClientMetadata cm;
        final boolean isMetadata;
        private boolean finished;
+       private boolean fetchable;
        public final Object token;
        final boolean insertAsArchiveManifest;

@@ -248,6 +249,10 @@
                }

                Logger.minor(this, "Have URIs from all segments");
+               encodeMetadata();
+       }
+       
+       private void encodeMetadata() {
                boolean missingURIs;
                Metadata m = null;
                synchronized(this) {
@@ -358,6 +363,22 @@
                onAllFinished();
        }

+       public void segmentFetchable(SplitFileInserterSegment segment) {
+               Logger.minor(this, "Segment fetchable: "+segment);
+               synchronized(this) {
+                       if(finished) return;
+                       if(fetchable) return;
+                       for(int i=0;i<segments.length;i++) {
+                               if(!segments[i].isFetchable()) {
+                                       Logger.minor(this, "Segment not 
fetchable: "+i+": "+segments[i]);
+                                       return;
+                               }
+                       }
+                       fetchable = true;
+               }
+               cb.onFetchable(this);
+       }
+
        private void onAllFinished() {
                Logger.minor(this, "All finished");
                try {

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-08-19 18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-08-19 21:26:29 UTC (rev 10210)
@@ -298,6 +298,7 @@
        public void start() throws InserterException {
                Logger.minor(this, "Starting segment "+segNo+" of "+parent+" 
("+parent.dataLength+"): "+this+" ( finished="+finished+" encoded="+encoded+" 
hasURIs="+hasURIs+")");
                boolean fin = true;
+               
                for(int i=0;i<dataBlockInserters.length;i++) {
                        if(dataBlocks[i] != null) { // else already finished on 
creation
                                dataBlockInserters[i] = 
@@ -336,6 +337,12 @@
                if(hasURIs) {
                        parent.segmentHasURIs(this);
                }
+               boolean fetchable;
+               synchronized(this) {
+                       fetchable = (blocksCompleted > dataBlocks.length);
+               }
+               if(fetchable)
+                       parent.segmentFetchable(this);
                if(fin) finish();
                if(finished) {
                        parent.segmentFinished(this);
@@ -454,27 +461,41 @@
        public void onSuccess(ClientPutState state) {
                SingleBlockInserter sbi = (SingleBlockInserter)state;
                int x = sbi.token;
-               if(completed(x)) return;
-               finish();
+               completed(x);
        }

        public void onFailure(InserterException e, ClientPutState state) {
                SingleBlockInserter sbi = (SingleBlockInserter)state;
                int x = sbi.token;
                errors.merge(e);
-               if(completed(x)) return;
+               completed(x);
+       }
+
+       private void completed(int x) {
+               int total = innerCompleted(x);
+               if(total == -1) return;
+               if(total == dataBlockInserters.length) {
+                       parent.segmentFetchable(this);
+               }
+               if(total != dataBlockInserters.length + 
checkBlockInserters.length) return;
                finish();
        }
-
-       private synchronized boolean completed(int x) {
+       
+       /**
+        * Called when a block has completed.
+        * @param x The block number.
+        * @return -1 if the segment has already finished, otherwise the number 
of completed
+        * blocks.
+        */
+       private synchronized int innerCompleted(int x) {
                Logger.minor(this, "Completed: "+x+" on "+this+" ( 
completed="+blocksCompleted+", 
total="+(dataBlockInserters.length+checkBlockInserters.length));

-               if(finished) return true;
+               if(finished) return -1;
                if(x >= dataBlocks.length) {
                        x -= dataBlocks.length;
                        if(checkBlockInserters[x] == null) {
                                Logger.error(this, "Completed twice: check 
block "+x+" on "+this);
-                               return true;
+                               return blocksCompleted;
                        }
                        checkBlockInserters[x] = null;
                        try {
@@ -486,7 +507,7 @@
                } else {
                        if(dataBlockInserters[x] == null) {
                                Logger.error(this, "Completed twice: data block 
"+x+" on "+this);
-                               return true;
+                               return blocksCompleted;
                        }
                        dataBlockInserters[x] = null;
                        if(encoded) {
@@ -499,8 +520,7 @@
                        }
                }
                blocksCompleted++;
-               if(blocksCompleted != dataBlockInserters.length + 
checkBlockInserters.length) return true;
-               return false;
+               return blocksCompleted;
        }

        public synchronized boolean isFinished() {
@@ -580,4 +600,12 @@
        public synchronized boolean hasURIs() {
                return hasURIs;
        }
+
+       public synchronized boolean isFetchable() {
+               return blocksCompleted > dataBlocks.length;
+       }
+
+       public void onFetchable(ClientPutState state) {
+               // Ignore
+       }
 }

Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java     2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java     2006-08-19 
21:26:29 UTC (rev 10210)
@@ -216,4 +216,8 @@
                return null;
        }

+       public void onFetchable(ClientPutState state) {
+               // Ignore
+       }
+
 }

Modified: trunk/freenet/src/freenet/clients/http/NinjaSpider.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/NinjaSpider.java     2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/clients/http/NinjaSpider.java     2006-08-19 
21:26:29 UTC (rev 10210)
@@ -735,6 +735,10 @@
                // Ignore
        }

+       public void onFetchable(BaseClientPutter state) {
+               // Ignore
+       }


+
 }

Modified: trunk/freenet/src/freenet/clients/http/Spider.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/Spider.java  2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/clients/http/Spider.java  2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -471,4 +471,8 @@
                // Ignore
        }

+       public void onFetchable(BaseClientPutter state) {
+               // Ignore
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/ARKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/node/ARKFetcher.java      2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/node/ARKFetcher.java      2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -259,4 +259,8 @@
        public void onMajorProgress() {
                // Ignore
        }
+
+       public void onFetchable(BaseClientPutter state) {
+               // Ignore, we don't insert
+       }
 }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-08-19 18:20:31 UTC (rev 
10209)
+++ trunk/freenet/src/freenet/node/Node.java    2006-08-19 21:26:29 UTC (rev 
10210)
@@ -1581,9 +1581,6 @@
                                }
                        }

-                       Logger.minor(this, "Accepting request?");
-                       
-                       lastAcceptedRequest = now;
                }

                // Do we have the bandwidth?
@@ -1605,6 +1602,11 @@
                        return "Insufficient input bandwidth";
                }

+               synchronized(this) {
+                       Logger.minor(this, "Accepting request?");
+                       lastAcceptedRequest = now;
+               }
+               
                pInstantRejectIncoming.report(0.0);

                // Accept

Modified: trunk/freenet/src/freenet/node/NodeARKInserter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeARKInserter.java 2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/node/NodeARKInserter.java 2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -230,4 +230,8 @@
                // Ignore
        }

+       public void onFetchable(BaseClientPutter state) {
+               // Ignore, we don't care
+       }
+
 }
\ No newline at end of file

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -1904,7 +1904,7 @@
         */
        public void localRejectedOverload(String reason) {
                pRejected.report(1.0);
-               Logger.minor(this, "Local rejected overload on "+this+" : 
pRejected="+pRejected.currentValue());
+               Logger.minor(this, "Local rejected overload ("+reason+") on 
"+this+" : pRejected="+pRejected.currentValue());
                long now = System.currentTimeMillis();
                Peer peer = getPeer();
                reportBackoffStatus(now);

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -577,4 +577,9 @@
                return returnBucket;
        }

+
+       public void onFetchable(BaseClientPutter state) {
+               // Ignore, we don't insert
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -8,6 +8,7 @@
 import freenet.client.InserterException;
 import freenet.client.Metadata;
 import freenet.client.MetadataUnresolvedException;
+import freenet.client.async.BaseClientPutter;
 import freenet.client.async.ClientPutter;
 import freenet.keys.FreenetURI;
 import freenet.support.HexUtil;

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2006-08-19 
21:26:29 UTC (rev 10210)
@@ -31,6 +31,7 @@

        // Verbosity bitmasks
        private int VERBOSITY_SPLITFILE_PROGRESS = 1;
+       private int VERBOSITY_PUT_FETCHABLE = 256;
        private int VERBOSITY_COMPRESSION_START_END = 512;

        // Stuff waiting for reconnection
@@ -157,6 +158,15 @@
                        }
                }
        }
+
+       public void onFetchable(BaseClientPutter putter) {
+               if(finished) return;
+               if((verbosity & VERBOSITY_PUT_FETCHABLE) == 
VERBOSITY_PUT_FETCHABLE) {
+                       PutFetchableMessage msg =
+                               new PutFetchableMessage(identifier, 
generatedURI);
+                       trySendProgressMessage(msg, VERBOSITY_PUT_FETCHABLE, 
null);
+               }
+       }

        private void trySendFinalMessage(FCPConnectionOutputHandler handler) {


Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2006-08-19 
21:26:29 UTC (rev 10210)
@@ -58,6 +58,7 @@
                        if(handler != null && (!handler.isGlobalSubscribed()))
                                handler.outputHandler.queue(msg);
                }
+               Logger.minor(this, "Putting dir "+identifier+" : 
"+priorityClass);
        }

        public ClientPutDir(SimpleFieldSet fs, FCPClient client) throws 
PersistenceParseException, IOException {

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java    2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java    2006-08-19 
21:26:29 UTC (rev 10210)
@@ -8,6 +8,7 @@
 import freenet.node.Node;
 import freenet.node.RequestStarter;
 import freenet.support.Fields;
+import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.io.Bucket;
 import freenet.support.io.BucketFactory;

Modified: trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java    2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java    2006-08-19 
21:26:29 UTC (rev 10210)
@@ -70,9 +70,8 @@
                return NodeHelloMessage.name;
        }

-       public void run(FCPConnectionHandler handler, Node node) {
-               throw new UnsupportedOperationException();
-               // Client should not be sending this!
+       public void run(FCPConnectionHandler handler, Node node) throws 
MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "NodeHello goes 
from server to client not the other way around", null);
        }

 }

Added: trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java 2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java 2006-08-19 
21:26:29 UTC (rev 10210)
@@ -0,0 +1,34 @@
+package freenet.node.fcp;
+
+import freenet.keys.FreenetURI;
+import freenet.node.Node;
+import freenet.support.SimpleFieldSet;
+
+public class PutFetchableMessage extends FCPMessage {
+
+       PutFetchableMessage(String ident, FreenetURI uri) {
+               this.identifier = ident;
+               this.uri = uri;
+       }
+       
+       final String identifier;
+       final FreenetURI uri;
+       
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet fs = new SimpleFieldSet();
+               fs.put("Identifier", identifier);
+               if(uri != null)
+                       fs.put("URI", uri.toString(false));
+               return fs;
+       }
+
+       public String getName() {
+               return "PutFetchable";
+       }
+
+       public void run(FCPConnectionHandler handler, Node node)
+                       throws MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "PutFetchable 
goes from server to client not the other way around", identifier);
+       }
+
+}

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-08-19 
21:26:29 UTC (rev 10210)
@@ -669,4 +669,8 @@
        public int getRevocationDNFCounter() {
                return revocationDNFCounter;
        }
+
+       public void onFetchable(BaseClientPutter state) {
+               // Ignore, we don't insert
+       }
 }

Modified: trunk/freenet/src/freenet/support/DoubleTokenBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/DoubleTokenBucket.java    2006-08-19 
18:20:31 UTC (rev 10209)
+++ trunk/freenet/src/freenet/support/DoubleTokenBucket.java    2006-08-19 
21:26:29 UTC (rev 10210)
@@ -76,6 +76,7 @@
        }

        public synchronized void addTokens() {
+               Logger.minor(this, "current="+current+" forced="+curForced);
                addTokensNoClip();
                if(curForced > maxForced) curForced = maxForced;
                if(current > max) current = max;

Modified: trunk/freenet/src/freenet/support/TokenBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/TokenBucket.java  2006-08-19 18:20:31 UTC 
(rev 10209)
+++ trunk/freenet/src/freenet/support/TokenBucket.java  2006-08-19 21:26:29 UTC 
(rev 10210)
@@ -127,6 +127,7 @@
                // will therefore go negative. We have paid off the initial 
debt, and we have
                // paid off the tokens, any more debt is a problem for future 
blockingGrab's!
                current -= tokens;
+               Logger.minor(this, "Blocking grab removed tokens: 
current="+current);
        }

        public synchronized void recycle(long tokens) {
@@ -188,7 +189,6 @@
                        return 0;
                }
                if(nextTick + nanosPerTick > nowNS) {
-                       timeLastTick = nextTick;
                        return 1;
                }
                return (nowNS - nextTick) / nanosPerTick;


Reply via email to