citusdata / citusdata/citus

Foreign keys between reference tables have locking bugs

Open
#6,196 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
12.8k
Forks
794
Avg merge
2d 14h
Merged PRs (30d)
31

Description

I ran the isolation_ref2ref_foreign_keys test 500 times on my dev machine and 7 failures happened. 5 of these failures were because a query that was supposed to be blocked wasn't actually blocked. 2 others were because less or more locks were held than expected when looking at the pg_locks view.

```diff
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:12:26.459528512 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:12:26.489528512 +0200
@@ -199,21 +199,21 @@

step s1-view-locks:
SELECT mode, count(*)
FROM pg_locks
WHERE locktype='advisory'
GROUP BY mode
ORDER BY 1, 2;

mode |count
-------------+-----
-ExclusiveLock| 3
+ExclusiveLock| 1
ShareLock | 1
(2 rows)

step s1-rollback:
ROLLBACK;

step s2-rollback:
ROLLBACK;

step s1-view-locks:
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:14:24.299528295 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:14:24.309528295 +0200
@@ -796,25 +796,24 @@
step s1-update-table-3:
UPDATE ref_table_3 SET id = 2 WHERE value = 1 RETURNING id;

id
--
2
(1 row)

step s2-insert-table-2:
INSERT INTO ref_table_2 VALUES (7, 5);
-
+
step s1-commit:
COMMIT;

-step s2-insert-table-2: <... completed>
step s2-commit:
COMMIT;

step s1-select-table-3:
SELECT * FROM ref_table_3 ORDER BY id, value;

id|value
--+-----
2| 1
3| 3
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:15:26.809528180 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:15:26.829528180 +0200
@@ -461,26 +461,25 @@
BEGIN;

step s2-begin:
BEGIN;

step s2-delete-table-1:
DELETE FROM ref_table_1 WHERE id = 1;

step s1-insert-table-2:
INSERT INTO ref_table_2 VALUES (7, 2);
-
+
+ERROR: insert or update on table "ref_table_2_114918" violates foreign key constraint "ref_table_2_value_fkey_114918"
step s2-commit:
COMMIT;

-step s1-insert-table-2: <... completed>
-ERROR: insert or update on table "ref_table_2_xxxxxxx" violates foreign key constraint "ref_table_2_value_fkey_xxxxxxx"
step s1-commit:
COMMIT;

step s1-select-table-2:
SELECT * FROM ref_table_2 ORDER BY id, value;

id|value
--+-----
3| 3
5| 5
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:18:24.609527853 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:18:24.629527853 +0200
@@ -693,25 +693,24 @@
BEGIN;

step s2-begin:
BEGIN;

step s2-insert-table-1:
INSERT INTO ref_table_1 VALUES (7, 7);

step s1-update-table-2:
UPDATE ref_table_2 SET id = 0 WHERE value = 2;
-
+
step s2-commit:
COMMIT;

-step s1-update-table-2: <... completed>
step s1-commit:
COMMIT;

step s1-select-table-3:
SELECT * FROM ref_table_3 ORDER BY id, value;

id|value
--+-----
1| 1
3| 3
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:27:26.709526856 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:27:26.739526856 +0200
@@ -368,38 +368,37 @@
BEGIN;

step s2-begin:
BEGIN;

step s2-update-table-1:
UPDATE ref_table_1 SET id = 2 WHERE id = 1;

step s1-insert-table-2:
INSERT INTO ref_table_2 VALUES (7, 2);
-
+
+ERROR: insert or update on table "ref_table_2_129660" violates foreign key constraint "ref_table_2_value_fkey_129660"
step s2-commit:
COMMIT;

-step s1-insert-table-2: <... completed>
step s1-commit:
COMMIT;

step s1-select-table-2:
SELECT * FROM ref_table_2 ORDER BY id, value;

id|value
--+-----
1| 2
3| 3
5| 5
- 7| 2
-(4 rows)
+(3 rows)


starting permutation: s1-begin s2-begin s2-update-table-1 s1-update-table-2 s2-commit s1-commit s1-select-table-2
step s1-begin:
BEGIN;

step s2-begin:
BEGIN;

step s2-update-table-1:
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:32:25.139526307 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:32:25.149526307 +0200
@@ -662,25 +662,24 @@
step s1-update-table-3:
UPDATE ref_table_3 SET id = 2 WHERE value = 1 RETURNING id;

id
--
2
(1 row)

step s2-insert-table-1:
INSERT INTO ref_table_1 VALUES (7, 7);
-
+
step s1-commit:
COMMIT;

-step s2-insert-table-1: <... completed>
step s2-commit:
COMMIT;

step s1-select-table-3:
SELECT * FROM ref_table_3 ORDER BY id, value;

id|value
--+-----
2| 1
3| 3
diff -dU10 -w /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out
--- /home/jelte/work/citus/src/test/regress/expected/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:42:08.689525233 +0200
+++ /home/jelte/work/citus/src/test/regress/results/isolation_ref2ref_foreign_keys.out.modified 2022-08-18 15:42:08.729525233 +0200
@@ -288,21 +288,22 @@

step s1-view-locks:
SELECT mode, count(*)
FROM pg_locks
WHERE locktype='advisory'
GROUP BY mode
ORDER BY 1, 2;

mode |count
------------------------+-----
-(0 rows)
+ShareUpdateExclusiveLock| 1
+(1 row)


starting permutation: s2-begin s2-insert-table-3 s1-view-locks s2-rollback s1-view-locks
step s2-begin:
BEGIN;

step s2-insert-table-3:
INSERT INTO ref_table_3 VALUES (7, 5);

step s1-view-locks:
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.