Sorry for not responding any sooner. I had a look at your thread dump and there's no doubt that there's a potential for deadlocks in StateMachine when multiple threads make calls to the same state machine. If we could just find a way to replace that synchronization with something which won't deadlock. I'm not sure how to do that.

If threadA is processing events and threadB calls a method on the proxy which generates a new event one solution would be that the new event is added to the event queue and handled by threadA instead of threadB. This means that threadB won't block at all in that case. However, I'm not certain whether that would be the most intuitive thing to do. I think most users would expect threadB to block until the event has been processed. On the other hand, this is already how StateMachine handles recursive events. I.e. when threadA generates a new event while already processing an event. In that case threadA won't block on the method call which generates the new event. If it would block it would of course deadlock itself.

Anyways, any suggestions on how to fix the problem described above are very much appreciated.

BTW, I thought it should work if you moved the executorFilter before the two state machine filters. I find that quite strange. I thought the executor filter ensured that only one thread is processing MINA events for a particular IoSession at a time. Maybe someone else can shine some light on this issue.

Regards,
Niklas

Simon Trudeau skrev:
Sorry to get back to you on this, but did you find anything interesting?
This issue is a bit of a show stopper for me as I seem to be getting it
quite often. Anything that you could recommend? I tried moving the
executor around but to no avail, I also tried putting a dummy filter
between the two state machines but that didn't solved the issue. I guess
I am only left off with the option of removing the ExecutorFilter all
together.

Thanks,

Simon -----Original Message----- From: Niklas Therning [mailto:[EMAIL PROTECTED] Sent: May-27-08 2:58 AM
To: [email protected]
Subject: Re: StateMachine and session.write may block

Sorry, you're right I already got the attachment. :-[   Will have a look

at it later today.

/Niklas

Simon Trudeau skrev:
Didn't you get the thread dump as an attachment to my previous
message?
A file named deadlock - Copy.txt. If not, let me know how can I send you attachments.

I am pretty sure that moving the executorFilter right after My codec Filter would solve the issue since both statemachine would execute inside the same thread.


Simon
-----Original Message-----
From: Niklas Therning [mailto:[EMAIL PROTECTED]
Sent: May-26-08 10:58 AM
To: [email protected]
Subject: Re: StateMachine and session.write may block

This looks weird! :) Could you post the complete thread dump? The two state machine filters shouldn't lock each other up since they use seperate StateContext instances. It's probably got to do with the ExecutorFilter. Could you try to move it before the StateMachine filters in your chain and see if that helps?

/Niklas

Simon Trudeau skrev:
Found a deadlock! Jstack is a very cool tool! :.)

It seams that the problem lies with:

**********
StateMachine.java L.130

    public void handle(Event event) {
        StateContext context = event.getContext();

        synchronized (context) {
LinkedList<Event> eventQueue = eventQueueThreadLocal.get(); ...
**********

I am not sure as to why there would be contention between my two statemachine's context (FirmwareUpgradeFilter$FirmwareUpgradeContext and PasswordProtection$PasswordProtectionContext). My only guess is that since both state machines are executed one after the other:

1- My Codec Filter
2- StateMachine Filter 1 (Mina state-machine)
3- StateMachine Filter 2 (Mina state-machine)
4- executorFilter
5- My Processor Filter

One filter must be attempting to write a request while the other one must be attempting to write a response and they both lock on the other's resource.

"NioProcessor-1":
at $Proxy46.messageSent(Unknown Source)

"pool-5-thread-1":
at $Proxy46.filterWrite(Unknown Source)

That's my guess. What do you think? Should this be addressed at the framework level or should I but a dummy filter between my two state machines to make sure that both statemachines don't compete for the same locked resource? Should I change something to my executor
filter?
Thanks,

Simon
-----Original Message-----
From: Niklas Therning [mailto:[EMAIL PROTECTED]
Sent: May-26-08 2:14 AM
To: [email protected]
Subject: Re: StateMachine and session.write may block

Hi Simon,

I think a thread dump would help debugging this. Please generate one the next time you experience this problem and post the output here. If
you don't know how to generate one please see:
http://wiki.netbeans.org/GenerateThreadDump

/Niklas

Simon Trudeau skrev:
I think I have uncovered a very weird behavior of mina 2.x (latest trunk). I have a filterchain structure as followed 1- My Codec Filter
2- StateMachine Filter 1 (Mina state-machine)
3- StateMachine Filter 2 (Mina state-machine)
4- executorFilter
5- My Processor Filter
On certain usage scenarios, calls to session.write() block! It blocks when DefaultIoFilterChain.callPreviousFilterWrite(){ ...
filterWrite(nf, session, writeRequest); ...} is invoked.
When trying to print the name of the filter that gets invoked (filter.getClass.getSimpleName()), I get $Proxy46. I would have wanted
to be more precise and put a break point to know what's going on but

since I can only reproduce the scenario 1/10 try, it's a bit hard :.) Nevertheless I got the following order of filters called when it
blocked:
org.apache.mina.common.DefaultIoFilterChain$TailFilter

foo.bar.MyProcessorFilter

org.apache.mina.filter.executor.ExecutorFilter

$Proxy46

$Proxy46

I cannot explain why it could have blocked since I don't know where to
start in the Proxy and in Mina StateMachine. Maybe it has to do with

my ExcutorFilter being a org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor instead of an OrderedThreadPoolExecutor <http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/
e x ec utor/OrderedThreadPoolExecutor.html> .
I would really appreciate any help you can give me on the matter since
this application I am building will go commercial soon. Thanks.
Simon



Reply via email to