Author: toad
Date: 2006-05-17 13:49:06 +0000 (Wed, 17 May 2006)
New Revision: 8739

Modified:
   trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
   trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
   trunk/freenet/src/freenet/client/async/USKFetcher.java
   trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
   trunk/freenet/src/freenet/client/async/USKInserter.java
   trunk/freenet/src/freenet/client/async/USKManager.java
   trunk/freenet/src/freenet/node/Version.java
Log:
716: Many bugfixes relating to USK and manifest inserts.

Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-05-17 13:49:06 UTC (rev 8739)
@@ -85,10 +85,10 @@
                }

                public void onEncode(BaseClientKey key, ClientPutState state) {
+                       Logger.minor(this, "onEncode("+key+") for "+this);
                        if(metadata == null) {
-                               // Don't have metadata yet
-                               // Do have key
-                               // So make a redirect to the key
+                               // The file was too small to have its own 
metadata, we get this instead.
+                               // So we make the key into metadata.
                                Metadata m =
                                        new Metadata(Metadata.SIMPLE_REDIRECT, 
key.getURI(), cm);
                                onMetadata(m, null);
@@ -171,6 +171,7 @@
        private final String defaultName;
        private int numberOfFiles;
        private long totalSize;
+       private boolean metadataBlockSetFinalized;
        private final static String[] defaultDefaultNames =
                new String[] { "index.html", "index.htm", "default.html", 
"default.htm" };

@@ -313,10 +314,17 @@
        }

        private void insertedAllFiles() {
+               Logger.minor(this, "Inserted all files");
                synchronized(this) {
                        insertedAllFiles = true;
-                       if(finished || cancelled) return;
-                       if(!insertedManifest) return;
+                       if(finished || cancelled) {
+                               Logger.minor(this, "Already 
"+(finished?"finished":"cancelled"));
+                               return;
+                       }
+                       if(!insertedManifest) {
+                               Logger.minor(this, "Haven't inserted manifest");
+                               return;
+                       }
                        finished = true;
                }
                complete();
@@ -347,10 +355,17 @@
        }

        public void onSuccess(ClientPutState state) {
+               Logger.minor(this, "Inserted manifest successfully on "+this);
                synchronized(this) {
                        insertedManifest = true;
-                       if(!finished) return;
-                       if(!insertedAllFiles) return;
+                       if(finished) {
+                               Logger.minor(this, "Already finished");
+                               return;
+                       }
+                       if(!insertedAllFiles) {
+                               Logger.minor(this, "Not inserted all files");
+                               return;
+                       }
                        finished = true;
                }
                complete();
@@ -385,9 +400,21 @@
        }

        public void onBlockSetFinished(ClientPutState state) {
+               synchronized(this) {
+                       this.metadataBlockSetFinalized = true;
+                       if(!waitingForBlockSets.isEmpty()) return;
+               }
                this.blockSetFinalized();
        }

+       public void blockSetFinalized() {
+               synchronized(this) {
+                       if(!metadataBlockSetFinalized) return;
+                       if(waitingForBlockSets.isEmpty()) return;
+               }
+               super.blockSetFinalized();
+       }
+       
        /**
         * Convert a HashMap of name -> bucket to a HashSet of ManifestEntry's.
         * All are to have mimeOverride=null, i.e. we use the auto-detected 
mime type

Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-05-17 13:49:06 UTC (rev 8739)
@@ -35,6 +35,7 @@
        private int retries;
        private final FailureCodeTracker errors;
        private boolean finished;
+       private final boolean dontSendEncoded;
        private ClientKey key;
        private WeakReference refToClientKeyBlock;
        final int token; // for e.g. splitfiles
@@ -43,10 +44,11 @@
        final int sourceLength;
        private int consecutiveRNFs;

-       public SingleBlockInserter(BaseClientPutter parent, Bucket data, short 
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback 
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly, 
boolean addToParent) throws InserterException {
+       public SingleBlockInserter(BaseClientPutter parent, Bucket data, short 
compressionCodec, FreenetURI uri, InserterContext ctx, PutCompletionCallback 
cb, boolean isMetadata, int sourceLength, int token, boolean getCHKOnly, 
boolean addToParent, boolean dontSendEncoded) throws InserterException {
                this.consecutiveRNFs = 0;
                this.token = token;
                this.parent = parent;
+               this.dontSendEncoded = dontSendEncoded;
                this.retries = 0;
                this.finished = false;
                this.ctx = ctx;
@@ -104,7 +106,8 @@
                refToClientKeyBlock = 
                        new WeakReference(block);
                resultingURI = block.getClientKey().getURI();
-               cb.onEncode(block.getClientKey(), this);
+               if(!dontSendEncoded)
+                       cb.onEncode(block.getClientKey(), this);
                return block;
        }


Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2006-05-17 13:49:06 UTC (rev 8739)
@@ -174,7 +174,7 @@
                if (data.size() < ClientCHKBlock.MAX_COMPRESSED_DATA_LENGTH) {
                        // Insert single block, then insert pointer to it
                        if(reportMetadataOnly) {
-                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
cb, metadata, (int)origSize, -1, getCHKOnly, true);
+                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
cb, metadata, (int)origSize, -1, getCHKOnly, true, true);
                                Metadata meta = new 
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
                                cb.onMetadata(meta, this);
                                cb.onTransition(this, dataPutter);
@@ -183,7 +183,7 @@
                        } else {
                                MultiPutCompletionCallback mcb = 
                                        new MultiPutCompletionCallback(cb, 
parent);
-                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
mcb, metadata, (int)origSize, -1, getCHKOnly, true);
+                               SingleBlockInserter dataPutter = new 
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx, 
mcb, metadata, (int)origSize, -1, getCHKOnly, true, false);
                                Metadata meta = new 
Metadata(Metadata.SIMPLE_REDIRECT, dataPutter.getURI(), block.clientMetadata);
                                Bucket metadataBucket;
                                try {
@@ -233,7 +233,7 @@
                        }
                } else {
                        return new SingleBlockInserter(parent, data, 
compressionCodec, uri, ctx, cb, isMetadata, sourceLength, token, 
-                               getCHKOnly, addToParent);
+                               getCHKOnly, addToParent, false);
                }
        }


Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java        
2006-05-17 13:49:06 UTC (rev 8739)
@@ -55,7 +55,7 @@
        public void start() throws InserterException {
                for(int i=0;i<dataBlockInserters.length;i++) {
                        dataBlockInserters[i] = 
-                               new SingleBlockInserter(parent.parent, 
dataBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this, 
false, ClientCHKBlock.DATA_LENGTH, i, getCHKOnly, false);
+                               new SingleBlockInserter(parent.parent, 
dataBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this, 
false, ClientCHKBlock.DATA_LENGTH, i, getCHKOnly, false, false);
                        dataBlockInserters[i].schedule();
                }
                if(splitfileAlgo == null) {
@@ -81,7 +81,7 @@
                        // Start the inserts
                        for(int i=0;i<checkBlockInserters.length;i++) {
                                checkBlockInserters[i] = 
-                                       new SingleBlockInserter(parent.parent, 
checkBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this, 
false, ClientCHKBlock.DATA_LENGTH, i + dataBlocks.length, getCHKOnly, false);
+                                       new SingleBlockInserter(parent.parent, 
checkBlocks[i], (short)-1, FreenetURI.EMPTY_CHK_URI, blockInsertContext, this, 
false, ClientCHKBlock.DATA_LENGTH, i + dataBlocks.length, getCHKOnly, false, 
false);
                                checkBlockInserters[i].schedule();
                        }
                        // Tell parent only after have started the inserts.

Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-05-17 
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-05-17 
13:49:06 UTC (rev 8739)
@@ -99,6 +99,7 @@
                boolean succeeded;
                /** DNF? */
                boolean dnf;
+               boolean cancelled = false;
                public USKAttempt(long i) {
                        this.number = i;
                        this.succeeded = false;
@@ -134,6 +135,7 @@
                }

                public void cancel() {
+                       cancelled = true;
                        if(checker != null) checker.cancel();
                }

@@ -292,16 +294,23 @@
                        long addFrom = Math.max(lastAddedEdition + 1, curLatest 
+ 1);
                        if(addTo >= addFrom) {
                                l = new LinkedList();
-                               for(long i=addFrom;i<=addTo;i++)
+                               for(long i=addFrom;i<=addTo;i++) {
+                                       Logger.minor(this, "Adding checker for 
edition "+i);
                                        l.add(add(i));
+                               }
                        }
                        cancelBefore(curLatest);
-               }
-               if(l == null) return;
-               else if(!cancelled) {
-                       for(Iterator i=l.iterator();i.hasNext();) {
-                               USKAttempt a = (USKAttempt) i.next();
-                               a.schedule();
+                       if(l == null) return;
+                       // If we schedule them here, we don't get icky 
recursion problems.
+                       else if(!cancelled) {
+                               for(Iterator i=l.iterator();i.hasNext();) {
+                                       // We may be called recursively through 
onSuccess().
+                                       // So don't start obsolete requests.
+                                       USKAttempt a = (USKAttempt) i.next();
+                                       lastEd = uskManager.lookup(origUSK);
+                                       if(lastEd <= a.number && !a.cancelled)
+                                               a.schedule();
+                               }
                        }
                }
        }
@@ -336,8 +345,10 @@
        private synchronized void cancelBefore(long curLatest) {
                for(Iterator i=runningAttempts.iterator();i.hasNext();) {
                        USKAttempt att = (USKAttempt) (i.next());
-                       if(att.number < curLatest)
+                       if(att.number < curLatest) {
                                att.cancel();
+                               i.remove();
+                       }
                }
        }

@@ -350,8 +361,8 @@
                Logger.minor(this, "Adding USKAttempt for "+i+" for 
"+origUSK.getURI());
                if(!runningAttempts.isEmpty()) {
                        USKAttempt last = (USKAttempt) 
runningAttempts.lastElement();
-                       if(last.number > i)
-                               throw new IllegalStateException("Adding "+i+" 
but last was "+last.number);
+                       if(last.number >= i)
+                               return null;
                }
                USKAttempt a = new USKAttempt(i);
                runningAttempts.add(a);

Modified: trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java       
2006-05-17 11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKFetcherWrapper.java       
2006-05-17 13:49:06 UTC (rev 8739)
@@ -11,8 +11,8 @@

        USK usk;

-       public USKFetcherWrapper(USK usk, ClientRequestScheduler chkScheduler, 
ClientRequestScheduler sskScheduler) {
-               super(RequestStarter.UPDATE_PRIORITY_CLASS, chkScheduler, 
sskScheduler, usk);
+       public USKFetcherWrapper(USK usk, short prio, ClientRequestScheduler 
chkScheduler, ClientRequestScheduler sskScheduler) {
+               super(prio, chkScheduler, sskScheduler, usk);
                this.usk = usk;
        }


Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKInserter.java     2006-05-17 
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKInserter.java     2006-05-17 
13:49:06 UTC (rev 8739)
@@ -68,7 +68,7 @@
                Logger.minor(this, "scheduling fetcher for "+pubUSK.getURI());
                synchronized(this) {
                        if(finished) return;
-                       fetcher = 
ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, this);
+                       fetcher = 
ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, parent.priorityClass, 
this);
                }
                fetcher.schedule();
        }
@@ -108,7 +108,7 @@
                        Logger.minor(this, "scheduling insert for 
"+pubUSK.getURI()+" "+edition);
                        try {
                                sbi = new SingleBlockInserter(parent, data, 
compressionCodec, privUSK.getInsertableSSK(edition).getInsertURI(),
-                                               ctx, this, isMetadata, 
sourceLength, token, getCHKOnly, false);
+                                               ctx, this, isMetadata, 
sourceLength, token, getCHKOnly, false, true /* we don't use it */);
                        } catch (InserterException e) {
                                cb.onFailure(e, this);
                                return;

Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java      2006-05-17 
11:37:04 UTC (rev 8738)
+++ trunk/freenet/src/freenet/client/async/USKManager.java      2006-05-17 
13:49:06 UTC (rev 8739)
@@ -91,9 +91,9 @@
                return f;
        }

-       public USKFetcher getFetcherForInsertDontSchedule(USK usk, 
USKFetcherCallback cb) {
+       public USKFetcher getFetcherForInsertDontSchedule(USK usk, short 
prioClass, USKFetcherCallback cb) {
                USKFetcher f = new USKFetcher(usk, this, 
backgroundFetchContext, 
-                               new USKFetcherWrapper(usk, chkRequestScheduler, 
sskRequestScheduler), 3, false);
+                               new USKFetcherWrapper(usk, prioClass, 
chkRequestScheduler, sskRequestScheduler), 3, false);
                f.addCallback(cb);
                return f;
        }
@@ -104,7 +104,7 @@
                synchronized(this) {
                        USKFetcher f = (USKFetcher) 
backgroundFetchersByClearUSK.get(clear);
                        if(f == null) {
-                               f = new USKFetcher(usk, this, 
backgroundFetchContext, new USKFetcherWrapper(usk, chkRequestScheduler, 
sskRequestScheduler), 10, true);
+                               f = new USKFetcher(usk, this, 
backgroundFetchContext, new USKFetcherWrapper(usk, 
RequestStarter.UPDATE_PRIORITY_CLASS, chkRequestScheduler, 
sskRequestScheduler), 10, true);
                                sched = f;
                                backgroundFetchersByClearUSK.put(clear, f);
                        }
@@ -170,7 +170,7 @@
                        if(runBackgroundFetch) {
                                USKFetcher f = (USKFetcher) 
backgroundFetchersByClearUSK.get(clear);
                                if(f == null) {
-                                       f = new USKFetcher(origUSK, this, 
backgroundFetchContext, new USKFetcherWrapper(origUSK, chkRequestScheduler, 
sskRequestScheduler), 10, true);
+                                       f = new USKFetcher(origUSK, this, 
backgroundFetchContext, new USKFetcherWrapper(origUSK, 
RequestStarter.UPDATE_PRIORITY_CLASS, chkRequestScheduler, 
sskRequestScheduler), 10, true);
                                        sched = f;
                                        backgroundFetchersByClearUSK.put(clear, 
f);
                                }

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-05-17 11:37:04 UTC (rev 
8738)
+++ trunk/freenet/src/freenet/node/Version.java 2006-05-17 13:49:06 UTC (rev 
8739)
@@ -18,7 +18,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 715;
+       private static final int buildNumber = 716;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 591;


Reply via email to