My use case is only with SSLFilter. We want  secure communication between
application and sniffer. We reverted to mina 2.0.25,we are not facing this
issue now.

I would like to know what is the difference between 2.0.25 and 2.2.1/2.2.3.

On Sat, 17 Feb, 2024, 6:37 pm Jonathan Valliere, <john...@apache.org> wrote:

> There is also some additional complexity supporting the scenario where two
> different threads are triggering “receive” events on the filter.
>
> 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.
>
> 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.
>
> 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
>>
>

Reply via email to