Problem solved.
Michael - you nailed it when you guessed:
if you have set an event listener on a single session that is definitely
the
actual Session object and not the thread local or the scoped_session or
anything
sa.event.listen was being passed the scoped_session instance, not an actual
instance. This scoped_session usage is all through the code, per what
seems to be an old way of doing things... that being that the object
returned by scoped_session() object had all of the Session objects as a
convenience, so they were pretty much interchangeable. Clearly not with
the event system!
Calling the object to get the actual session prevents any unexpected
rollback handlers from firing shots from the Session graveyard.
Thanks for the help!
Russ
PS: had to dig through some old docs to check my sanity on the
scoped_session-as-a-Session confusion. It was clearly a legit way to do it
back in 0.6:
http://docs.sqlalchemy.org/en/rel_0_6/orm/session.html?highlight=remove#creating-a-thread-local-context
... but new docs have no such comments/recommendations. I think the new
method and docs are clearer.
I'm thinking I should scrub all code for this type of usage and fix it up
so there's no blurry line between Sessions and
sessionmakers/scoped_sessions. Do you recommend that?
On Monday, February 9, 2015 at 9:47:23 PM UTC-5, Russ wrote:
Thanks for the idea, Jonathan! I was actually discussing such a fallback
watchdog on #postgresql earlier today. Now that I've been having event
troubles and it is highlighting atomicity issues with the db/filesystem
split, I'm definitely going to implement such a safety net.
I think the problem is slightly different than yours, though. In my case
the file have been written in mid-transaction, and I want to delete it
if/when the transaction rolls back. If my rollback detector is failing (my
bug, I'm sure) I have no db flag to check. The watchdog needs to check the
filesystem for dangling files (files with no db reference). This will
likely be two phase check (with a big gap) to avoid race conditions, but
should be easy enough since file dirs+names are done by database id. If
the id is 123456789 it stores to `/files/123/456/789`. The dir splitting
should help minimize requirements on filesystem awareness... glad I did
that.
My bigger problem right now is that the late-firing zombie rollback
handler is actually sniping files it shouldn't be! Rollbacks in
subsequent/unrelated sessions are sniping files from sessions that ran to
commit without issue. Watchdog or not, I need to fix that!!
I really wish databases handled hybrid db/filesystem storage better. Any
errors in file deletion code are deadly. SQL Server has that nice
FILESTREAM object for precisely this situation, but it doesn't seem that
others do yet.
--
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.