Author: toad
Date: 2005-11-30 22:08:47 +0000 (Wed, 30 Nov 2005)
New Revision: 7642

Modified:
   trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
   trunk/freenet/src/freenet/node/Version.java
Log:
254: (mandatory)
Block transmitter was cancelling transfers unnecessarily.
It's not that we haven't heard from the other end for 30 seconds that means the 
other side is dead.
It's having not heard from the other side for 30 seconds *after we sent the 
last packet*.

Modified: trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java     2005-11-30 
21:42:38 UTC (rev 7641)
+++ trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java     2005-11-30 
22:08:47 UTC (rev 7642)
@@ -50,6 +50,7 @@
        BitArray _sentPackets;
        boolean failedByOverload = false;
        final PacketThrottle throttle;
+       long timeAllSent = -1;

        // Static stuff for global bandwidth limiter
        /** Synchronization object for bandwidth limiting */
@@ -114,13 +115,24 @@
                                                        while (true) {
                                                                
synchronized(_unsent) {
                                                                        
if(_unsent.size() != 0) break;
+                                                                       // No 
unsent packets
+                                                                       
if(getNumSent() == _prb.getNumPackets()) {
+                                                                               
timeAllSent = System.currentTimeMillis();
+                                                                       }
                                                                }
                                                                
if(_sendComplete) return;
                                                                synchronized 
(_senderThread) {
                                                                        
_senderThread.wait(10*1000);
                                                                }
                                                        }
-                                               } catch (InterruptedException 
e) {  }
+                                               } catch (InterruptedException 
e) {
+                                               } catch (AbortedException e) {
+                                                       
synchronized(_senderThread) {
+                                                               _sendComplete = 
true;
+                                                               
_senderThread.notifyAll();
+                                                       }
+                                                       return;
+                                               }
                                                long startDelayTime = 
System.currentTimeMillis();
                                                delay(startCycleTime);
                                                int packetNo;
@@ -284,14 +296,15 @@
             }
                        if(_sendComplete || !_destination.isConnected()) return 
false;
                        if (msg == null) {
-                               if (getNumSent() == _prb.getNumPackets()) {
+                               if(timeAllSent > 0 && 
System.currentTimeMillis() - timeAllSent > SEND_TIMEOUT &&
+                                               getNumSent() == 
_prb.getNumPackets()) {
                                        synchronized(_senderThread) {
                                                _sendComplete = true;
                                                _senderThread.notifyAll();
                                        }
                                        Logger.error(this, "Terminating send 
"+_uid+" to "+_destination+" from "+_usm.getPortNumber()+" as we haven't heard 
from receiver in "+SEND_TIMEOUT+"ms.");
                                        return false;
-                               }
+                               } else continue;
                        } else if 
(msg.getSpec().equals(DMT.missingPacketNotification)) {
                                LinkedList missing = (LinkedList) 
msg.getObject(DMT.MISSING);
                                for (Iterator i = missing.iterator(); 
i.hasNext();) {

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-30 21:42:38 UTC (rev 
7641)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-30 22:08:47 UTC (rev 
7642)
@@ -20,10 +20,10 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       public static final int buildNumber = 253;
+       public static final int buildNumber = 254;

        /** Oldest build of Fred we will talk to */
-       public static final int lastGoodBuild = 252;
+       public static final int lastGoodBuild = 254;

        /** The highest reported build of fred */
        public static int highestSeenBuild = buildNumber;


Reply via email to