@ 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 >>>>> >>>>>