that was actually quite easy!

https://github.com/sqlalchemy/sqlalchemy/issues/4507

On Tue, Feb 19, 2019 at 7:18 PM Mike Bayer <mike...@zzzcomputing.com> wrote:
>
> this will be moving to a github issue, and also I will attempt to
> create a proof of concept.
>
> Everything that happens inside of _memoized_attr__simple_lazy_clause
> involves creating copies of things and the state of the loader
> strategy is not modified until it's done.  There is one "unique=False"
> flag set on existing bindparam objects, however if multiple threads
> all did that at the same time, it doesn't change the outcome.    The
> two elements of the tuple returned, "crtierion" and "params", need to
> match, however these are returned as a tuple and that's what's
> assigned; if two different threads both ran the method at the same
> time, one would replace the other....but I guess the baked query is
> getting the state of the earlier one cached in some way, but, I don't
> see how the two generations are meaningfully different....but that's
> where something would need to be failing.      Best option would be if
> it's not a problem for this code to run concurrently, however we can
> use the mapper._CONFIGURE_MUTEX for this, but there are probably a lot
> of other places where this kind of thing can happen if the
> introduction of baked + memoized attrs has this issue.
>
> On Tue, Feb 19, 2019 at 4:03 PM Krzysztof Sulejczak
> <krzysztof.sulejc...@gmail.com> wrote:
> >
> > Hi,
> >
> > I'm maintaining a multi-threaded application which uses sqlalchemy to 
> > access mysql db. Some time ago we decided to upgrade
> > sqlalchemy version from 1.1.18 to 1.2.14 and since then we started 
> > observing strange problems, the application started
> > throwing IntegrityError in code like that:
> >
> > translation = item.translation  # translation is a relation
> > if translation is None:
> >     session.add(Translation(item=item))  # this throws error
> >
> > Strange thing was that these errors happened rather rarely, there were a 
> > few hundred application processes running and only
> > a few of them were throwing such errors. Restarting those processed made 
> > the errors vanish.
> > I started debugging faulty processes and noticed that sql query generated 
> > looked like this:
> >
> > SELECT <truncated list of columns>
> > FROM ebay_translations
> > WHERE NULL = ebay_translations.item_id
> >
> > Further debugging led me to LazyLoader._emit_lazyload and BackedQuery 
> > thingy where I believe problem lays:
> > if a thread switch occurs inside _memoized_attr__simple_lazy_clause it 
> > could happen that BindParameter keys and
> > cached relation query will not match each other.
> >
> > Since that discovery I've been running the application with patched version 
> > of sqlalchemy for two months now,
> > IntegrityErrors are gone.
> >
> > Can you please take a look at this patch? Or maybe this issue is known and 
> > there exists workaround for it although I searched
> > the mailing list archive and found nothing.
> >
> > best regards
> > Krzysztof Sulejczak
> >
> > --
> > SQLAlchemy -
> > The Python SQL Toolkit and Object Relational Mapper
> >
> > http://www.sqlalchemy.org/
> >
> > To post example code, please provide an MCVE: Minimal, Complete, and 
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> > description.
> > ---
> > 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 https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to