Author: toad
Date: 2009-01-15 22:07:21 +0000 (Thu, 15 Jan 2009)
New Revision: 25067

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
Fix turtle leak, logging.


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2009-01-15 20:31:30 UTC (rev 
25066)
+++ trunk/freenet/src/freenet/node/Node.java    2009-01-15 22:07:21 UTC (rev 
25067)
@@ -4062,6 +4062,8 @@
                return container;
        }
 
+       private volatile long turtleCount;
+       
        /**
         * Make a running request sender into a turtle request.
         * Backoff: when the transfer finishes, or after 10 seconds if no 
cancellation.
@@ -4077,7 +4079,7 @@
                if(!this.registerTurtleTransfer(sender)) {
                        // Too many turtles running, or already two turtles for 
this key (we allow two in case one peer turtles as a DoS).
                        sender.killTurtle();
-                       System.err.println("Didn't make turtle for key 
"+sender.key+" for "+sender);
+                       System.err.println("Didn't make turtle (global) for key 
"+sender.key+" for "+sender);
                        return;
                }
                PeerNode from = sender.transferringFrom();
@@ -4086,7 +4088,7 @@
                        // Abort it.
                        unregisterTurtleTransfer(sender);
                        sender.killTurtle();
-                       System.err.println("Didn't make turtle for key 
"+sender.key+" for "+sender);
+                       System.err.println("Didn't make turtle (peer) for key 
"+sender.key+" for "+sender);
                        return;
                }
                System.err.println("TURTLING: "+sender.key+" for "+sender);
@@ -4094,11 +4096,16 @@
                synchronized(transferringRequestSenders) {
                        transferringRequestSenders.remove((NodeCHK)sender.key);
                }
+               turtleCount++;
                
                // Abort downstream transfers, set the turtle mode flag and set 
up the backoff callback.
                sender.setTurtle();
        }
 
+       public long getTurtleCount() {
+               return turtleCount;
+       }
+       
        private static int MAX_TURTLES = 10;
        private static int MAX_TURTLES_PER_KEY = 2;
        
@@ -4107,13 +4114,19 @@
        private boolean registerTurtleTransfer(RequestSender sender) {
                Key key = sender.key;
                synchronized(turtlingTransfers) {
-                       if(turtlingTransfers.size() >= MAX_TURTLES) return 
false;
+                       if(turtlingTransfers.size() >= MAX_TURTLES) {
+                               System.err.println("Too many turtles running 
globally");
+                               return false;
+                       }
                        if(!turtlingTransfers.containsKey(key)) {
                                turtlingTransfers.put(key, new RequestSender[] 
{ sender });
                                return true;
                        } else {
                                RequestSender[] senders = 
turtlingTransfers.get(key);
-                               if(senders.length >= MAX_TURTLES_PER_KEY) 
return false;
+                               if(senders.length >= MAX_TURTLES_PER_KEY) {
+                                       System.err.println("Too many turtles 
for key globally");
+                                       return false;
+                               }
                                for(int i=0;i<senders.length;i++) {
                                        if(senders[i] == sender) {
                                                Logger.error(this, "Registering 
turtle for "+sender+" : "+key+" twice! (globally)");
@@ -4124,6 +4137,7 @@
                                System.arraycopy(senders, 0, newSenders, 0, 
senders.length);
                                newSenders[senders.length] = sender;
                                turtlingTransfers.put(key, newSenders);
+                               System.err.println("Running turtles: 
"+turtlingTransfers.size());
                                return true;
                        }
                }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2009-01-15 20:31:30 UTC 
(rev 25066)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2009-01-15 22:07:21 UTC 
(rev 25067)
@@ -4274,8 +4274,14 @@
        public boolean registerTurtleTransfer(RequestSender sender) {
                Key key = sender.key;
                synchronized(turtlingTransfers) {
-                       if(turtlingTransfers.size() >= MAX_TURTLES_PER_PEER) 
return false;
-                       if(turtlingTransfers.containsKey(key)) return false;
+                       if(turtlingTransfers.size() >= MAX_TURTLES_PER_PEER) {
+                               System.err.println("Too many turtles for peer");
+                               return false;
+                       }
+                       if(turtlingTransfers.containsKey(key)) {
+                               System.err.println("Already fetching key from 
peer");
+                               return false;
+                       }
                        turtlingTransfers.put(key, sender);
                        return true;
                }

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2009-01-15 20:31:30 UTC 
(rev 25066)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2009-01-15 22:07:21 UTC 
(rev 25067)
@@ -839,6 +839,8 @@
                                        synchronized(this) {
                                                if(turtleMode) {
                                                System.err.println("TURTLE 
FAILED: "+key+" for "+this+" : "+e);
+                                               
next.unregisterTurtleTransfer(this);
+                                               
node.unregisterTurtleTransfer(this);
                                                }
                                        }
                                                        if 
(e.getReason()==RetrievalException.SENDER_DISCONNECTED)

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to