On Fri, Sep 1, 2017 at 10:57 AM, Tony Locke <tlo...@tlocke.org.uk> wrote:
> So, next problem. The test
> test/aaa_profiling/test_memusage.py::MemUsageWBackendTest_postgresql+pg8000_9_5_8::test_many_updates
> fails because pg8000 creates a new prepared statement for each unique sql
> statement, which entails a creation of object within the driver, and so the
> memory usage keeps increasing. I've marked this test with
> @testing.fails_on('postgresql+pg8000', 'prepared statements use memory'),
> and now all the test test/aaa_profiling/test_memusage.py tests pass.

do you consider that to be a bug in pg8000?





>
> Now, on with the other tests!
>
> On Thursday, 31 August 2017 15:15:16 UTC+1, Mike Bayer wrote:
>>
>> On Thu, Aug 31, 2017 at 7:02 AM, Tony Locke <tlo...@tlocke.org.uk> wrote:
>> > There's a new release (1.11.0) of the pg8000 driver for PostgreSQL. It's
>> > a
>> > pure-python driver, and it already has a dialect for SQLAlchemy. This
>> > latest
>> > release is not backwardly compatible with the previous release, and I'm
>> > trying to modify the dialect accordingly. The main change is that
>> > connections and cursors are no longer threadsafe. In DB-API terms it has
>> > a
>> > threadsafety value of 1 (Threads may share the module, but not
>> > connections).
>> >
>> > So the first problem I ran into was in the on_connect() method in the
>> > dialiect. It referred to the 'unicode' keyword, which caused a problem
>> > under
>> > Python 3. So I deleted the following:
>> >
>> >          def on_connect(conn):
>> >              conn.py_types[quoted_name] = conn.py_types[unicode]
>> >          fns.append(on_connect)
>> >
>>
>> that was a recent fix for a regression:
>>
>>
>> https://github.com/zzzeek/sqlalchemy/commit/03560c4b83308719067ec635662c35f9a437fb7f
>>
>> it is fixed in
>>
>>
>> https://github.com/zzzeek/sqlalchemy/commit/d0470e296ea589620c94d8f2dd37e94b8f03842a
>>
>>
>> > just to get the tests going. The next problem is:
>> >
>> >
>> > test/aaa_profiling/test_memusage.py::MemUsageWBackendTest_postgresql+pg8000_9_5_8::()::test_alias_pathing
>> >
>> > which I think fails due to a threading problem. It seems that somehow
>> > the
>> > DB-API connection is shared between threads, which isn't supported any
>> > more
>> > with pg8000. So my question is, is it the case that:
>> >
>> > a. DB-API connections must be threadsafe to work with SQLAlchemy.
>>
>> not at all, SQLAlchemy holds that its own Session and Connection which
>> ultimately refer to the DBAPI connection are themselves not
>> threadsafe.
>>
>> > b. There's a something wrong with the test.
>>
>> the memusage tests are often omitted from normal testing as they are
>> extremely process/memory intensive, but they don't spawn any threads.
>>   In the past few weeks the memusage suite has been altered such that
>> each memusage test is run in a separate *process* however, so there is
>> some concurrency going on.   When the new process is created, the test
>> makes a new connection pool so that it should not refer to any
>> database connections that were transferred to the child fork, however
>> it also doesn't try to close them or anything else - they should be
>> totally ignored.   However if pg8000 is tracking some kind of global
>> state, like a collection of prepared statements, this state needs to
>> travel across the process boundary as well without impacting the
>> parent process even if the child process ends.
>>
>> The failure can be isolated by doing a pdb like this:
>>
>> diff --git a/test/aaa_profiling/test_memusage.py
>> b/test/aaa_profiling/test_memusage.py
>> index 3181cfe61..ff600b85d 100644
>> --- a/test/aaa_profiling/test_memusage.py
>> +++ b/test/aaa_profiling/test_memusage.py
>> @@ -636,6 +636,8 @@ class MemUsageWBackendTest(EnsureZeroed):
>>          try:
>>              go()
>>          finally:
>> +            import pdb
>> +            pdb.set_trace()
>>              metadata.drop_all()
>>          clear_mappers()
>>
>> This brings me right to a clean state where "next" will produce the
>> error.   Looking at Postgresql processes within the block, there are
>> no open transactions to the DB.  If you pdb right here, you can poke
>> around to see what state might be present.
>>
>>
>>
>>
>> > c. Something else.
>> >
>> > Thanks for your help!
>> >
>> > --
>> > 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+...@googlegroups.com.
>> > To post to this group, send email to sqlal...@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.

-- 
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