Changeset: c0cd9b00e365 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c0cd9b00e365
Added Files:
        sql/test/mergetables/Tests/transaction-conflict.py
Modified Files:
        sql/test/mergetables/Tests/All
Branch: Nov2019
Log Message:

New bug, merge table children list is not cleaned properly after a transaction 
rollback


diffs (91 lines):

diff --git a/sql/test/mergetables/Tests/All b/sql/test/mergetables/Tests/All
--- a/sql/test/mergetables/Tests/All
+++ b/sql/test/mergetables/Tests/All
@@ -19,6 +19,7 @@ KNOWNFAIL?singlekeyconstraint
 part-elim
 mergedropcascade
 addtable
+HAVE_PYMONETDB?transaction-conflict
 
 mergedb_create
 HAVE_NETCDF&HAVE_SAMTOOLS?mergedb.Bug-6820
diff --git a/sql/test/mergetables/Tests/transaction-conflict.py 
b/sql/test/mergetables/Tests/transaction-conflict.py
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/transaction-conflict.py
@@ -0,0 +1,75 @@
+import os
+import sys
+import threading
+import pymonetdb
+
+try:
+    from MonetDBtesting import process
+except ImportError:
+    import process
+
+"""
+Attempt to modify a merge table in a conflicting transaction. After the 
rollback, the table's contents must be cleaned
+"""
+
+class MergeTableWriter(threading.Thread):
+    def __init__(self, barrier1, barrier2):
+        self._wconn = pymonetdb.connect(port = int(os.getenv('MAPIPORT', 
'50000')), database = os.getenv('TSTDB', 'demo'), hostname = 
os.getenv('MAPIHOST', 'localhost'), autocommit=True)
+        self._wcursor = self._wconn.cursor()
+        self._barrier1 = barrier1
+        self._barrier2 = barrier2
+        threading.Thread.__init__(self)
+
+    def run(self):
+        i = 0
+        while i < 3:
+            self._wcursor.execute('START TRANSACTION;')
+            barrier1.wait()
+            self._wcursor.execute('ALTER TABLE "mt" ADD TABLE "part";')
+            self._wcursor.execute('ALTER TABLE "mt" DROP TABLE "part";')
+            barrier2.wait()
+            self._wcursor.execute('ROLLBACK;')
+            i += 1
+
+server = process.server(stdin=process.PIPE, stdout=process.PIPE, 
stderr=process.PIPE)
+conn = pymonetdb.connect(port = int(os.getenv('MAPIPORT', '50000')), database 
= os.getenv('TSTDB', 'demo'), hostname = os.getenv('MAPIHOST', 'localhost'), 
autocommit=True)
+cursor = conn.cursor()
+barrier1 = threading.Barrier(2)
+barrier2 = threading.Barrier(2)
+
+cursor.execute("""
+START TRANSACTION;
+DROP TABLE IF EXISTS "mt";
+DROP TABLE IF EXISTS "part";
+DROP TABLE IF EXISTS "dummy";
+CREATE MERGE TABLE "mt"("col1" int);
+CREATE TABLE "part"("col1" int);
+COMMIT;
+""")
+
+mtwriter = MergeTableWriter(barrier1, barrier2)
+mtwriter.start()
+
+i = 0
+while i < 3:
+    barrier1.wait()
+    cursor.execute('CREATE TABLE "dummy"(col1 int);')
+    cursor.execute('DROP TABLE "dummy";')
+    barrier2.wait()
+    barrier1.reset()
+    barrier2.reset()
+    i += 1
+
+mtwriter.join()
+
+cursor.execute("""
+START TRANSACTION;
+DROP TABLE "mt";
+DROP TABLE "part";
+DROP TABLE "dummy";
+COMMIT;
+""")
+
+sout, serr = server.communicate()
+sys.stdout.write(sout)
+sys.stderr.write(serr)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to