Re: Individual SSLFilter per connector

2024-02-18 Thread Jonathan Valliere
The other diagram possibly had a consumer order issue.  While the Queue
will guarantee that the messages will be pulled out of the Queue in order,
they do not guarantee that the processing of the messages will happen in
order.

The new diagram implements 3 synchronization objects.  This will ensure
that messages are produced and enter the respective queues in guaranteed
order and that they will be consumed with upstream or downstream in order
without locking both directions concurrently.

On Feb 18, 2024 at 1:47:58 PM, Jonathan Valliere  wrote:

> Emmanuel,
>
> The attached diagram is how I figured out we can solve this.  The downside
> is that it requires more concurrent queues and more lock/unlock but I think
> it should ensure correct execution order.
>
> I’m working on this now as SSLHandlerG1 so it stays separate from the
> reference implementation.
>
> On Feb 17, 2024 at 7:33:21 PM, Jonathan Valliere 
> wrote:
>
>> Okay so I need to figure out how to work it so no lock is held while
>> calling either the upper or lower filter.
>>
>> CONFIDENTIALITY NOTICE: The contents of this email message and any
>> attachments are intended solely for the addressee(s) and may contain
>> confidential and/or privileged information and may be legally protected
>> from disclosure.
>>
>>
>> On Sat, Feb 17, 2024 at 5:06 PM Emmanuel Lécharny 
>> wrote:
>>
>>> Hi Jonathan,
>>>
>>> Kishore provided a thrzad dump a few weeks ago, which shows that there
>>> is a lock:
>>>
>>> NioProcessor-12
>>> ---
>>> stackTrace:
>>> java.lang.Thread.State: BLOCKED (on object monitor)
>>> at
>>> org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:138)
>>> - waiting to lock <0x7fc1611faec8> (a
>>> com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext)
>>> at
>>>
>>> org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261)
>>> at jdk.proxy4.$Proxy83.event(jdk.proxy4/Unknown Source)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.event(DefaultIoFilterChain.java:1039)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>>> at
>>>
>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>>> at
>>>
>>> org.apache.mina.filter.ssl.SSLHandlerG0.finish_handshake(SSLHandlerG0.java:589)
>>> - locked <0x7fc1611fb470> (a org.apache.mina.filter.ssl.SSLHandlerG0)
>>> at
>>>
>>> org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:271)
>>> at
>>>
>>> 

Re: Individual SSLFilter per connector

2024-02-18 Thread Jonathan Valliere
 Emmanuel,

The attached diagram is how I figured out we can solve this.  The downside
is that it requires more concurrent queues and more lock/unlock but I think
it should ensure correct execution order.

I’m working on this now as SSLHandlerG1 so it stays separate from the
reference implementation.

On Feb 17, 2024 at 7:33:21 PM, Jonathan Valliere  wrote:

> Okay so I need to figure out how to work it so no lock is held while
> calling either the upper or lower filter.
>
> CONFIDENTIALITY NOTICE: The contents of this email message and any
> attachments are intended solely for the addressee(s) and may contain
> confidential and/or privileged information and may be legally protected
> from disclosure.
>
>
> On Sat, Feb 17, 2024 at 5:06 PM Emmanuel Lécharny 
> wrote:
>
>> Hi Jonathan,
>>
>> Kishore provided a thrzad dump a few weeks ago, which shows that there
>> is a lock:
>>
>> NioProcessor-12
>> ---
>> stackTrace:
>> java.lang.Thread.State: BLOCKED (on object monitor)
>> at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:138)
>> - waiting to lock <0x7fc1611faec8> (a
>> com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext)
>> at
>>
>> org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261)
>> at jdk.proxy4.$Proxy83.event(jdk.proxy4/Unknown Source)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.event(DefaultIoFilterChain.java:1039)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
>> at
>>
>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
>> at
>>
>> org.apache.mina.filter.ssl.SSLHandlerG0.finish_handshake(SSLHandlerG0.java:589)
>> - locked <0x7fc1611fb470> (a org.apache.mina.filter.ssl.SSLHandlerG0)
>> at
>>
>> org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:271)
>> at
>>
>> org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246)
>> at
>>
>> org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246)
>> at org.apache.mina.filter.ssl.SSLHandlerG0.receive(SSLHandlerG0.java:162)
>> - locked <0x7fc1611fb470> (a org.apache.mina.filter.ssl.SSLHandlerG0)
>> at
>> org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:405)
>> ...
>>
>>
>> and
>>
>>
>> pool-120-thread-37
>> --
>> stackTrace:
>> java.lang.Thread.State: BLOCKED (on object monitor)
>> at org.apache.mina.filter.ssl.SSLHandlerG0.write(SSLHandlerG0.java:312)
>> - waiting to lock <0x7fc1611fb470> (a
>> org.apache.mina.filter.ssl.SSLHandlerG0)
>> at 

Re: Individual SSLFilter per connector

2024-02-18 Thread Emmanuel Lécharny

Hi Jonathan,

I don'ty exclude we could also solve the issue by tweeking the 
StateMachine filter. For instance, do we really need to take a lock 
while processing the SessionOpened in the SM Filter?


I'm not very into the SM filter code, I have to study it, but that would 
potentially save you some time...


On 18/02/2024 01:33, Jonathan Valliere wrote:
Okay so I need to figure out how to work it so no lock is held while 
calling either the upper or lower filter.


CONFIDENTIALITY NOTICE: The contents of this email message and any 
attachments are intended solely for the addressee(s) and may contain 
confidential and/or privileged information and may be legally protected 
from disclosure.



On Sat, Feb 17, 2024 at 5:06 PM Emmanuel Lécharny > wrote:


Hi Jonathan,

Kishore provided a thrzad dump a few weeks ago, which shows that there
is a lock:

NioProcessor-12
---
stackTrace:
java.lang.Thread.State: BLOCKED (on object monitor)
at
org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:138)
- waiting to lock <0x7fc1611faec8> (a
com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext)
at

org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261)
at jdk.proxy4.$Proxy83.event(jdk.proxy4/Unknown Source)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.event(DefaultIoFilterChain.java:1039)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.core.filterchain.IoFilterAdapter.event(IoFilterAdapter.java:162)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextFilterEvent(DefaultIoFilterChain.java:789)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1700(DefaultIoFilterChain.java:49)
at

org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.event(DefaultIoFilterChain.java:1164)
at

org.apache.mina.filter.ssl.SSLHandlerG0.finish_handshake(SSLHandlerG0.java:589)
- locked <0x7fc1611fb470> (a
org.apache.mina.filter.ssl.SSLHandlerG0)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:271)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive_loop(SSLHandlerG0.java:246)
at
org.apache.mina.filter.ssl.SSLHandlerG0.receive(SSLHandlerG0.java:162)
- locked <0x7fc1611fb470> (a
org.apache.mina.filter.ssl.SSLHandlerG0)
at
org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:405)
...


and


pool-120-thread-37
--
stackTrace:
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.mina.filter.ssl.SSLHandlerG0.write(SSLHandlerG0.java:312)
- waiting to lock <0x7fc1611fb470> (a