Changeset: 67fb4f346916 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/67fb4f346916
Added Files:
        sql/test/concurrent/Tests/duplicate-key-segment-merge.SQL.py
        sql/test/concurrent/Tests/duplicate-key-segment-merge.timeout
Modified Files:
        sql/test/concurrent/Tests/All
Branch: default
Log Message:

add one extra concurrent test, for duplicate keys


diffs (98 lines):

diff --git a/sql/test/concurrent/Tests/All b/sql/test/concurrent/Tests/All
--- a/sql/test/concurrent/Tests/All
+++ b/sql/test/concurrent/Tests/All
@@ -6,3 +6,4 @@ smart-segment-merge
 many-concurrent-client-connections
 truncate-insert-flood
 KNOWNFAIL?7881-concurrent-ddl
+duplicate-key-segment-merge
diff --git a/sql/test/concurrent/Tests/duplicate-key-segment-merge.SQL.py 
b/sql/test/concurrent/Tests/duplicate-key-segment-merge.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/concurrent/Tests/duplicate-key-segment-merge.SQL.py
@@ -0,0 +1,79 @@
+import os
+import sys
+import threading
+from MonetDBtesting import tpymonetdb as pymonetdb
+
+nr_clients = 4
+nr_rounds = 10000
+
+host = os.getenv('MAPIHOST')
+port = int(os.getenv('MAPIPORT'))
+db = os.getenv('TSTDB')
+
+main_conn = pymonetdb.connect(hostname=host, port=port, database=db, 
autocommit=True)
+main_cur = main_conn.cursor()
+main_cur.execute("drop table if exists duplicate_key_test;")
+main_cur.execute("create table duplicate_key_test (k int primary key, v int);")
+
+conns = [pymonetdb.connect(hostname=host, port=port, database=db, 
autocommit=True)
+         for _ in range(nr_clients)]
+cursors = [c.cursor() for c in conns]
+
+barrier = threading.Barrier(nr_clients + 1)
+stop = threading.Event()
+errors = []
+errors_lock = threading.Lock()
+
+
+def client(idx):
+    cur = cursors[idx]
+    r = 0
+    try:
+        while True:
+            barrier.wait()
+            if stop.is_set():
+                return
+            r += 1
+            try:
+                cur.execute("insert into duplicate_key_test values (%d, %d);" 
% (r, r))
+            except pymonetdb.DatabaseError:
+                pass
+            barrier.wait()
+    except threading.BrokenBarrierError:
+        return
+    except BaseException as e:
+        with errors_lock:
+            errors.append(e)
+        stop.set()
+        barrier.abort()
+
+
+threads = [threading.Thread(target=client, args=(i,)) for i in 
range(nr_clients)]
+for t in threads:
+    t.start()
+
+try:
+    for r in range(1, nr_rounds + 1):
+        barrier.wait()
+        barrier.wait()
+        main_cur.execute("select count(*), count(distinct v), sum(k) from 
duplicate_key_test where k=%d;" % r)
+        result = main_cur.fetchall()[0]
+        if result != (1, 1, r):
+            main_cur.execute("select * from duplicate_key_test where k=%d;" % 
r)
+            rows = main_cur.fetchall()
+            print("round %d: expected (1, 1, %d), got %s, rows=%s" % (r, r, 
result, rows),
+                  file=sys.stderr)
+            sys.exit(1)
+except threading.BrokenBarrierError:
+    with errors_lock:
+        err = errors[0] if errors else None
+    print("concurrent client failed: %r" % (err,), file=sys.stderr)
+    sys.exit(1)
+finally:
+    stop.set()
+    barrier.abort()
+    for t in threads:
+        t.join()
+    for c in conns:
+        c.close()
+    main_conn.close()
diff --git a/sql/test/concurrent/Tests/duplicate-key-segment-merge.timeout 
b/sql/test/concurrent/Tests/duplicate-key-segment-merge.timeout
new file mode 100644
--- /dev/null
+++ b/sql/test/concurrent/Tests/duplicate-key-segment-merge.timeout
@@ -0,0 +1,1 @@
+4
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to