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