Author: toad
Date: 2008-03-01 20:53:34 +0000 (Sat, 01 Mar 2008)
New Revision: 18299

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeClientCore.java
   trunk/freenet/src/freenet/node/RequestHandler.java
Log:
Fix race condition resulting in sendTerminal being called twice.

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2008-03-01 20:36:28 UTC (rev 
18298)
+++ trunk/freenet/src/freenet/node/Node.java    2008-03-01 20:53:34 UTC (rev 
18299)
@@ -1893,7 +1893,7 @@
         * a RequestSender, unless the HTL is 0, in which case NULL.
         * RequestSender.
         */
-       public Object makeRequestSender(Key key, short htl, long uid, PeerNode 
source, boolean localOnly, boolean cache, boolean ignoreStore, boolean 
offersOnly) {
+       public Object makeRequestSender(Key key, short htl, long uid, PeerNode 
source, boolean localOnly, boolean cache, boolean ignoreStore, boolean 
offersOnly, RequestSender.Listener listener) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if(logMINOR) Logger.minor(this, "makeRequestSender("+key+ ',' 
+htl+ ',' +uid+ ',' +source+") on "+getDarknetPortNumber());
                // In store?
@@ -1933,6 +1933,7 @@
                }
                if(sender != null) {
                        if(logMINOR) Logger.minor(this, "Data already being 
transferred: "+sender);
+                       if(listener != null) sender.addListener(listener);
                        return sender;
                }

@@ -1955,6 +1956,7 @@
                        sender = new RequestSender(key, null, htl, uid, this, 
source, offersOnly);
                        // RequestSender adds itself to requestSenders
                }
+               if(listener != null) sender.addListener(listener);
                sender.start();
                if(logMINOR) Logger.minor(this, "Created new sender: "+sender);
                return sender;

Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java  2008-03-01 20:36:28 UTC 
(rev 18298)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java  2008-03-01 20:53:34 UTC 
(rev 18299)
@@ -470,7 +470,7 @@
         */
        void asyncGet(Key key, boolean cache, boolean offersOnly, long uid, 
RequestSender.Listener listener) {
                try {
-                       Object o = node.makeRequestSender(key, node.maxHTL(), 
uid, null, false, cache, false, offersOnly);
+                       Object o = node.makeRequestSender(key, node.maxHTL(), 
uid, null, false, cache, false, offersOnly, listener);
                        if(o instanceof CHKBlock) {
                                node.unlockUID(uid, false, false, true, false);
                                return; // Already have it.
@@ -509,7 +509,7 @@
                        throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
                }
                try {
-               Object o = node.makeRequestSender(key.getNodeCHK(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
+               Object o = node.makeRequestSender(key.getNodeCHK(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false, null);
                if(o instanceof CHKBlock) {
                        try {
                                return new ClientCHKBlock((CHKBlock)o, key);
@@ -624,7 +624,7 @@
                        throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
                }
                try {
-               Object o = node.makeRequestSender(key.getNodeKey(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
+               Object o = node.makeRequestSender(key.getNodeKey(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false, null);
                if(o instanceof SSKBlock) {
                        try {
                                SSKBlock block = (SSKBlock)o;

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2008-03-01 20:36:28 UTC 
(rev 18298)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2008-03-01 20:53:34 UTC 
(rev 18299)
@@ -132,7 +132,7 @@
         Message accepted = DMT.createFNPAccepted(uid);
         source.sendAsync(accepted, null, 0, this);

-        Object o = node.makeRequestSender(key, htl, uid, source, false, true, 
false, false);
+        Object o = node.makeRequestSender(key, htl, uid, source, false, true, 
false, false, this);
         if(o instanceof KeyBlock) {
                returnLocalData((KeyBlock)o);
             return;
@@ -150,8 +150,6 @@
         //If we cannot respond before this time, the 'source' node has already 
fatally timed out (and we need not return packets which will not be claimed)
                searchStartTime = System.currentTimeMillis();
                responseDeadline = searchStartTime + 
RequestSender.FETCH_TIMEOUT + source.getProbableSendQueueTime();
-        
-        rs.addListener(this);
        }

        public void onReceivedRejectOverload() {


Reply via email to