Git Product home page Git Product logo

Comments (4)

allenxwang avatar allenxwang commented on August 11, 2024

If we put the channel back to the idle pool without closing it, the next time it is picked for reuse and the read timeout has not happened yet, it will cause problem as we are sending another request on the channel without getting the response from the first request, right? Does HTTP protocol allow sending two requests on the same socket without getting the response from the first?

from rxnetty.

allenxwang avatar allenxwang commented on August 11, 2024

ConnectionLifecycleHandler remains in the pipeline after a channel is returned to the pool. Currently the channelUnregistered() method in this handler calls connection.close() which returns the channel to the pool. The pool will remove the channel if it is already closed and not reusable.

Is channelUnregsitered() automatically called when channel is closed? If not, we just need to make connection.close() is called when channel is closed. Perhaps by overriding channelInactive()?

from rxnetty.

NiteshKant avatar NiteshKant commented on August 11, 2024

If we put the channel back to the idle pool without closing it

May be I was not clear in my description. I did not mean to put the channel back into the reusable pool before it is closed. I meant that; this is what will happen, if we close the connection after the request processing is over i.e. when readtimeout occurs. This was just an example. The basic problem is that we are not listening to socket close events, which can happen without user interaction, eg: Channel closed by the server.

ConnectionLifecycleHandler remains in the pipeline after a channel is returned to the pool. Currently the channelUnregistered() method in this handler calls connection.close() which returns the channel to the pool. The pool will remove the channel if it is already closed and not reusable.

In the case when we close the connection (fix for issue #21 ) after we are done, conn.close() in channelUnregistered() will be a no-op as ObservableConnection ignore multiple close on the same connection. So, this call will not do what you expect it to do i.e. have isReusable() return false in the pool implementation.

Is channelUnregsitered() automatically called when channel is closed?

Channel unregistered is called when the channel is unregistered from the eventloop which happens after channelInactive() is invoked i.e. when the channel is closed.

If not, we just need to make connection.close() is called when channel is closed. Perhaps by overriding channelInactive()?

We need to explicitly remove this channel from the pool when we get a channelInactive() event as connection.close() may have been called before and hence will be ignored as explained above.

from rxnetty.

NiteshKant avatar NiteshKant commented on August 11, 2024

Pull Request #95 fixes this issue. Since, now the Pool is an ObservableConnection pool, the connection.close() already invoked on the underlying connection close returns the connection to the pool, which discards the connection as it is not active.

from rxnetty.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.