New submission from mike bayer <[email protected]>:
segmentation fault related to object deallocation and traceback objects, is
extremely difficult to reproduce and definitely appeared as of 3.10.0b2, does
not occur in 3.10.0b1. linux and osx platforms are affected.
The issue requires "greenlet==1.1.0" to be installed, as well as that for me to
reproduce it I have to use sqlite3 with some special APIs also, so while this
issue might be in greenlet, or sqlite3, I have a feeling these are all factors
that are combining together in a very random way to reveal something that's
actually happening in the interpreter, but in any case would be great if core
devs can see why it happens. The below script has been tested on various linux
platforms, and the overall bug was revealed by an interaction in the SQLAlchemy
test suite that's occurring in many places including OSX, linux. As noted, a
whole bunch of very random things are needed for me to reproduce it.
import greenlet
import sqlite3
class _ErrorContainer(object):
error = None
def _expect_raises_fn(fn):
ec = _ErrorContainer()
try:
fn()
except Exception as err:
assert str(err) == "this is a test"
# assign the exception context outside of the except
# is necessary
ec.error = err
# don't del the exception context is necessary
# del ec
def greenlet_spawn(fn, *args, **kwargs):
# spawning a greenlet is necessary
context = greenlet.greenlet(fn, greenlet.getcurrent())
# assignment to "result" is necessary
result = context.switch(*args, **kwargs)
# raising exception is necessary
raise Exception("this is a test")
class OuterConnectionWrapper:
def __init__(self, connection):
self.connection = connection
def go(self, stmt):
sqlite_connection = self.connection
cursor = sqlite_connection.cursor()
cursor.execute("select 1")
return cursor
def execute(self, stmt):
return greenlet_spawn(self.go, stmt)
def _do_close(self):
self.connection.close()
self.connection = None
def close(self):
self._do_close()
class InnerConnectionWrapper:
def __init__(self, connection):
self.connection = connection
def create_function(self, *arg, **kw):
self.connection.create_function(*arg, **kw)
def cursor(self):
return self.connection.cursor()
def close(self):
self.connection = None
class ConnectionPool:
def __init__(self):
self.conn = sqlite3.connect(":memory:")
def regexp(a, b):
return None
self.conn.create_function("regexp", 2, regexp)
def connect(self):
return InnerConnectionWrapper(self.conn)
def do_test():
pool = ConnectionPool()
def go():
c1 = pool.connect()
conn = OuterConnectionWrapper(c1)
try:
conn.execute("test")
finally:
conn.close()
_expect_raises_fn(go)
do_test()
----------
components: Interpreter Core
messages: 395028
nosy: zzzeek
priority: normal
severity: normal
status: open
title: segmentation fault appeared in python 3.10.0b2
versions: Python 3.10
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue44304>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com