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>