Author: robert
Date: 2008-01-10 19:23:00 +0000 (Thu, 10 Jan 2008)
New Revision: 16997

Modified:
   trunk/freenet/src/freenet/io/comm/RetrievalException.java
   trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
Log:
tell the reciever if we are not transmitting anymore, and why


Modified: trunk/freenet/src/freenet/io/comm/RetrievalException.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/RetrievalException.java   2008-01-10 
19:19:20 UTC (rev 16996)
+++ trunk/freenet/src/freenet/io/comm/RetrievalException.java   2008-01-10 
19:23:00 UTC (rev 16997)
@@ -40,6 +40,7 @@
     public static final int NO_DATAINSERT = 8;
     public static final int CANCELLED_BY_RECEIVER = 9;
        public static final int RANGE_UNSUPPORTED = 10; //was 4
+       public static final int RECEIVER_DIED = 11;

        int _reason;
        String _cause;
@@ -50,7 +51,7 @@
        }

        public RetrievalException(int reason, String cause) {
-               this(reason);
+               _reason = reason;
                _cause = cause;
                if (cause==null || cause.length()==0 || cause.equals("null"))
                        _cause=getErrString(reason);

Modified: trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java     2008-01-10 
19:19:20 UTC (rev 16996)
+++ trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java     2008-01-10 
19:23:00 UTC (rev 16997)
@@ -30,6 +30,7 @@
 import freenet.io.comm.MessageFilter;
 import freenet.io.comm.NotConnectedException;
 import freenet.io.comm.PeerContext;
+import freenet.io.comm.RetrievalException;
 import freenet.node.PeerNode;
 import freenet.support.BitArray;
 import freenet.support.DoubleTokenBucket;
@@ -208,6 +209,7 @@
                                                _sendComplete = true;
                                                _senderThread.notifyAll();      
                                        }
+                                       sendAborted(_prb.getAbortedReason(), 
"Downstream transfer failed");
                                        return false;
                                }
                                Message msg;
@@ -219,20 +221,20 @@
                                        msg = 
_usm.waitFor(mfMissingPacketNotification.or(mfAllReceived.or(mfSendAborted)), 
_ctr);
                                        if(logMINOR) Logger.minor(this, "Got 
"+msg);
                                } catch (DisconnectedException e) {
-                                       // Ignore, see below
-                                       msg = null;
-                               }
-                               if(logMINOR) Logger.minor(this, "Got "+msg);
-                               if(!_destination.isConnected()) {
                                        Logger.normal(this, "Terminating send 
"+_uid+" to "+_destination+" from "+_destination.getSocketHandler()+" because 
node disconnected while waiting");
                                        synchronized(_senderThread) {
                                                _sendComplete = true;
                                                _senderThread.notifyAll();
                                        }
+                                       //They disconnected, can't send an 
abort to them then can we?
                                        return false;
                                }
-                               if(_sendComplete)
+                               if(logMINOR) Logger.minor(this, "Got "+msg);
+                               if(_sendComplete) {
+                                       Logger.normal(this, "send cancelled by 
_senderThread");
+                                       //_senderThread will have sent an 
aborted message
                                        return false;
+                               }
                                if (msg == null) {
                                        long now = System.currentTimeMillis();
                                        //SEND_TIMEOUT (one minute) after all 
packets have been transmitted, terminate the send.
@@ -242,7 +244,9 @@
                                                        _sendComplete = true;
                                                        
_senderThread.notifyAll();
                                                }
-                                               Logger.error(this, "Terminating 
send "+_uid+" to "+_destination+" from "+_destination.getSocketHandler()+" as 
we haven't heard from receiver in "+TimeUtil.formatTime((now - timeAllSent), 2, 
true)+ '.');
+                                               String 
timeString=TimeUtil.formatTime((now - timeAllSent), 2, true);
+                                               Logger.error(this, "Terminating 
send "+_uid+" to "+_destination+" from "+_destination.getSocketHandler()+" as 
we haven't heard from receiver in "+timeString+ '.');
+                                               
sendAborted(RetrievalException.RECEIVER_DIED, "Haven't heard from you 
(receiver) in "+timeString);
                                                return false;
                                        } else {
                                                if(logMINOR) Logger.minor(this, 
"Ignoring timeout: timeAllSent="+timeAllSent+" ("+(System.currentTimeMillis() - 
timeAllSent)+"), getNumSent="+getNumSent()+ '/' +_prb.getNumPackets());
@@ -276,18 +280,30 @@
                                                _sendComplete = true;
                                                _senderThread.notifyAll();
                                        }
+                                       //They aborted, don't need to send an 
aborted back :)
                                        return false;
                                } else {
                                        Logger.error(this, "Transmitter 
received unknown message type: "+msg.getSpec().getName());
                                }
                        }
+               } catch (NotConnectedException e) {
+                       //most likely from sending an abort()
+                       Logger.normal(this, "NotConnectedException in 
BlockTransfer.send():"+e);
+                       return false;
                } catch (AbortedException e) {
-                       // Terminate
+                       Logger.normal(this, "AbortedException in 
BlockTransfer.send():"+e);
+                       try {
+                               
sendAborted(RetrievalException.CANCELLED_BY_RECEIVER, "Downstream transfer 
failed");
+                       } catch (NotConnectedException gone) {
+                               //ignore
+                       }
+                       return false;
+               } finally {
+                       //Terminate, if we are not listening for control 
packets, don't be sending any data
                        synchronized(_senderThread) {
                                _sendComplete = true;
                                _senderThread.notifyAll();
-                       }
-                       return false;
+                       }                       
                }
        }



Reply via email to