You are right about the problem, neither Threads nor Sockets are being cleared correctly - especially not if the node comes under some for of hostile attack.
But I don't think that a Thread pool that puts new connections in a queue is the right answer for Freenet. Freenet nodes do not have to answer connections - the requesting node can go on an look elsewhere - but if they do answer, they have to pass the Request pretty fast (the default contract is within 3 seconds). So, in many ways, simply dumping the connection after too many threads are running is a better idea. Also, I don't think that linking to another project like this is too great - if you think we can use it then GPL the code and give it to us. On Wed, 12 Apr 2000, Scott G. Miller wrote: > One of the problems I've noticed browsing through the server source is the > lack of thread management in the code. The policy seems to be 'accept a > connection, generate a thread, and forget about it'. This leaves the > server open to connection flood or DoS attacks. Java threads are nice, > and they help efficiency, but when there are to many of them, things get > ugly. > > I did some connection testing on Freenet and the server really starts to > behave badly with numerous connections. The threads compete for processor > time, so connections take longer to finish, thus there is more time for > new connections, yielding more threads, and so on. > > A simple solution to this might be to use thread pooling. This worked > very effectively in Gamora (a pet project of mine). Essentially, you > maintain a pool of N threads, where N is the most you want running at any > given time. As new jobs come in, they are issued to the pool manager, > which assigns them to a thread, up to N. Beyond N, they are added to a > run-queue and assigned as threads become available. > > The result is a non-blocking system that allows connections to continue to > flow in, but places them on hold so that the system doesn't run away from > you. If you pick your N right, high enough that your server is never > idle, but low enough that the threads aren't thrashing, this actually > improves performance considerably. > > Below is a patch against build 118 that executes all of its connections in > a Thread pool with N=50. You'll need the ethread package, > ftp://ftp.gamora.org/pub/gamora/ethreads. Just shove her in your > classpath. > > Feel free to tinker, play, and flame the hell out of me. :) > > --------8<------------------------------------------------------ > diff -urN Freenet/ConnectionHandler.java > Freenet-ethread/ConnectionHandler.java > --- Freenet/ConnectionHandler.java Sun Apr 9 10:48:36 2000 > +++ Freenet-ethread/ConnectionHandler.java Tue Apr 11 19:35:33 2000 > @@ -3,6 +3,8 @@ > import java.net.*; > import java.io.*; > import java.io.EOFException; > +import org.gamora.ethreads.*; > + > /* > This code is part of the Java Adaptive Network Client by Ian Clarke. > It is distributed under the GNU General Public Licence (GPL) > @@ -16,9 +18,10 @@ > * @author <a href="mailto:blanu at uts.cc.utexas.edu">Brandon Wiley</a> > **/ > > -public class ConnectionHandler extends Thread > +public class ConnectionHandler implements ERunnable > { > // Protected/Private Fields > + private static EThread exec_instance; > private static long ids=0; > private long id; > private Connection c; > @@ -165,7 +168,7 @@ > //I'm letting this force close now, maybe it should synchronize somehow > (it can't sync to c.in anyways, since that is always waiting on a read in the > RawMessage constructor). > public void close() { > closed = true; > - this.interrupt(); > + exec_instance.getThread().interrupt(); > } > > /** > @@ -182,7 +185,8 @@ > **/ > > public boolean isOpen() { > - return isAlive() && !closed; > + return exec_instance!=null && !closed; > + // return isAlive() && !closed; > } > > public Address peer() { > @@ -199,5 +203,9 @@ > > public Address local(ListeningAddress laddr) { > return c.getMyAddress(laddr); > + } > + > + public void setExecutionInstance(EThread e) { > + exec_instance=e; > } > } > diff -urN Freenet/Core.java Freenet-ethread/Core.java > --- Freenet/Core.java Tue Apr 11 09:12:35 2000 > +++ Freenet-ethread/Core.java Tue Apr 11 19:37:54 2000 > @@ -4,6 +4,7 @@ > import java.util.*; > import java.net.*; > import java.io.*; > +import org.gamora.ethreads.*; > > /* > This code is part of the Java Adaptive Network Client by Ian Clarke. > @@ -40,6 +41,7 @@ > public HandshakeHandler hh; > public Listener listener; > public boolean listen = true; // provides a way to turn off listening > + public ThreadManager threads; > > public Core(ListeningAddress myAddress, MessageHandler mh, > HandshakeHandler hh) { > try { > @@ -51,6 +53,8 @@ > this.mh = mh; > this.hh = hh; > Logger.log("Core.java","Node running on "+listener,Logger.NORMAL); > + threads=new ThreadPool(50); > + threads.start(); > } > > public void acceptConnections() > @@ -70,7 +74,7 @@ > throw new RuntimeException("Problem accepting next > connection"); > } > c = new ConnectionHandler(conn, mh); > - c.start(); > + threads.run(c); > } > } > > @@ -119,7 +123,7 @@ > } > > ConnectionHandler ch = new ConnectionHandler(c, mh); > - ch.start(); // start listening on this connection > + threads.run(ch); // start listening on this connection > return ch; > } > > > > > > > _______________________________________________ > Freenet-dev mailing list > Freenet-dev at lists.sourceforge.net > http://lists.sourceforge.net/mailman/listinfo/freenet-dev -- Oskar Sandberg md98-osa at nada.kth.se #!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/) _______________________________________________ Freenet-dev mailing list Freenet-dev at lists.sourceforge.net http://lists.sourceforge.net/mailman/listinfo/freenet-dev
