Giter Club home page Giter Club logo

Comments (11)

Boscop avatar Boscop commented on August 19, 2024 2

We're running into this issue in production.

Does anyone know a workaround that works now?

from r2d2.

Diggsey avatar Diggsey commented on August 19, 2024 1

I just ran into this issue - it's definitely not theoretical, and has some pretty nasty consequences: namely transactions may not be closed correctly when a thread panics. Since database locks are held until the transaction is closed, this can result in the entire system locking up indefinitely.

I believe the "most correct" solution here would be to require manually returning the connection to the pool, because using thread::panicking is not quite correct (the connection may have been opened whilst unwinding, in which case it is safe to return).

For backwards compatibility, perhaps you could add a "discard" method and an "unwind-safe" wrapper which automatically discards the connection when dropped unless you explicitly return it to the pool.

from r2d2.

sfackler avatar sfackler commented on August 19, 2024

Is this in reference to a connection implementation that will be in a bad state during a panic, or is this more of a general principle of the thing?

from r2d2.

sgrif avatar sgrif commented on August 19, 2024

I don't have a concrete example of a connection which has broken invariants when a panic occurs if that's what you mean. I'm sure I can find one pretty easily if you really don't believe that those cases exist.

from r2d2.

sfackler avatar sfackler commented on August 19, 2024

The fact that I'm not aware of any instance in which this has been a problem in the last several years guides my instincts to some extent 😃 .

That being said, I don't think I have a problem dropping connections that are checked back in after a panic. It can always be made configurable if that impacts someone's use case negatively.

from r2d2.

sgrif avatar sgrif commented on August 19, 2024

The fact that I'm not aware of any instance in which this has been a problem in the last several years

catch_unwind has been stable for less than a year. 😄

from r2d2.

sfackler avatar sfackler commented on August 19, 2024

I don't see how that's really related? Other kinds of "panic safety" like mutex poisoning has been around for quite a long time.

from r2d2.

Diggsey avatar Diggsey commented on August 19, 2024

Hm, on second thoughts, the thread::panicking solution is probably "good enough" (tm) - the remaining functionality can be implemented on the underlying connection type using has_broken.

from r2d2.

sfackler avatar sfackler commented on August 19, 2024

Can you not use RAII for your transaction management?

from r2d2.

Boscop avatar Boscop commented on August 19, 2024

@sfackler You mean rolling back the transaction on Drop if the drop was caused by a panic?

from r2d2.

sfackler avatar sfackler commented on August 19, 2024

I mean rolling back the connection on Drop if the transaction hasn't been committed: https://github.com/sfackler/rust-postgres/blob/master/tokio-postgres/src/transaction.rs#L30

from r2d2.

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.