From 2a1b2b5713ffefbfbb22e95b7182577e3cd212a2 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 6 Jun 2011 23:41:31 +0100 Subject: [PATCH] Added script to demonstrate the refcount bug during copy from https://bugzilla.redhat.com/show_bug.cgi?id=711095 --- scripts/ticket58.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 scripts/ticket58.py diff --git a/scripts/ticket58.py b/scripts/ticket58.py new file mode 100644 index 00000000..86cabac3 --- /dev/null +++ b/scripts/ticket58.py @@ -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() + +