@ Valliere I am not available for a week.

On Tue, 20 Feb, 2024, 8:59 am Jonathan Valliere, <john...@apache.org> wrote:

> @Kishore Mokkarala <kishore....@gmail.com> are you able to test this
> branch? https://github.com/apache/mina/compare/2.2.X...bugfix/DIRMINA-1173
>
> On Feb 18, 2024 at 2:05:57 PM, Jonathan Valliere <john...@apache.org>
> wrote:
>
>> 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 <john...@apache.org>
>> 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 <john...@apache.org>
>>> 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 <elecha...@gmail.com>
>>>> 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 <0x00007fc1611faec8> (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 <0x00007fc1611fb470> (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 <0x00007fc1611fb470> (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 <0x00007fc1611fb470> (a
>>>>> org.apache.mina.filter.ssl.SSLHandlerG0)
>>>>> at org.apache.mina.filter.ssl.SslFilter.filterWrite(SslFilter.java:451)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:332)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> org.apache.mina.filter.executor.ExecutorFilter.filterWrite(ExecutorFilter.java:595)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> com.netscout.nsaapp.geo.minaG10Proto.server.G10GPBMessageIoFilter.filterWrite(G10GPBMessageIoFilter.java:63)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:49)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:1146)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:138)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:753)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:746)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:575)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:520)
>>>>> at
>>>>>
>>>>> com.netscout.nsaapp.geo.g10Plugin.g10.processor.G10PluginCaptureProcessor.verifyAndSendStartMsgs(G10PluginCaptureProcessor.java:2627)
>>>>> at
>>>>>
>>>>> com.netscout.nsaapp.geo.g10Plugin.g10.processor.G10PluginCaptureProcessor.sessionConnected(G10PluginCaptureProcessor.java:2552)
>>>>> at
>>>>>
>>>>> com.netscout.nsaapp.geo.minaG10Proto.server.G10MinaClient.connect(G10MinaClient.java:220)
>>>>> at jdk.internal.reflect.GeneratedMethodAccessor99.invoke(Unknown
>>>>> Source)
>>>>> at
>>>>>
>>>>> jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17.0.7
>>>>> /DelegatingMethodAccessorImpl.java:43)
>>>>> at java.lang.reflect.Method.invoke(java.base@17.0.7/Method.java:568)
>>>>> at
>>>>>
>>>>> org.apache.mina.statemachine.transition.MethodTransition.invokeMethod(MethodTransition.java:281)
>>>>> at
>>>>>
>>>>> org.apache.mina.statemachine.transition.MethodTransition.doExecute(MethodTransition.java:232)
>>>>> at
>>>>>
>>>>> org.apache.mina.statemachine.transition.AbstractTransition.execute(AbstractTransition.java:100)
>>>>> at
>>>>> org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:183)
>>>>> at
>>>>>
>>>>> org.apache.mina.statemachine.StateMachine.processEvents(StateMachine.java:170)
>>>>> at
>>>>> org.apache.mina.statemachine.StateMachine.handle(StateMachine.java:158)
>>>>> - locked <0x00007fc1611faec8> (a
>>>>> com.netscout.nsaapp.geo.minaG10Proto.server.G10StateContext)
>>>>> at
>>>>>
>>>>> org.apache.mina.statemachine.StateMachineProxyBuilder$MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:261)
>>>>> at jdk.proxy4.$Proxy83.sessionOpened(jdk.proxy4/Unknown Source)
>>>>> at
>>>>>
>>>>> org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.sessionOpened(DefaultIoFilterChain.java:940)
>>>>> ...
>>>>>
>>>>>
>>>>> Basically, on the sessionOpened event, the StateMachine filter takes a
>>>>> lock (0x00007fc1611faec8), then the IoHandler tries to write some
>>>>> data,
>>>>> which ends in the SslFilter.filterWrite method, which takes a lock
>>>>> (0x00007fc1611fb470)
>>>>>
>>>>> Another thread is processing the messageReceived method, go through
>>>>> the
>>>>> SslFilter.messageReceived method which takes a lock
>>>>> (0x00007fc1611fb470), the same as in the upper thread, then goes
>>>>> through
>>>>> the StateMachine.handle method, which takes a lock
>>>>> (0x00007fc1611faec8,
>>>>> already seen upper).
>>>>>
>>>>> The IoHandler should not try to write something on the sessionOpened
>>>>> message IMO (until the session has been secured), but in any case, the
>>>>> double lock is clearly the root cause of the problem.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On 17/02/2024 17:41, Emmanuel Lécharny wrote:
>>>>> > Hi Jonathan,
>>>>> >
>>>>> > regarding the queing, we did that in MINA 2.1:
>>>>> >
>>>>> >      public void filterWrite(NextFilter nextFilter, IoSession
>>>>> session,
>>>>> > WriteRequest writeRequest) throws SSLException {
>>>>> >          if (LOGGER.isDebugEnabled()) {
>>>>> >              LOGGER.debug("{}: Writing Message : {}",
>>>>> > getSessionInfo(session), writeRequest);
>>>>> >          }
>>>>> >
>>>>> >          boolean needsFlush = true;
>>>>> >          SslHandler sslHandler = getSslSessionHandler(session);
>>>>> >
>>>>> >          try {
>>>>> >              synchronized (sslHandler) {
>>>>> >                  if (!isSslStarted(session)) {
>>>>> >                      sslHandler.scheduleFilterWrite(nextFilter,
>>>>> > writeRequest);
>>>>> >                  }
>>>>> > ...
>>>>> >
>>>>> > and
>>>>> >
>>>>> >      /* no qualifier */void scheduleFilterWrite(NextFilter
>>>>> nextFilter,
>>>>> > WriteRequest writeRequest) {
>>>>> >          filterWriteEventQueue.add(new IoFilterEvent(nextFilter,
>>>>> > IoEventType.WRITE, session, writeRequest));
>>>>> >      }
>>>>> >
>>>>> > Sobasically, of the session handshake has not been fully negociated,
>>>>> > then we enqueue the write request. Pretty much what you suggest to
>>>>> do
>>>>> > instead of using synchronized blocks around read and write.
>>>>> >
>>>>> > Otherwise, comments inline:
>>>>> >
>>>>> > On 17/02/2024 14:06, Jonathan Valliere wrote:
>>>>> >>   There is also some additional complexity supporting the scenario
>>>>> >> where two
>>>>> >> different threads are triggering “receive” events on the filter.
>>>>> >
>>>>> > You mean on the same session?
>>>>> >
>>>>> >>
>>>>> >> We either have to process ALL messages out of the payload, then
>>>>> AFTER
>>>>> >> send
>>>>> >> them to the downstream filters or we have to perform a kind of
>>>>> >> dual-locking
>>>>> >> mechanism to ensure that multiple receiver threads to not operate in
>>>>> >> parallel.  Either way, we have to guarantee a serial processing of
>>>>> >> incoming
>>>>> >> messages.
>>>>> >
>>>>> > Actually, this is not a problem unless someone puts an executor
>>>>> filter
>>>>> > *before the SslFilter in the chain. We process the incoming message
>>>>> in a
>>>>> > way a given session is associated with one single IoProcessor
>>>>> instance,
>>>>> > so all the messages for a given session should be processed
>>>>> sequentially
>>>>> > by this Io processor. If we don't have an excutor filter before the
>>>>> > Sslfilter, it should be safe.
>>>>> >
>>>>> >>
>>>>> >> The more I think about it the more concerned I am that we’re
>>>>> following a
>>>>> >> rabbit down a hole.
>>>>> >>
>>>>> >> @Kishore Mokkarala <kishore....@gmail.com> have you tried NOT
>>>>> using
>>>>> >> the SSL
>>>>> >> and instead creating a dummy filter which simply added synchronized
>>>>> to
>>>>> >> the
>>>>> >> receive and write method?  I would be interested to know if that
>>>>> >> causes the
>>>>> >> problem also.  Put this dummy filter in the same place as the SSL
>>>>> >> would be.
>>>>> >
>>>>> > Another way to deal with the lock would be to check for the
>>>>> > SessioSnecured event in the IoHandler side:
>>>>> > - if the event has not be received, then don't send writes, but
>>>>> enqueue
>>>>> > them
>>>>> > - if the session has been secured, then you can write at will
>>>>> > - when teh sessionSecured even is received, unqueue the write
>>>>> messages.
>>>>> >
>>>>> > Somehow, that should replace what I think we should do in the
>>>>> SslFilter.
>>>>> >
>>>>> > But I don't think the burden should be put on the MINA library
>>>>> user...
>>>>> >
>>>>> >>
>>>>> >> On Feb 17, 2024 at 2:00:30 AM, Emmanuel Lécharny <
>>>>> elecha...@gmail.com>
>>>>> >> wrote:
>>>>> >>
>>>>> >>> Hi Jonathan,
>>>>> >>>
>>>>> >>> there are two aspects to consider:
>>>>> >>>
>>>>> >>> - first the establishemnt of the secured session
>>>>> >>> - second the standard exchange of data when the session has been
>>>>> >>> secured.
>>>>> >>>
>>>>> >>> In the first case, we should *never* have any write done by the
>>>>> >>> IoHandler, or those writes should be enqueued until the session
>>>>> has been
>>>>> >>> secured. Here, the upstream filters should not be aware that the
>>>>> session
>>>>> >>> has been secured or not (all in all, filters are supposed to be
>>>>> >>> independenct)
>>>>> >>>
>>>>> >>> In the second case, the SslFilter is responsible for handling the
>>>>> >>> encoding and decoding of the data, regardless of what the upper
>>>>> filters
>>>>> >>> are doing
>>>>> >>>
>>>>> >>> So there should not be any assumption made on what wcould or
>>>>> should do
>>>>> >>> the upstream filters (that's because anyone can add a filter, and
>>>>> we
>>>>> >>> should not force the implementors to take care of unerlying filters
>>>>> >>> constraints).
>>>>> >>>
>>>>> >>> So the best way to deal with writes while the Secured session
>>>>> >>> establishment is ongoing is to enqueue the writes until the
>>>>> session is
>>>>> >>> secured. It adds some complexity, but it's safe for the full stack
>>>>> >>> (reads are a different beast: we have to assume that we can only
>>>>> read
>>>>> >>> Handshake packets until the HS is completed)
>>>>> >>>
>>>>> >>> I guess it fits with what you have in mind.
>>>>> >>>
>>>>> >>>
>>>>> >>> On 17/02/2024 04:12, Jonathan Valliere wrote:
>>>>> >>>
>>>>> >>> I was thinking this over last weekend….
>>>>> >>>
>>>>> >>>
>>>>> >>> If I simply removed the synchronization then there COULD be several
>>>>> >>>
>>>>> >>> incoming data corruption problems unless the upstream filters/
>>>>> >>> processors
>>>>> >>>
>>>>> >>> MUST guarantee FIFO of the data stream.
>>>>> >>>
>>>>> >>>
>>>>> >>> What I would have todo is push OR copy the incoming buffer into a
>>>>> Queue
>>>>> >>>
>>>>> >>> then perform processing off the head of that Queue.  Essentially,
>>>>> do the
>>>>> >>>
>>>>> >>> same as the mEncodeQueue but for Decodes.  The lock would then
>>>>> only
>>>>> >>> be held
>>>>> >>>
>>>>> >>> when processing data off of that Decode queue.  Following this
>>>>> >>> pattern, I
>>>>> >>>
>>>>> >>> could probably remove both the READ and WRITE synchronization
>>>>> blocks.
>>>>> >>>
>>>>> >>>
>>>>> >>> My understanding, for MINA, that the assumption is that it SHOULD
>>>>> be
>>>>> >>> safe
>>>>> >>>
>>>>> >>> to hold on to any object passed into a Filter since object
>>>>> lifecycles
>>>>> >>>
>>>>> >>> SHOULD be controlled by the VM and not the User’s code.
>>>>> >>>
>>>>> >>>
>>>>> >>> If we’re in agreement, I can make the change.
>>>>> >>>
>>>>> >>>
>>>>> >>>
>>>>> >>> On Feb 10, 2024 at 2:14:01 PM, Kishore Mokkarala <
>>>>> kishore....@gmail.com>
>>>>> >>>
>>>>> >>> wrote:
>>>>> >>>
>>>>> >>>
>>>>> >>>> Any time line for removing synchronization block in SSLFilter?
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> On Sat, 10 Feb, 2024, 9:48 pm Emmanuel Lécharny, <
>>>>> elecha...@gmail.com>
>>>>> >>>
>>>>> >>>> wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> Netty is not Apache, but Eclipse.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> We are discussing the error at the moment, trying to move away the
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> SSLFilter synchronized block.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> On 10/02/2024 08:10, Kishore Mokkarala wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>> We had to revert mina version to 2.0.25 from 2.2.1 to make it
>>>>> work in
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>> production and  trying for other alternatives like apache netty.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>> On Fri, 9 Feb, 2024, 1:59 pm Emmanuel Lécharny, <
>>>>> elecha...@gmail.com
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>> <mailto:elecha...@gmail.com>> wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       Hi Jonathan,
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       in this very case, I think there is a race condition when
>>>>> >>>>> using the
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       SSLFilter in conjonction with the StateMachine filter.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       On 09/02/2024 05:33, Jonathan Valliere wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >   No, you should not have to create multiple
>>>>> instances.  The
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       necessary
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        > stateful data is saved to the Connection.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        > On Feb 1, 2024 at 5:22:36 AM, Kishore Mokkarala
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       <kishore....@gmail.com <mailto:kishore....@gmail.com>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        > wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Any response would be greatly appreciated.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> ------------------------------------------
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> M.V.S.Kishore
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> 91-9886412814
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> On Wed, 31 Jan 2024 at 22:17, Kishore Mokkarala
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       <kishore....@gmail.com <mailto:kishore....@gmail.com>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> wrote:
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Hi Emmanuel,
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Do we need to create a new instance of SSLFilter per
>>>>> tcp ip
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       connection or
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> can we reuse it ?
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> For example, do we need to repeat the same code for
>>>>> each
>>>>> >>>>> tcp ip
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       connection
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> ?
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> *Approach 1:*
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> for(int i=0;i< 500;i++)
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> NioSocketConnector connector = new
>>>>> NioSocketConnector();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addLast("LoggingFilter",
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10CaptureService.loggingFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addLast("codecFilter",
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10CaptureService.probeCodecFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addLast("executorFilter",
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10CaptureService.executorFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addLast("gpbMessageFilter",
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10CaptureService.gpbMessageFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addLast("keepAliveFilter",
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10CaptureService.keepAliveFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> SslFilter sslFilter;
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> try {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> SSLContext sslContext = TLSUtil.getSSLContext();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> sslFilter = new CustomSslFilter(sslContext);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.getFilterChain().addFirst("sslFilter",
>>>>> sslFilter);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> } catch (Exception e) {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> e.printStackTrace();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> LOG.error("Exception during creating SSL context..." +
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> XError.getStackTrace(e));
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> //io handler creation
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> StateMachine stateMachine =
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> StateMachineFactory.getInstance(IoHandlerTransition.class).create(
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                  G10MinaClient.CONNECTED, new
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       G10MinaClient(processor));
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>          IoHandler ioHandler = new
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> StateMachineProxyBuilder().setStateContextLookup(
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                  new IoSessionStateContextLookup(new
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       StateContextFactory() {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                      @Override
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                      public StateContext create() {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                          final G10StateContext
>>>>> >>>>> stateContext =
>>>>> >>> new
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> G10StateContext();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> stateContext.setStartedTime(new
>>>>> >>> Date());
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                          LOG.info("G10StateContext
>>>>> >>>>> initialized
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> at:{}
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> ",System.currentTimeMillis());
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                          return stateContext;
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                      }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>                  })).create(IoHandler.class,
>>>>> stateMachine);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.setHandler(ioHandler);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connector.connect(primaryAddress);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connectFuture.awaitUninterruptibly();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> if (connectFuture.isConnected()) {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> IoSession session = connectFuture.getSession();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> // Do something with the session if needed
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> } else {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> System.err.println("Connection failed for iteration: "
>>>>> + i);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> *Approach 2:*
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Reuse the generic connector implemented above for
>>>>> opening
>>>>> >>>>> all
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> TCP/IP
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connections.
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> //just do the below for getting connections for example
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> NioSocketConnector connector = new
>>>>> NioSocketConnector();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> //filter chain creation
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> //add SSLFilter to filer chain
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> for(int i=0;i< 500;i++)
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> ConnectFuture connectFuture =
>>>>> >>>>> connector.connect(serverAddress);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> connectFuture.awaitUninterruptibly();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> if (connectFuture.isConnected()) {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> IoSession session = connectFuture.getSession();
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> // Do something with the session if needed
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> } else {
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> System.err.println("Connection failed for iteration: "
>>>>> + i);
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> }
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Which approach is better ?
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> Regards,
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> ------------------------------------------
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> M.V.S.Kishore
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >> 91-9886412814
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>        >
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       --
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       elecha...@apache.org <mailto:elecha...@apache.org>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>
>>>>> ---------------------------------------------------------------------
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       To unsubscribe, e-mail: users-unsubscr...@mina.apache.org
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       <mailto:users-unsubscr...@mina.apache.org>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       For additional commands, e-mail:
>>>>> users-h...@mina.apache.org
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>       <mailto:users-h...@mina.apache.org>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> --
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>> elecha...@apache.org
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>>
>>>>> >>>
>>>>> >>>
>>>>> >>>
>>>>> >>> --
>>>>> >>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
>>>>> >>> elecha...@apache.org
>>>>> >>>
>>>>> >>
>>>>> >
>>>>>
>>>>> --
>>>>> *Emmanuel Lécharny* P. +33 (0)6 08 33 32 61
>>>>> elecha...@apache.org
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscr...@mina.apache.org
>>>>> For additional commands, e-mail: users-h...@mina.apache.org
>>>>>
>>>>>

Reply via email to