From d4f639742dfe60aad4180cec6a56d9dbadf239e3 Mon Sep 17 00:00:00 2001 From: Keyur Panchal Date: Mon, 3 Mar 2025 19:02:20 +0530 Subject: [PATCH] Do DELETE instead of TRUNCATE when locks aren't acquired After compression, the uncompressed part of the chunk is truncated. This requires upgrading the `ExclusiveLock` to an `AccessExclusiveLock` and hence is sometimes blocked by other other operations, including reads, on the chunk. This leads to longer compress times or potential deadlocks. Instead of this, we fall back to deleting the tuples in the chunk row-by-row when the upgraded lock isn't immediately acquired. --- .unreleased/pr_7785 | 1 + tsl/src/compression/compression.c | 10 +- .../expected/compression_conflicts_iso.out | 117 +++++++++--------- .../specs/compression_conflicts_iso.spec | 16 +-- 4 files changed, 76 insertions(+), 68 deletions(-) create mode 100644 .unreleased/pr_7785 diff --git a/.unreleased/pr_7785 b/.unreleased/pr_7785 new file mode 100644 index 00000000000..5bbb8afd00f --- /dev/null +++ b/.unreleased/pr_7785 @@ -0,0 +1 @@ +Implements: #7785 Do DELETE instead of TRUNCATE when locks aren't acquired diff --git a/tsl/src/compression/compression.c b/tsl/src/compression/compression.c index 0a7e5326dbf..0c5fc6931da 100644 --- a/tsl/src/compression/compression.c +++ b/tsl/src/compression/compression.c @@ -505,7 +505,15 @@ compress_chunk(Oid in_table, Oid out_table, int insert_options) if (!ts_guc_enable_delete_after_compression) { DEBUG_WAITPOINT("compression_done_before_truncate_uncompressed"); - truncate_relation(in_table); + if (ConditionalLockRelation(in_rel, AccessExclusiveLock)) + { + truncate_relation(in_table); + } + else + { + /* Instead of waiting, delete rows one-by-one */ + delete_relation_rows(in_table); + } DEBUG_WAITPOINT("compression_done_after_truncate_uncompressed"); } else diff --git a/tsl/test/isolation/expected/compression_conflicts_iso.out b/tsl/test/isolation/expected/compression_conflicts_iso.out index 447d7c5a2dd..27f05ddd54b 100644 --- a/tsl/test/isolation/expected/compression_conflicts_iso.out +++ b/tsl/test/isolation/expected/compression_conflicts_iso.out @@ -16,7 +16,7 @@ lock_chunktable step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step C1: BEGIN; @@ -74,7 +74,7 @@ lock_chunktable step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step C1: BEGIN; @@ -132,7 +132,7 @@ lock_chunktable step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step C1: BEGIN; @@ -190,7 +190,7 @@ lock_chunktable step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step C1: BEGIN; @@ -254,7 +254,7 @@ lock_chunktable step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step C1: BEGIN; @@ -318,7 +318,7 @@ lock_chunktable step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step C1: BEGIN; @@ -392,7 +392,7 @@ step C1: step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -459,7 +459,7 @@ step C1: step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -526,7 +526,7 @@ step C1: step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -593,7 +593,7 @@ step C1: step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -660,7 +660,7 @@ step C1: step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -727,7 +727,7 @@ step C1: step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step C1: <... completed> @@ -797,7 +797,7 @@ chunk_status step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -857,7 +857,7 @@ chunk_status step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -917,7 +917,7 @@ chunk_status step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -977,7 +977,7 @@ chunk_status step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1043,7 +1043,7 @@ chunk_status step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1103,7 +1103,7 @@ chunk_status step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1163,7 +1163,7 @@ chunk_status step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -1229,7 +1229,7 @@ chunk_status step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -1289,7 +1289,7 @@ chunk_status step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step IN1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 200, 100) ON CONFLICT DO NOTHING; step UnlockChunkTuple: ROLLBACK; @@ -1349,7 +1349,7 @@ chunk_status step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1415,7 +1415,7 @@ chunk_status step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1475,7 +1475,7 @@ chunk_status step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step INu1: BEGIN; INSERT INTO ts_device_table VALUES (1, 1, 100, 99) ON CONFLICT(time, device) DO UPDATE SET value = 99; step UnlockChunkTuple: ROLLBACK; @@ -1521,7 +1521,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -1559,7 +1559,7 @@ step RC: step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -1609,7 +1609,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -1647,7 +1647,7 @@ step RC: step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -1697,7 +1697,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -1735,7 +1735,7 @@ step RC: step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -1785,7 +1785,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -1823,7 +1823,7 @@ step RC: step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -1873,7 +1873,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -1911,7 +1911,7 @@ step RC: step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -1967,7 +1967,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2005,7 +2005,7 @@ step RC: step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step UnlockChunk: ROLLBACK; step RC: <... completed> @@ -2061,7 +2061,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2146,7 +2146,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2237,7 +2237,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2261,7 +2261,7 @@ lock_chunktable step IB: BEGIN; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step RC: DO $$ @@ -2325,7 +2325,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2349,7 +2349,7 @@ lock_chunktable step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step RC: DO $$ @@ -2413,7 +2413,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2437,7 +2437,7 @@ lock_chunktable step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step RC: DO $$ @@ -2501,7 +2501,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2525,7 +2525,7 @@ lock_chunktable step IB: BEGIN; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step RC: DO $$ @@ -2595,7 +2595,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2619,7 +2619,7 @@ lock_chunktable step IBRR: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step RC: DO $$ @@ -2689,7 +2689,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2713,7 +2713,7 @@ lock_chunktable step IBS: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; step Iu1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; step RC: DO $$ @@ -2783,7 +2783,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -2868,7 +2868,7 @@ t step CAc: COMMIT; step I1: - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; step SChunkStat: SELECT status from _timescaledb_catalog.chunk WHERE id = ( select min(ch.id) FROM _timescaledb_catalog.hypertable ht, _timescaledb_catalog.chunk ch WHERE ch.hypertable_id = ht.id AND ht.table_name like 'ts_device_table'); @@ -3023,7 +3023,12 @@ step CA1: CASE WHEN compress_chunk(ch) IS NOT NULL THEN true ELSE false END AS compress FROM show_chunks('ts_device_table') AS ch ORDER BY ch::text; - + +compress +-------- +t +(1 row) + step SA: SELECT * FROM ts_device_table; time|device|location|value ----+------+--------+----- @@ -3041,10 +3046,4 @@ time|device|location|value step SF: step SR: ROLLBACK; -step CA1: <... completed> -compress --------- -t -(1 row) - step CAc: COMMIT; diff --git a/tsl/test/isolation/specs/compression_conflicts_iso.spec b/tsl/test/isolation/specs/compression_conflicts_iso.spec index 511daeae87a..249d1b8ba60 100644 --- a/tsl/test/isolation/specs/compression_conflicts_iso.spec +++ b/tsl/test/isolation/specs/compression_conflicts_iso.spec @@ -31,11 +31,11 @@ session "I" step "IB" { BEGIN; } step "IBRR" { BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; } step "IBS" { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; } -step "I1" { - INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; +step "I1" { + INSERT INTO ts_device_table VALUES (1, 1, 100, 100) ON CONFLICT DO NOTHING; } -step "Iu1" { - INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; +step "Iu1" { + INSERT INTO ts_device_table VALUES (1, 1, 100, 98) ON CONFLICT(time, device) DO UPDATE SET value = 98; } step "Ic" { COMMIT; } @@ -182,13 +182,13 @@ permutation "CA1" "CAc" "I1" "SChunkStat" "LockChunk1" "IBS" "Iu1" "RC" "Unloc permutation "CA1" "CAc" "I1" "SChunkStat" "LockChunk1" "IN1" "RC" "UnlockChunk" "INc" "SH" "SA" "SChunkStat" permutation "CA1" "CAc" "I1" "SChunkStat" "LockChunk1" "INu1" "RC" "UnlockChunk" "INc" "SH" "SA" "SChunkStat" "SU" -# Decompressing a chunk should not stop any reads +# Decompressing a chunk should not stop any reads # until the end when we drop the compressed chunk # which happens after updates to the chunk catalog tuple permutation "CA1" "CAc" "LockChunkTuple" "DA1" "SA" "SF" "UnlockChunkTuple" "DAc" # Compressing a chunk should not stop any reads -# until it comes to truncating the uncompressed chunk -# which happens at the end of the operations along with -# catalog updates. +# Truncating the uncompressed chunk (which happens at the end +# of the operations along with catalog updates) does not block +# It falls back to deleting the tuples row-by-row if lock upgrade does not go through permutation "SB" "SA" "CA1" "SA" "SF" "SR" "CAc"