Hi.

I have found some problems with threadlocal strategy and the ResultProxy.

Here is the code that reproduces the problem, Twisted and PostgreSQL are
required.

I'm using SQLAlchemy 0.3.6-1 from Debian Etch.

I don't know if this is a bug of SQLAlchemy.
Is the ResultProxy thread safe?



#! /usr/bin/env python
import sys

from twisted.python import log
from twisted.internet import defer, threads, reactor

import sqlalchemy as sq


def callback(result, i):
     # Is the ResultProxy thread safe?
     if USE_CURSOR:
         rows = list(result)

     log.msg('callback', i)

def errback(reason):
     log.err(reason)

def f():
     l = []

     for i in range(N):
         log.msg('request', i)
         d = threads.deferToThread(db.execute, QUERY)
         d.addCallbacks(callback, errback, callbackArgs=(i,))
         l.append(d)

     return defer.DeferredList(l)

def main():
     return f().addCallbacks(lambda _: None, lambda r: log.err(r)
                             ).addBoth(lambda _: reactor.stop())


POOL_SIZE = 1
N = 10
QUERY = 'SELECT CURRENT_TIMESTAMP'
URL = 'postgres://manlio:[EMAIL PROTECTED]/test'
STRATEGY = 'threadlocal'
USE_CURSOR = False


reactor.suggestThreadPoolSize(POOL_SIZE)
db = sq.create_engine(URL, pool_size=POOL_SIZE, strategy=STRATEGY,
                       echo_pool=False)

log.startLogging(sys.stdout)
reactor.callWhenRunning(main)

reactor.run()



When USE_CURSOR is False, I got (at random) the error:
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 718,
in execute
             connection = self.contextual_connect(close_with_result=True)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/threadlocal.py",
line 148, in contextual_connect
             return self.session.get_connection(**kwargs)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/threadlocal.py",
line 21, in get_connection
             return TLConnection(self, close_with_result=close_with_result)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/threadlocal.py",
line 63, in __init__
             base.Connection.__init__(self, session.engine,
close_with_result=close_with_result)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 368,
in __init__
             self.__connection = connection or engine.raw_connection()
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/threadlocal.py",
line 127, in raw_connection
             return self.connection_provider.get_connection()
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/default.py", line
19, in get_connection
             return self._pool.connect()
           File "/usr/lib/python2.4/site-packages/sqlalchemy/pool.py",
line 150, in connect
             return
self._threadconns[thread.get_ident()].connfairy().checkout()
         exceptions.AttributeError: 'NoneType' object has no attribute
'checkout'


When USE_CURSOR is True, I obtain (at random) any of these two errors:
           File "./concurrency.twisted.py", line 12, in callback
             rows = list(result)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 921,
in __iter__
             row = self.fetchone()
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 997,
in fetchone
             self.close()
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 862,
in close
             self.cursor.close()
           File "/usr/lib/python2.4/site-packages/sqlalchemy/pool.py",
line 312, in close
             if self in self.__parent._cursors:
         exceptions.TypeError: iterable argument required


and:
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 719,
in execute
             return connection.execute(statement, *multiparams, **params)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 444,
in execute
             return Connection.executors[c](self, object, *multiparams,
**params)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 458,
in execute_text
             cursor = self._execute_raw(statement, parameters)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py", line 540,
in _execute_raw
             cursor = self.__engine.dialect.create_cursor(self.connection)
           File
"/usr/lib/python2.4/site-packages/sqlalchemy/databases/postgres.py",
line 277, in create_cursor
             return connection.cursor()
           File "/usr/lib/python2.4/site-packages/sqlalchemy/pool.py",
line 253, in cursor
             self.invalidate()
           File "/usr/lib/python2.4/site-packages/sqlalchemy/pool.py",
line 243, in invalidate
             raise exceptions.InvalidRequestError("This connection is
closed")
         sqlalchemy.exceptions.InvalidRequestError: This connection is
closed




Thanks and regards   Manlio Perillo


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

Reply via email to