Hi all,

I recently became aware of an issue with a script that I think
highlights a potential problem that may be a cause of some strange
issues we've seen over the years - especially with pysqlite.

http://trac-hacks.org/ticket/2927

The script or the plugin is not of interest in itself, but more the
general pattern of yield'ing items from an open cursor for use by
others - and where the other use is updating the database. As I read
the code, both cursors will be created from the same connection as
they will generally be executed in the same thread.

In Trac code (and various plugins) this kind of usage is wide-spread -
especially in the various model classes. My hunch is that it may lead
to unpredictable results if the generator is not fully consumed before
use - unpredictable as it will likely depend on how the low-level
cursor/connection code is written. If the amount of data is small, the
cursor may prefetch and cache results for use and therefore won't need
to make new roundtrips over the connection that is then currently
inside an open transaction. From the testing on that ticket, it seems
Postgres works fine but SQLite fails.

Does anyone have deeper insights into such low-level database
behavior? Is this cause for concern? Should we rewrite our code to
consume cursors in full and return lists? Our would it be enough to
document this properly, and suggest that all usage consume the
generator before using result to update data?

Insight most welcome... :-)


:::simon

https://www.coderesort.com

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Trac 
Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/trac-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to