Author: toad
Date: 2008-06-19 15:16:03 +0000 (Thu, 19 Jun 2008)
New Revision: 20490

Modified:
   branches/db4o/freenet/src/freenet/client/FECCallback.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
Log:
Add FECCallback.onFailed().
If a callback throws, feed it to onFailed(), and commit anyway, so we always 
delete the FECJob, even if it throws... so we don't end up with the same error 
on every startup.

Modified: branches/db4o/freenet/src/freenet/client/FECCallback.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/FECCallback.java   2008-06-19 
15:11:46 UTC (rev 20489)
+++ branches/db4o/freenet/src/freenet/client/FECCallback.java   2008-06-19 
15:16:03 UTC (rev 20490)
@@ -19,4 +19,7 @@
        public void onEncodedSegment(ObjectContainer container, ClientContext 
context);

        public void onDecodedSegment(ObjectContainer container, ClientContext 
context);
+
+       /** Something broke. */
+       public void onFailed(Throwable t, ObjectContainer container, 
ClientContext context);
 }
\ No newline at end of file

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-19 15:11:46 UTC (rev 20489)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-19 15:16:03 UTC (rev 20490)
@@ -692,4 +692,15 @@
                                checkCooldownTimes[blockNo - 
dataCooldownTimes.length] = -1;
                }
        }
+
+       public void onFailed(Throwable t, ObjectContainer container, 
ClientContext context) {
+               synchronized(this) {
+                       if(finished) {
+                               Logger.error(this, "FEC decode or encode failed 
but already finished: "+t, t);
+                               return;
+                       }
+                       finished = true;
+               }
+               this.fail(new FetchException(FetchException.INTERNAL_ERROR, 
"FEC failure: "+t, t), container, context);
+       }
 }

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java    
    2008-06-19 15:11:46 UTC (rev 20489)
+++ 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java    
    2008-06-19 15:16:03 UTC (rev 20490)
@@ -679,6 +679,10 @@
                        if (toThrow != null)
                                toThrow = new 
InsertException(InsertException.CANCELLED);
                }
+               cancelInner(container, context);
+       }
+
+       private void cancelInner(ObjectContainer container, ClientContext 
context) {
                for (int i = 0; i < dataBlockInserters.length; i++) {
                        SingleBlockInserter sbi = dataBlockInserters[i];
                        if (sbi != null)
@@ -737,4 +741,17 @@
                context.backgroundBlockEncoder.queue(dataBlockInserters, 
container, context);
                context.backgroundBlockEncoder.queue(checkBlockInserters, 
container, context);
        }
+
+       public void onFailed(Throwable t, ObjectContainer container, 
ClientContext context) {
+               synchronized(this) {
+                       if(finished) {
+                               Logger.error(this, "FEC decode or encode failed 
but already finished: "+t, t);
+                               return;
+                       }
+                       finished = true;
+                       Logger.error(this, "Insert segment failed: "+t+" for 
"+this, t);
+                       this.toThrow = new 
InsertException(InsertException.INTERNAL_ERROR, "FEC failure: "+t, null);
+               }
+               cancelInner(container, context);
+       }
 }


Reply via email to