Hi !

I have implemented a new ThreadFactory, that only uses a fixed amount of 
threads. With the current PThreadFactory I have problems when under 
heavy load.
The factory creates more and more threads, until freenet, java or my 
machine fail.

Also almost no connections are successful under load.

The new ThreadFactory should fixes these problems. I'd be happy if 
someone could review the code (to search for deadlocks) and people would 
test it.
The only limitation is, that thread recursion (threads from the 
threadpool using other threads from the threadpool) is limited to 5 
(could be changed).

Currently I get best results, with a pretty low number of threads (20 on 
my AMD K6 200), so probably 40 is a good value for a fast machine.

The change to activate the threadpool is:

Index: src/freenet/node/Main.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/node/Main.java,v
retrieving revision 1.18
diff -u -r1.18 Main.java
--- src/freenet/node/Main.java    12 Feb 2002 03:46:54 -0000    1.18
+++ src/freenet/node/Main.java    18 Feb 2002 13:38:09 -0000
@@ -542,7 +542,7 @@
         // set up a thread group, the threadpool, and the OCM
         ThreadGroup tg = new ThreadGroup(node.toString());
         ThreadFactory tf = (node.maximumThreads > 0
-                            ? (ThreadFactory) new PThreadFactory(tg, 
node.maximumThreads)
+                            ? (ThreadFactory) new QThreadFactory(tg, 
node.maximumThreads)
                             : (ThreadFactory) new SimpleThreadFactory(tg));

         // Keep a hold of the the ThreadManager so that we can use


Also I'm getting deadlocks. But I do not think these are not caused by 
my code.
The stacktrace of the thread failing is:

"QThread-15-1" prio=1 tid=0x0x81f6df8 nid=0x18d1 waiting on monitor 
[bcbff000..bcbff8b0]
    at java.lang.Object.wait(Native Method)
    - waiting on <0x45041f10> (a java.lang.Object)
    at java.lang.Object.wait(Object.java:425)
    at freenet.ConnectionHandler.run(ConnectionHandler.java:301)
    - locked <0x45041f10> (a java.lang.Object)
    at 
freenet.OpenConnectionManager$ConnectionJob.run(OpenConnectionManager.java:492)
    at freenet.thread.QThreadFactory$QThread.run(QThreadFactory.java:297)

This causes (I think) many threads to wait:
"QThread-13-0" prio=1 tid=0x0x81f5688 nid=0x18cf waiting for monitor 
entry [bcfff000..bcfff8b0]
    at 
freenet.node.StandardMessageHandler$Ticket.received(StandardMessageHandler.java:131)
    - waiting to lock <0x445bad48> (a freenet.node.StateChain)
    at 
freenet.node.StandardMessageHandler$Ticket.access$200(StandardMessageHandler.java:117)
    at 
freenet.node.StandardMessageHandler.handle(StandardMessageHandler.java:64)
    at freenet.Ticker$Event.run(Ticker.java:175)
    at freenet.thread.QThreadFactory$QThread.run(QThreadFactory.java:297)

I got an exception in the lockfile, that might have to do with this:
18.02.2002 13:24:19 (freenet.node.Node, QThread-18-0): Error getting 
initial state for message: freenet.node.states.announcement.NoReply at 899213
freenet.node.BadStateException: Internal event object received with no 
states. Chain probably ended.
    at 
freenet.node.EventMessageObject.getInitialState(EventMessageObject.java:28)
    at freenet.node.StateChain.received(StateChain.java:97)
    at freenet.node.StateChain.received(StateChain.java:41)
    at freenet.node.AggregatingState.received(AggregatingState.java:46)
    at 
freenet.node.states.announcing.Announcing.received(Announcing.java:59)
    at freenet.node.StateChain.received(StateChain.java:113)
    at freenet.node.StateChain.received(StateChain.java:41)
    at 
freenet.node.StandardMessageHandler$Ticket.received(StandardMessageHandler.java:132)
    at 
freenet.node.StandardMessageHandler$Ticket.access$200(StandardMessageHandler.java:117)
    at 
freenet.node.StandardMessageHandler.handle(StandardMessageHandler.java:64)
    at freenet.Ticker$Event.run(Ticker.java:175)
    at freenet.thread.QThreadFactory$QThread.run(QThreadFactory.java:297)

and

18.02.2002 15:42:37 (freenet.node.Node, QThread-15-0): Message 
freenet.node.states.request.RequestInitiator at 5d8d75 received during 
state DataRequest Pending @ bc02338f87385b09 was not welcome
freenet.node.BadStateException: Not my request initiator: 
freenet.node.states.request.RequestInitiator at 5d8d75
    at 
freenet.node.states.request.Pending.receivedRequestInitiator(Pending.java:129)
    at 
freenet.node.states.request.DataPending.receivedMessage(DataPending.java:61)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:28)
    at java.lang.reflect.Method.invoke(Method.java:327)
    at freenet.node.State.received(State.java:117)
    at freenet.node.StateChain.received(StateChain.java:113)
    at freenet.node.StateChain.received(StateChain.java:41)
    at 
freenet.node.StandardMessageHandler$Ticket.received(StandardMessageHandler.java:132)
    at 
freenet.node.StandardMessageHandler$Ticket.access$200(StandardMessageHandler.java:117)
    at 
freenet.node.StandardMessageHandler.handle(StandardMessageHandler.java:64)
    at freenet.Ticker$Event.run(Ticker.java:175)
    at freenet.thread.QThreadFactory$QThread.run(QThreadFactory.java:303)

Unfortunatly I can't make much of this.

Niklas


_______________________________________________
Devl mailing list
Devl at freenetproject.org
http://lists.freenetproject.org/mailman/listinfo/devl

Reply via email to