mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-26 10:53:44 +03:00
Added script to demonstrate the refcount bug during copy
from https://bugzilla.redhat.com/show_bug.cgi?id=711095
This commit is contained in:
parent
dd7ee7093a
commit
2a1b2b5713
59
scripts/ticket58.py
Normal file
59
scripts/ticket58.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
"""
|
||||
A script to reproduce the race condition described in ticket #58
|
||||
|
||||
from https://bugzilla.redhat.com/show_bug.cgi?id=711095
|
||||
|
||||
Results in the error:
|
||||
|
||||
python: Modules/gcmodule.c:277: visit_decref: Assertion `gc->gc.gc_refs != 0'
|
||||
failed.
|
||||
|
||||
on unpatched library.
|
||||
"""
|
||||
|
||||
import threading
|
||||
import gc
|
||||
import time
|
||||
|
||||
import psycopg2
|
||||
from StringIO import StringIO
|
||||
|
||||
done = 0
|
||||
|
||||
class GCThread(threading.Thread):
|
||||
# A thread that sits in an infinite loop, forcing the garbage collector
|
||||
# to run
|
||||
def run(self):
|
||||
global done
|
||||
while not done:
|
||||
gc.collect()
|
||||
time.sleep(0.1) # give the other thread a chance to run
|
||||
|
||||
gc_thread = GCThread()
|
||||
|
||||
|
||||
# This assumes a pre-existing db named "test", with:
|
||||
# "CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);"
|
||||
|
||||
conn = psycopg2.connect("dbname=test user=postgres")
|
||||
cur = conn.cursor()
|
||||
|
||||
# Start the other thread, running the GC regularly
|
||||
gc_thread.start()
|
||||
|
||||
# Now do lots of "cursor.copy_from" calls:
|
||||
for i in range(1000):
|
||||
f = StringIO("42\tfoo\n74\tbar\n")
|
||||
cur.copy_from(f, 'test', columns=('num', 'data'))
|
||||
# Assuming the other thread gets a chance to run during this call, expect a
|
||||
# build of python (with assertions enabled) to bail out here with:
|
||||
# python: Modules/gcmodule.c:277: visit_decref: Assertion `gc->gc.gc_refs != 0' failed.
|
||||
|
||||
|
||||
# Terminate the GC thread's loop:
|
||||
done = 1
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user