Author: toad
Date: 2008-01-26 18:13:11 +0000 (Sat, 26 Jan 2008)
New Revision: 17307
Modified:
trunk/freenet/src/freenet/node/CHKInsertSender.java
trunk/freenet/src/freenet/node/InsertHandler.java
Log:
CHKInsertSender: Don't set the status code until we have finished receiving the
data.
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2008-01-26 17:39:00 UTC
(rev 17306)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2008-01-26 18:13:11 UTC
(rev 17307)
@@ -15,6 +15,7 @@
import freenet.io.comm.NotConnectedException;
import freenet.io.comm.PeerContext;
import freenet.io.xfer.AbortedException;
+import freenet.io.xfer.BlockReceiver;
import freenet.io.xfer.BlockTransmitter;
import freenet.io.xfer.PartiallyReceivedBlock;
import freenet.keys.CHKBlock;
@@ -172,6 +173,13 @@
this.closestLocation = closestLocation;
this.startTime = System.currentTimeMillis();
this.backgroundTransfers = new Vector();
+ try {
+ if(prb.allReceived())
+ receiveCompleted = true;
+ } catch (AbortedException e) {
+ receiveFailed = true;
+ // Handle the rest of the consequences in realRun().
+ }
logMINOR = Logger.shouldLog(Logger.MINOR, this);
}
@@ -197,6 +205,7 @@
final PartiallyReceivedBlock prb;
final boolean fromStore;
private boolean receiveFailed;
+ private boolean receiveCompleted;
final double closestLocation;
final long startTime;
private boolean sentRequest;
@@ -606,6 +615,34 @@
private void finish(int code, PeerNode next) {
if(logMINOR) Logger.minor(this, "Finished: "+code+" on "+this, new
Exception("debug"));
+ // Don't set the status code until we have received the data.
+
+ // FIXME remove timeout and just wait on
TRANSFER_COMPLETION_ACK_TIMEOUT below
+ long receiveTimeout = System.currentTimeMillis() +
(BlockReceiver.MAX_CONSECUTIVE_MISSING_PACKET_REPORTS *
BlockReceiver.RECEIPT_TIMEOUT * 3);
+ if(receiveCompleted) {
+ synchronized(backgroundTransfers) {
+ while(true) {
+ if(receiveCompleted) break;
+ try {
+ //FIXME delete below and reinstate:
backgroundTransfers.wait(TRANSFER_COMPLETION_ACK_TIMEOUT);
+ int delay = (int) (receiveTimeout -
System.currentTimeMillis());
+ if(delay > 0)
backgroundTransfers.wait(delay);
+ else if(!receiveCompleted) {
+ Logger.error(this, "Timeout
waiting for transfer completion on "+this);
+ code = RECEIVE_FAILED;
+ receiveFailed = true;
+ receiveCompleted = true;
+ break;
+ }
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ }
+ if(receiveFailed)
+ code = RECEIVE_FAILED;
+ }
+
synchronized(this) {
if((code == ROUTE_NOT_FOUND) && !sentRequest)
code = ROUTE_REALLY_NOT_FOUND;
@@ -659,6 +696,7 @@
public void receiveFailed() {
synchronized(backgroundTransfers) {
receiveFailed = true;
+ receiveCompleted = true;
backgroundTransfers.notifyAll();
}
// Set status immediately.
@@ -674,6 +712,16 @@
}
/**
+ * Called by InsertHandler to notify that the receive has finished
successfully.
+ */
+ public void receiveCompleted() {
+ synchronized(backgroundTransfers) {
+ receiveCompleted = true;
+ backgroundTransfers.notifyAll();
+ }
+ }
+
+ /**
* @return The current status as a string
*/
public synchronized String getStatusString() {
Modified: trunk/freenet/src/freenet/node/InsertHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertHandler.java 2008-01-26 17:39:00 UTC
(rev 17306)
+++ trunk/freenet/src/freenet/node/InsertHandler.java 2008-01-26 18:13:11 UTC
(rev 17307)
@@ -420,6 +420,8 @@
if(logMINOR) Logger.minor(this, "Receiving data for
"+InsertHandler.this);
try {
br.receive();
+ if(sender != null)
+ sender.receiveCompleted();
if(logMINOR) Logger.minor(this, "Received data for
"+InsertHandler.this);
synchronized(InsertHandler.this) {
receiveCompleted = true;