Okay, let me know when you’re able to test with that branch. I think it should solve your problem.
On Feb 20, 2024 at 6:32:06 AM, Kishore Mokkarala <kishore....@gmail.com> wrote: > @ 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 > > >>>> > > >>>> > >