On 5/14/15 12:43 PM, Jonathon Nelson wrote:

And indeed you are correct. However, this comes as quite a surprise to me.
As an idiom:

try:
    do_stuff()
except SomeError, e:
    make_some_noise(e)
    maybe_return_here_etc

is a pretty common idiom. I tried deleting 'e' within the except block without any luck.
it's the traceback object itself that is holding onto the ConnectionFairy object that was the subject of the error, this is not in fact even related to any contextual objects related to the SQLAlchemy exception itself. The traceback is held within sys.exc_info().


In fact, I did a search for sys.exc_clear() and found almost literally no code making use of that call.

this particular failure only occurs if about five different conditions are in play at the same time. After ten years, you're the first to hit them all simultaneously (and report it): 1.checkout event handler is in use, 2. pool is set to size 1 w no overflow, 3. database server is shut off so that reconnects cannot occur, 4. stack trace object is not cleared from memory, 5. identical operation is attempted again

I suggest that this is a bit of POLA violation (principle of least astonishment).

you are correct, though when the database is down totally and a connection attempt throws an OperationalError, people are usually not expecting much from subsequent connection attempts. The condition vanishes very easily, such as the typical case that the error was caught within a function, which then exits before another connection attempt occurs. So this is a very unique corner case.

Is this due to how SQLAlchemy holds on to some measure of state?
it is due to the mechanics of a Python stack trace object holding onto stack frames each of which refer strongly to the contents of locals() within each frame.


Should it maybe be using copies or weakrefs?
funny thing is that because the pool does use weakrefs to ensure things are cleaned up, this condition is very hard to trap since it vanishes once the stack trace does.


Or, is this more of a situation that only as a result of the specific configuration choices made above? (in which case I contend that it's still a POLA violation, but not one that is as likely to bite people)

it's because a method called ConnectionRecord.get_connection() is responsible for calling down to the database connection process, and if this method fails within the "checkout" process, it will raise an exception that just propagates all the way out, while the record itself is not actually returned to the connection pool, unless exceptions here are reraised only after setting the record back into a checked in state. This occurs at a well known point during a normal checkout, however it is called in one extra place in the specific case that a checkout handler is in use which itself raises a DisconnectionError. A bug has been added at https://bitbucket.org/zzzeek/sqlalchemy/issue/3419/connection-record-not-immediately-checked to indicate this should be added and has been fixed for 1.0.5 in 4a0e51e7d2f3 <https://bitbucket.org/zzzeek/sqlalchemy/commits/4a0e51e7d2f3>. Thanks for reporting!







--
You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com <mailto:sqlalchemy+unsubscr...@googlegroups.com>. To post to this group, send email to sqlalchemy@googlegroups.com <mailto:sqlalchemy@googlegroups.com>.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to