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