On Mon, Jul 10, 2006 at 10:22:21AM +0000, nextgens at freenetproject.org wrote:
> Author: nextgens
> Date: 2006-07-10 10:22:11 +0000 (Mon, 10 Jul 2006)
> New Revision: 9540
> 
> Log:
> * More consistent locking in freenet/client/async, following lint4j 
> recommendations
> * some log messages have switched from minor to debug
> 
> this patch might cause more backoff, but hasn't deadlocked since it's running 
> here

Why do you remove locking on remove? Apart from that, okay, but please
avoid nested and long locks if at all possible.
> 
> Modified: trunk/freenet/src/freenet/client/ArchiveStoreContext.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/ArchiveStoreContext.java 2006-07-10 
> 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/ArchiveStoreContext.java 2006-07-10 
> 10:22:11 UTC (rev 9540)
> @@ -54,7 +54,7 @@
>               Logger.minor(this, "Checking cache: "+key+" "+internalName);
>               if((data = manager.getCached(key, internalName)) != null) {
>                       return data;
> -             }
> +             }       
>               
>               return null;
>       }
> @@ -74,7 +74,7 @@
>  
>       // Archive hash
>       
> -     byte[] lastHash = null;
> +     byte[] lastHash;
>       
>       /** Returns the hash of the archive last time we fetched it, or null */
>       public byte[] getLastHash() {
> @@ -95,12 +95,10 @@
>        * Remove all ArchiveStoreItems with this key from the cache.
>        */
>       public void removeAllCachedItems() {
> -             synchronized(myItems) {
> -                     ArchiveStoreItem item;
> -                     while((item = (ArchiveStoreItem) myItems.pop()) != 
> null) {
> -                             manager.removeCachedItem(item);
> -                             item.finalize();
> -                     }
> +             ArchiveStoreItem item;
> +             while((item = (ArchiveStoreItem) myItems.pop()) != null) {
> +                     manager.removeCachedItem(item);
> +                     item.finalize();
>               }
>       }
>  
> 
> Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/ClientGetter.java  2006-07-10 
> 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/ClientGetter.java  2006-07-10 
> 10:22:11 UTC (rev 9540)
> @@ -53,7 +53,7 @@
>               archiveRestarts = 0;
>       }
>       
> -     public void start() throws FetchException {
> +     public synchronized void start() throws FetchException {
>               try {
>                       currentState = SingleFileFetcher.create(this, this, new 
> ClientMetadata(),
>                                       uri, ctx, actx, 
> ctx.maxNonSplitfileRetries, 0, false, null, true,
> @@ -65,7 +65,7 @@
>               }
>       }
>  
> -     public void onSuccess(FetchResult result, ClientGetState state) {
> +     public synchronized void onSuccess(FetchResult result, ClientGetState 
> state) {
>               finished = true;
>               currentState = null;
>               if((returnBucket != null) && (result.asBucket() != 
> returnBucket)) {
> @@ -87,7 +87,7 @@
>               client.onSuccess(result, this);
>       }
>  
> -     public void onFailure(FetchException e, ClientGetState state) {
> +     public synchronized void onFailure(FetchException e, ClientGetState 
> state) {
>               while(true) {
>                       if(e.mode == FetchException.ARCHIVE_RESTART) {
>                               archiveRestarts++;
> @@ -120,7 +120,7 @@
>               }
>       }
>  
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished || cancelled;
>       }
>  
> 
> Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/ClientPutter.java  2006-07-10 
> 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/ClientPutter.java  2006-07-10 
> 10:22:11 UTC (rev 9540)
> @@ -51,7 +51,7 @@
>               this.cancelled = false;
>       }
>  
> -     public void start() throws InserterException {
> +     public synchronized void start() throws InserterException {
>               try {
>                       currentState =
>                               new SingleFileInserter(this, this, new 
> InsertBlock(data, cm, targetURI), isMetadata, ctx, false, getCHKOnly, false, 
> null, false);
> @@ -66,13 +66,13 @@
>               }
>       }
>  
> -     public void onSuccess(ClientPutState state) {
> +     public synchronized void onSuccess(ClientPutState state) {
>               finished = true;
>               currentState = null;
>               client.onSuccess(this);
>       }
>  
> -     public void onFailure(InserterException e, ClientPutState state) {
> +     public synchronized void onFailure(InserterException e, ClientPutState 
> state) {
>               finished = true;
>               currentState = null;
>               client.onFailure(e, this);
> @@ -83,15 +83,13 @@
>               client.onGeneratedURI(uri, this);
>       }
>       
> -     public void cancel() {
> -             synchronized(this) {
> -                     super.cancel();
> -                     if(currentState != null)
> -                             currentState.cancel();
> -             }
> +     public synchronized void cancel() {
> +             super.cancel();
> +             if(currentState != null)
> +                     currentState.cancel();
>       }
>       
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished || cancelled;
>       }
>  
> 
> Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java        
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java        
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -182,11 +182,12 @@
>               int priority;
>               
>               short fuzz = -1, iteration = 0;
> -             if(choosenPriorityScheduler.equals(PRIORITY_SOFT))
> -                     fuzz = -1;
> -             else if(choosenPriorityScheduler.equals(PRIORITY_HARD))
> -                     fuzz = 0;
> -             
> +             synchronized (this) {
> +                     if(choosenPriorityScheduler.equals(PRIORITY_SOFT))
> +                             fuzz = -1;
> +                     else if(choosenPriorityScheduler.equals(PRIORITY_HARD))
> +                             fuzz = 0;       
> +             }
>               // we loop to ensure we try every possibilities ( n + 1)
>               //
>               // PRIO will do 0,1,2,3,4,5,6,0
> @@ -195,11 +196,11 @@
>                       priority = fuzz<0 ? 
> tweakedPrioritySelector[random.nextInt(tweakedPrioritySelector.length)] : 
> prioritySelector[Math.abs(fuzz % prioritySelector.length)];
>                       result = priorities[priority];
>                       if((result != null) && !result.isEmpty()) {
> -                             Logger.minor(this, "Found "+priority);
> +                             Logger.minor(this, "using priority : 
> "+priority);
>                               return result;
>                       }
>                       
> -                     Logger.minor(this, "Priority "+priority+" is null (fuzz 
> = "+fuzz+")");
> +                     Logger.debug(this, "Priority "+priority+" is null (fuzz 
> = "+fuzz+")");
>                       fuzz++;
>               }
>               
> 
> Modified: 
> trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java    
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/MultiPutCompletionCallback.java    
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -32,13 +32,11 @@
>               finished = false;
>       }
>  
> -     public void onSuccess(ClientPutState state) {
> -             synchronized(this) {
> +     public synchronized void onSuccess(ClientPutState state) {
>                       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
> @@ -78,14 +76,13 @@
>               waitingFor.add(ps);
>       }
>  
> -     public void arm() {
> +     public synchronized void arm() {
>               boolean allDone;
>               boolean allGotBlocks;
> -             synchronized(this) {
> -                     started = true;
> -                     allDone = waitingFor.isEmpty();
> -                     allGotBlocks = waitingForBlockSet.isEmpty();
> -             }
> +             started = true;
> +             allDone = waitingFor.isEmpty();
> +             allGotBlocks = waitingForBlockSet.isEmpty();
> +
>               if(allGotBlocks) {
>                       cb.onBlockSetFinished(this);
>               }
> @@ -126,7 +123,7 @@
>               }
>       }
>  
> -     public void onMetadata(Metadata m, ClientPutState state) {
> +     public synchronized void onMetadata(Metadata m, ClientPutState state) {
>               if(generator == state) {
>                       cb.onMetadata(m, this);
>               } else {
> 
> Modified: 
> trunk/freenet/src/freenet/client/async/PrioritySchedulerCallback.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/PrioritySchedulerCallback.java     
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/PrioritySchedulerCallback.java     
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -8,7 +8,7 @@
>       ClientRequestScheduler cs;
>       
>       PrioritySchedulerCallback(ClientRequestScheduler cs){
> -             this.value = new String(ClientRequestScheduler.PRIORITY_HARD);
> +             this.value = ClientRequestScheduler.PRIORITY_HARD;
>               this.cs = cs;
>       }
>       
> 
> Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java  
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java  
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -194,10 +194,10 @@
>       private long totalSize;
>       private boolean metadataBlockSetFinalized;
>       private Metadata baseMetadata;
> -     private boolean hasResolvedBase = false;
> +     private boolean hasResolvedBase;
>       private final static String[] defaultDefaultNames =
>               new String[] { "index.html", "index.htm", "default.html", 
> "default.htm" };
> -     private int bytesOnZip = 0;
> +     private int bytesOnZip;
>       private LinkedList elementsToPutInZip;
>       
>       public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler 
> chkSched,
> @@ -224,12 +224,10 @@
>               // FIXME do something.
>       }
>  
> -     public void start() throws InserterException {
> +     public synchronized void start() throws InserterException {
>               Logger.minor(this, "Starting "+this);
>               PutHandler[] running;
> -             synchronized(this) {
> -                     running = (PutHandler[]) runningPutHandlers.toArray(new 
> PutHandler[runningPutHandlers.size()]);
> -             }
> +             running = (PutHandler[]) runningPutHandlers.toArray(new 
> PutHandler[runningPutHandlers.size()]);
>  
>               try {
>                       for(int i=0;i<running.length;i++) {
> @@ -309,7 +307,7 @@
>               return finalURI;
>       }
>  
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished || cancelled;
>       }
>  
> @@ -339,10 +337,6 @@
>               resolveAndStartBase();
>               
>       }
> -
> -     private void startMetadataInsert() {
> -             resolveAndStartBase();
> -     }
>       
>       private void resolveAndStartBase() {
>               Bucket bucket = null;
> 
> Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java   
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java   
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -36,7 +36,6 @@
>       private final FailureCodeTracker errors;
>       private boolean finished;
>       private final boolean dontSendEncoded;
> -     private ClientKey key;
>       private WeakReference refToClientKeyBlock;
>       final int token; // for e.g. splitfiles
>       private final Object tokenObject;
> @@ -191,8 +190,10 @@
>  
>       public ClientKeyBlock getBlock() {
>               try {
> -                     if(finished) return null;
> -                     return encode();
> +                     synchronized (this) {
> +                             if(finished) return null;
> +                             return encode();                                
> +                     }
>               } catch (InserterException e) {
>                       cb.onFailure(e, this);
>                       return null;
> @@ -203,7 +204,7 @@
>               }
>       }
>  
> -     public void schedule() throws InserterException {
> +     public synchronized void schedule() throws InserterException {
>               if(finished) return;
>               if(getCHKOnly) {
>                       ClientKeyBlock block = encode();
> @@ -224,7 +225,7 @@
>               else throw new IllegalArgumentException();
>       }
>  
> -     public FreenetURI getURI() {
> +     public synchronized FreenetURI getURI() {
>               if(resultingURI == null)
>                       getBlock();
>               return resultingURI;
> @@ -251,7 +252,7 @@
>               cb.onFailure(new 
> InserterException(InserterException.CANCELLED), this);
>       }
>  
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished;
>       }
>  
> 
> Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SingleFileInserter.java    
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java    
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -42,7 +42,7 @@
>       final boolean insertAsArchiveManifest;
>       /** If true, we are not the top level request, and should not
>        * update our parent to point to us as current put-stage. */
> -     private boolean cancelled = false;
> +     private boolean cancelled;
>       private boolean reportMetadataOnly;
>       public final Object token;
>  
> @@ -230,7 +230,6 @@
>                       cb.onTransition(this, sh);
>                       sfi.start();
>               }
> -             return;
>       }
>       
>       private ClientPutState createInserter(BaseClientPutter parent, Bucket 
> data, short compressionCodec, FreenetURI uri, 
> @@ -258,11 +257,11 @@
>  
>               ClientPutState sfi;
>               ClientPutState metadataPutter;
> -             boolean finished = false;
> -             boolean splitInsertSuccess = false;
> -             boolean metaInsertSuccess = false;
> -             boolean splitInsertSetBlocks = false;
> -             boolean metaInsertSetBlocks = false;
> +             boolean finished;
> +             boolean splitInsertSuccess;
> +             boolean metaInsertSuccess;
> +             boolean splitInsertSetBlocks;
> +             boolean metaInsertSetBlocks;
>  
>               public synchronized void onTransition(ClientPutState oldState, 
> ClientPutState newState) {
>                       if(oldState == sfi)
> @@ -298,7 +297,7 @@
>                       fail(e);
>               }
>  
> -             public void onMetadata(Metadata meta, ClientPutState state) {
> +             public synchronized void onMetadata(Metadata meta, 
> ClientPutState state) {
>                       if(finished) return;
>                       if(state == metadataPutter) {
>                               Logger.error(this, "Got metadata for metadata");
> @@ -311,31 +310,30 @@
>                               cb.onMetadata(meta, this);
>                               metaInsertSuccess = true;
>                       } else {
> -                             synchronized(this) {
> -                                     Bucket metadataBucket;
> -                                     try {
> -                                             metadataBucket = 
> BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
> -                                     } catch (IOException e) {
> -                                             InserterException ex = new 
> InserterException(InserterException.BUCKET_ERROR, e, null);
> -                                             fail(ex);
> -                                             return;
> -                                     } catch (MetadataUnresolvedException e) 
> {
> -                                             Logger.error(this, "Impossible: 
> "+e, e);
> -                                             InserterException ex = new 
> InserterException(InserterException.INTERNAL_ERROR, 
> "MetadataUnresolvedException in SingleFileInserter.SplitHandler: "+e, null);
> -                                             ex.initCause(e);
> -                                             fail(ex);
> -                                             return;
> -                                     }
> -                                     InsertBlock newBlock = new 
> InsertBlock(metadataBucket, null, block.desiredURI);
> -                                     try {
> -                                             metadataPutter = new 
> SingleFileInserter(parent, this, newBlock, true, ctx, false, getCHKOnly, 
> false, token, false);
> -                                             Logger.minor(this, "Putting 
> metadata on "+metadataPutter);
> -                                     } catch (InserterException e) {
> -                                             cb.onFailure(e, this);
> -                                             return;
> -                                     }
> +                             Bucket metadataBucket;
> +                             try {
> +                                     metadataBucket = 
> BucketTools.makeImmutableBucket(ctx.bf, meta.writeToByteArray());
> +                             } catch (IOException e) {
> +                                     InserterException ex = new 
> InserterException(InserterException.BUCKET_ERROR, e, null);
> +                                     fail(ex);
> +                                     return;
> +                             } catch (MetadataUnresolvedException e) {
> +                                     Logger.error(this, "Impossible: "+e, e);
> +                                     InserterException ex = new 
> InserterException(InserterException.INTERNAL_ERROR, 
> "MetadataUnresolvedException in SingleFileInserter.SplitHandler: "+e, null);
> +                                     ex.initCause(e);
> +                                     fail(ex);
> +                                     return;
>                               }
> +                             InsertBlock newBlock = new 
> InsertBlock(metadataBucket, null, block.desiredURI);
>                               try {
> +                                     metadataPutter = new 
> SingleFileInserter(parent, this, newBlock, true, ctx, false, getCHKOnly, 
> false, token, false);
> +                                     Logger.minor(this, "Putting metadata on 
> "+metadataPutter);
> +                             } catch (InserterException e) {
> +                                     cb.onFailure(e, this);
> +                                     return;
> +                             }
> +
> +                             try {
>                                       
> ((SingleFileInserter)metadataPutter).start();
>                               } catch (InserterException e) {
>                                       fail(e);
> @@ -359,12 +357,12 @@
>                       return parent;
>               }
>  
> -             public void onEncode(BaseClientKey key, ClientPutState state) {
> +             public synchronized void onEncode(BaseClientKey key, 
> ClientPutState state) {
>                       if(state == metadataPutter)
>                               cb.onEncode(key, this);
>               }
>  
> -             public void cancel() {
> +             public synchronized void cancel() {
>                       if(sfi != null)
>                               sfi.cancel();
>                       if(metadataPutter != null)
> 
> Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java       
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java       
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -88,7 +88,7 @@
>               Logger.minor(this, "Created "+this+" for "+parentFetcher);
>       }
>  
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished;
>       }
>  
> @@ -129,7 +129,7 @@
>       }
>  
>       /** How many blocks failed permanently due to fatal errors? */
> -     public int fatallyFailedBlocks() {
> +     public synchronized int fatallyFailedBlocks() {
>               return fatallyFailedBlocks;
>       }
>  
> 
> Modified: trunk/freenet/src/freenet/client/async/SplitFileInserter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SplitFileInserter.java     
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SplitFileInserter.java     
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -10,7 +10,6 @@
>  import freenet.client.InserterException;
>  import freenet.client.Metadata;
>  import freenet.keys.CHKBlock;
> -import freenet.keys.ClientCHKBlock;
>  import freenet.keys.FreenetURI;
>  import freenet.support.Bucket;
>  import freenet.support.BucketTools;
> @@ -154,8 +153,9 @@
>                               // Create Metadata
>                               m = new Metadata(splitfileAlgorithm, dataURIs, 
> checkURIs, segmentSize, checkSegmentSize, cm, dataLength, compressionCodec, 
> isMetadata, insertAsArchiveManifest);
>                       }
> -                     haveSentMetadata = true;
>               }
> +             haveSentMetadata = true;
> +             
>               if(missingURIs) {
>                       Logger.minor(this, "Missing URIs");
>                       // Error
> 
> Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java      
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java      
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -9,7 +9,6 @@
>  import freenet.client.Metadata;
>  import freenet.keys.BaseClientKey;
>  import freenet.keys.CHKBlock;
> -import freenet.keys.ClientCHKBlock;
>  import freenet.keys.FreenetURI;
>  import freenet.support.Bucket;
>  import freenet.support.Logger;
> @@ -60,8 +59,6 @@
>                       dataBlockInserters[i].schedule();
>               }
>               if(splitfileAlgo == null) {
> -                     // Don't need to encode blocks
> -             } else {
>                       // Encode blocks
>                       Thread t = new Thread(new EncodeBlocksRunnable(), 
> "Blocks encoder");
>                       t.setDaemon(true);
> @@ -113,8 +110,8 @@
>               synchronized(this) {
>                       if(finished) return;
>                       finished = true;
> +                     toThrow = InserterException.construct(errors);
>               }
> -             toThrow = InserterException.construct(errors);
>               parent.segmentFinished(this);
>       }
>       
> @@ -172,30 +169,29 @@
>               finish();
>       }
>  
> -     private boolean completed(int x) {
> +     private synchronized boolean completed(int x) {
>               Logger.minor(this, "Completed: "+x+" on "+this+" ( 
> completed="+blocksCompleted+", 
> total="+(dataBlockInserters.length+checkBlockInserters.length));
> -             synchronized(this) {
> -                     if(finished) return true;
> -                     if(x >= dataBlocks.length) {
> -                             if(checkBlockInserters[x-dataBlocks.length] == 
> null) {
> -                                     Logger.error(this, "Completed twice: 
> check block "+x+" on "+this);
> -                                     return true;
> -                             }
> -                             checkBlockInserters[x-dataBlocks.length] = null;
> -                     } else {
> -                             if(dataBlockInserters[x] == null) {
> -                                     Logger.error(this, "Completed twice: 
> data block "+x+" on "+this);
> -                                     return true;
> -                             }
> -                             dataBlockInserters[x] = null;
> +
> +             if(finished) return true;
> +             if(x >= dataBlocks.length) {
> +                     if(checkBlockInserters[x-dataBlocks.length] == null) {
> +                             Logger.error(this, "Completed twice: check 
> block "+x+" on "+this);
> +                             return true;
>                       }
> -                     blocksCompleted++;
> -                     if(blocksCompleted != dataBlockInserters.length + 
> checkBlockInserters.length) return true;
> -                     return false;
> +                     checkBlockInserters[x-dataBlocks.length] = null;
> +             } else {
> +                     if(dataBlockInserters[x] == null) {
> +                             Logger.error(this, "Completed twice: data block 
> "+x+" on "+this);
> +                             return true;
> +                     }
> +                     dataBlockInserters[x] = null;
>               }
> +             blocksCompleted++;
> +             if(blocksCompleted != dataBlockInserters.length + 
> checkBlockInserters.length) return true;
> +             return false;
>       }
>  
> -     public boolean isFinished() {
> +     public synchronized boolean isFinished() {
>               return finished;
>       }
>       
> @@ -216,16 +212,18 @@
>       }
>       
>       InserterException getException() {
> -             return toThrow;
> +             synchronized (this) {
> +                     return toThrow;                 
> +             }
>       }
>  
>       public void cancel() {
>               synchronized(this) {
>                       if(finished) return;
>                       finished = true;
> +                     if(toThrow != null)
> +                             toThrow = new 
> InserterException(InserterException.CANCELLED);
>               }
> -             if(toThrow != null)
> -                     toThrow = new 
> InserterException(InserterException.CANCELLED);
>               for(int i=0;i<dataBlockInserters.length;i++) {
>                       SingleBlockInserter sbi = dataBlockInserters[i];
>                       if(sbi != null)
> @@ -252,7 +250,7 @@
>               Logger.error(this, "Should not happen: 
> onBlockSetFinished("+state+") on "+this);
>       }
>  
> -     public boolean hasURIs() {
> +     public synchronized boolean hasURIs() {
>               return hasURIs;
>       }
>  }
> 
> Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/USKFetcher.java    2006-07-10 
> 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/USKFetcher.java    2006-07-10 
> 10:22:11 UTC (rev 9540)
> @@ -99,7 +99,7 @@
>               boolean succeeded;
>               /** DNF? */
>               boolean dnf;
> -             boolean cancelled = false;
> +             boolean cancelled;
>               public USKAttempt(long i) {
>                       this.number = i;
>                       this.succeeded = false;
> @@ -181,7 +181,7 @@
>       /** Keep going forever? */
>       private final boolean backgroundPoll;
>       
> -     private boolean started = false;
> +     private boolean started;
>  
>       USKFetcher(USK origUSK, USKManager manager, FetcherContext ctx, 
> ClientRequester parent, int minFailures, boolean pollForever) {
>               this(origUSK, manager, ctx, parent, minFailures, pollForever, 
> DEFAULT_MAX_MIN_FAILURES);
> @@ -227,6 +227,8 @@
>       private void finishSuccess() {
>               if(backgroundPoll) {
>                       long valAtEnd = uskManager.lookup(origUSK);
> +                     long end, newValAtEnd;
> +                     long now = System.currentTimeMillis();
>                       synchronized(this) {
>                               started = false; // don't finish before have 
> rescheduled
>                               if(valAtEnd > valueAtSchedule) {
> @@ -243,10 +245,9 @@
>                               long newSleepTime = sleepTime * 2;
>                               if(newSleepTime > maxSleepTime) newSleepTime = 
> maxSleepTime;
>                               sleepTime = newSleepTime;
> +                             end = now + sleepTime;
> +                             newValAtEnd = valAtEnd;
>                       }
> -                     long now = System.currentTimeMillis();
> -                     long end = now + sleepTime;
> -                     long newValAtEnd = valAtEnd;
>                       // FIXME do this without occupying a thread
>                       while((now < end) && ((newValAtEnd = 
> uskManager.lookup(origUSK)) == valAtEnd)) {
>                               long d = end - now;
> @@ -311,17 +312,18 @@
>                               }
>                       }
>                       cancelBefore(curLatest);
> -             }
> -             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();
> +
> +                     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();
> +                             }
>                       }
>               }
>       }
> @@ -330,9 +332,10 @@
>               synchronized(this) {
>                       runningAttempts.remove(att);
>                       if(!runningAttempts.isEmpty()) return;
> +             
> +                     if(cancelled)
> +                             finishCancelled();
>               }
> -             if(cancelled)
> -                     finishCancelled();
>       }
>  
>       private void finishCancelled() {
> @@ -386,7 +389,9 @@
>       }
>  
>       public boolean isFinished() {
> -             return completed || cancelled;
> +             synchronized (this) {
> +                     return completed || cancelled;                  
> +             }
>       }
>  
>       public USK getOriginalUSK() {
> @@ -404,10 +409,10 @@
>                               add(i);
>                       attempts = (USKAttempt[]) runningAttempts.toArray(new 
> USKAttempt[runningAttempts.size()]);
>                       started = true;
> -             }
>               if(!cancelled)
>                       for(int i=0;i<attempts.length;i++)
>                               attempts[i].schedule();
> +             }
>       }
>  
>       public void cancel() {
> @@ -439,23 +444,23 @@
>               subscribers.remove(cb);
>       }
>  
> -     public boolean hasLastData() {
> +     public synchronized boolean hasLastData() {
>               return this.lastRequestData != null;
>       }
>  
> -     public boolean lastContentWasMetadata() {
> +     public synchronized boolean lastContentWasMetadata() {
>               return this.lastWasMetadata;
>       }
>  
> -     public short lastCompressionCodec() {
> +     public synchronized short lastCompressionCodec() {
>               return this.lastCompressionCodec;
>       }
>  
> -     public Bucket getLastData() {
> +     public synchronized Bucket getLastData() {
>               return this.lastRequestData;
>       }
>  
> -     public void freeLastData() {
> +     public synchronized void freeLastData() {
>               lastRequestData.free();
>               lastRequestData = null;
>       }
> 
> Modified: trunk/freenet/src/freenet/client/async/USKInserter.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/USKInserter.java   2006-07-10 
> 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/client/async/USKInserter.java   2006-07-10 
> 10:22:11 UTC (rev 9540)
> @@ -42,7 +42,7 @@
>       private SingleBlockInserter sbi;
>       private long edition;
>       /** Number of collisions while trying to insert so far */
> -     private int consecutiveCollisions = 0;
> +     private int consecutiveCollisions;
>       private boolean finished;
>       /** After attempting inserts on this many slots, go back to the Fetcher 
> */
>       private static final long MAX_TRIED_SLOTS = 10;
> @@ -65,16 +65,15 @@
>        * The Fetcher must be insert-mode, in other words, it must know that 
> we want the latest edition,
>        * including author errors and so on.
>        */
> -     private void scheduleFetcher() {
> +     private synchronized void scheduleFetcher() {
>               Logger.minor(this, "scheduling fetcher for "+pubUSK.getURI());
> -             synchronized(this) {
> -                     if(finished) return;
> -                     fetcher = 
> ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, parent.priorityClass, 
> this);
> -             }
> +             if(finished) return;
> +             fetcher = 
> ctx.uskManager.getFetcherForInsertDontSchedule(pubUSK, parent.priorityClass, 
> this);
> +
>               fetcher.schedule();
>       }
>  
> -     public void onFoundEdition(long l, USK key) {
> +     public synchronized void onFoundEdition(long l, USK key) {
>               edition = Math.max(l, edition);
>               consecutiveCollisions = 0;
>               if((fetcher.lastContentWasMetadata() == isMetadata) && 
> fetcher.hasLastData()
> @@ -87,10 +86,8 @@
>                                       // Success!
>                                       cb.onEncode(pubUSK.copy(edition), this);
>                                       cb.onSuccess(this);
> -                                     synchronized(this) {
> -                                             finished = true;
> -                                             sbi = null;
> -                                     }
> +                                     finished = true;
> +                                     sbi = null;
>                                       return;
>                               }
>                       } catch (IOException e) {
> @@ -101,19 +98,17 @@
>               scheduleInsert();
>       }
>  
> -     private void scheduleInsert() {
> +     private synchronized void scheduleInsert() {
>               long edNo = Math.max(edition, ctx.uskManager.lookup(pubUSK))+1;
> -             synchronized(this) {
> -                     if(finished) return;
> -                     edition = edNo;
> -                     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, true /* we don't use it */, 
> tokenObject);
> -                     } catch (InserterException e) {
> -                             cb.onFailure(e, this);
> -                             return;
> -                     }
> +             if(finished) return;
> +             edition = edNo;
> +             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, true /* we don't use it */, tokenObject);
> +             } catch (InserterException e) {
> +                     cb.onFailure(e, this);
> +                     return;
>               }
>               try {
>                       sbi.schedule();
> @@ -122,13 +117,11 @@
>               }
>       }
>  
> -     public void onSuccess(ClientPutState state) {
> +     public synchronized void onSuccess(ClientPutState state) {
>               cb.onEncode(pubUSK.copy(edition), this);
>               cb.onSuccess(this);
> -             synchronized(this) {
> -                     finished = true;
> -                     sbi = null;
> -             }
> +             finished = true;
> +             sbi = null;
>               FreenetURI targetURI = pubUSK.getSSK(edition).getURI();
>               FreenetURI realURI = ((SingleBlockInserter)state).getURI();
>               if(!targetURI.equals(realURI))
> @@ -140,7 +133,7 @@
>               // FINISHED!!!! Yay!!!
>       }
>  
> -     public void onFailure(InserterException e, ClientPutState state) {
> +     public synchronized void onFailure(InserterException e, ClientPutState 
> state) {
>               sbi = null;
>               if(e.getMode() == InserterException.COLLISION) {
>                       // Try the next slot
> @@ -195,7 +188,7 @@
>               scheduleInsert();
>       }
>  
> -     public void onCancelled() {
> +     public synchronized void onCancelled() {
>               if(finished) return;
>               Logger.error(this, "Unexpected onCancelled()", new 
> Exception("error"));
>               cancel();
> 
> Modified: 
> trunk/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java
> ===================================================================
> --- trunk/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java    
> 2006-07-10 01:50:31 UTC (rev 9539)
> +++ trunk/freenet/src/freenet/support/SimpleIntNumberedItemComparator.java    
> 2006-07-10 10:22:11 UTC (rev 9540)
> @@ -12,7 +12,7 @@
>       
>      public int compare(Object o1, Object o2) {
>          int x = ocompare(o1, o2);
> -        Logger.minor(this, "compare("+o1+","+o2+") = "+x);
> +       Logger.debug(this, "compare("+o1+","+o2+") = "+x);
>          return x;
>      }
>      
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> 

-- 
Matthew J Toseland - toad at amphibian.dyndns.org
Freenet Project Official Codemonkey - http://freenetproject.org/
ICTHUS - Nothing is impossible. Our Boss says so.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20060711/9bca4670/attachment.pgp>

Reply via email to