From 23b2665d42f0f524036263edbcc1dfd51d6500b6 Mon Sep 17 00:00:00 2001 From: Sven Klemm Date: Sat, 17 Feb 2024 08:03:50 +0100 Subject: [PATCH] Don't try to compress osm chunks This patch filters out the osm chunk in the compression policy and adds some additional checks so we dont run compress_chunk on osm chunks. --- sql/policy_internal.sql | 2 +- src/chunk.c | 22 +++++++++++++++++++++ tsl/src/chunk.c | 2 +- tsl/src/compression/compression.c | 4 ++++ tsl/test/expected/compression_errors-13.out | 13 ++++++++++++ tsl/test/expected/compression_errors-14.out | 13 ++++++++++++ tsl/test/expected/compression_errors-15.out | 13 ++++++++++++ tsl/test/expected/compression_errors-16.out | 13 ++++++++++++ tsl/test/sql/compression_errors.sql.in | 11 +++++++++++ 9 files changed, 91 insertions(+), 2 deletions(-) diff --git a/sql/policy_internal.sql b/sql/policy_internal.sql index 43b677b02..28b97120c 100644 --- a/sql/policy_internal.sql +++ b/sql/policy_internal.sql @@ -95,7 +95,7 @@ BEGIN INNER JOIN pg_namespace pgns ON pgc.relnamespace = pgns.oid INNER JOIN _timescaledb_catalog.chunk ch ON ch.table_name = pgc.relname AND ch.schema_name = pgns.nspname AND ch.hypertable_id = htid WHERE - ch.dropped IS FALSE + NOT ch.dropped AND NOT ch.osm_chunk AND ( ch.status = 0 OR ( diff --git a/src/chunk.c b/src/chunk.c index 6b41e7039..7fcbbcc5e 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -4383,6 +4383,28 @@ ts_chunk_validate_chunk_status_for_operation(const Chunk *chunk, ChunkOperation Oid chunk_relid = chunk->table_id; int32 chunk_status = chunk->fd.status; + /* + * Block everything but DELETE on OSM chunks. + */ + if (chunk->fd.osm_chunk) + { + switch (cmd) + { + case CHUNK_DROP: + return true; + break; + + default: + if (throw_error) + elog(ERROR, + "%s not permitted on tiered chunk \"%s\" ", + get_chunk_operation_str(cmd), + get_rel_name(chunk_relid)); + return false; + break; + } + } + /* Handle frozen chunks */ if (ts_flags_are_set_32(chunk_status, CHUNK_STATUS_FROZEN)) { diff --git a/tsl/src/chunk.c b/tsl/src/chunk.c index 1b9ee6927..6e7ad06b3 100644 --- a/tsl/src/chunk.c +++ b/tsl/src/chunk.c @@ -58,7 +58,7 @@ chunk_freeze_chunk(PG_FUNCTION_ARGS) { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("operation not supported on distributed chunk or foreign table \"%s\"", + errmsg("operation not supported on tiered chunk \"%s\"", get_rel_name(chunk_relid)))); } if (ts_chunk_is_frozen(chunk)) diff --git a/tsl/src/compression/compression.c b/tsl/src/compression/compression.c index 18d77da5b..8e452de02 100644 --- a/tsl/src/compression/compression.c +++ b/tsl/src/compression/compression.c @@ -281,6 +281,10 @@ compress_chunk(Oid in_table, Oid out_table, int insert_options) */ Relation out_rel = relation_open(out_table, ExclusiveLock); + /* Sanity check we are dealing with relations */ + Ensure(in_rel->rd_rel->relkind == RELKIND_RELATION, "compress_chunk called on non-relation"); + Ensure(out_rel->rd_rel->relkind == RELKIND_RELATION, "compress_chunk called on non-relation"); + TupleDesc in_desc = RelationGetDescr(in_rel); TupleDesc out_desc = RelationGetDescr(out_rel); /* Before calling row compressor relation should be segmented and sorted as configured diff --git a/tsl/test/expected/compression_errors-13.out b/tsl/test/expected/compression_errors-13.out index 364c07b98..06b046f9c 100644 --- a/tsl/test/expected/compression_errors-13.out +++ b/tsl/test/expected/compression_errors-13.out @@ -810,3 +810,16 @@ ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_s ALTER TABLE table_unique_index SET (timescaledb.compress = off); ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_segmentby = 'time,location,device_id'); ALTER TABLE table_unique_index SET (timescaledb.compress = off); +-- try compressing osm chunk +CREATE TABLE osm_table (time timestamptz NOT NULL, device_id text, value float); +SELECT table_name FROM create_hypertable('osm_table', 'time'); + table_name +------------ + osm_table +(1 row) + +ALTER TABLE osm_table SET (timescaledb.compress); +INSERT INTO osm_table VALUES ('2022-11-11 11:11:11', 'foo', 1.0); +UPDATE _timescaledb_catalog.chunk ch SET osm_chunk = true FROM _timescaledb_catalog.hypertable ht WHERE ch.hypertable_id = ht.id AND ht.table_name='osm_table'; +SELECT compress_chunk(show_chunks('osm_table')); +ERROR: compress_chunk not permitted on tiered chunk "_hyper_43_31_chunk" diff --git a/tsl/test/expected/compression_errors-14.out b/tsl/test/expected/compression_errors-14.out index 364c07b98..06b046f9c 100644 --- a/tsl/test/expected/compression_errors-14.out +++ b/tsl/test/expected/compression_errors-14.out @@ -810,3 +810,16 @@ ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_s ALTER TABLE table_unique_index SET (timescaledb.compress = off); ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_segmentby = 'time,location,device_id'); ALTER TABLE table_unique_index SET (timescaledb.compress = off); +-- try compressing osm chunk +CREATE TABLE osm_table (time timestamptz NOT NULL, device_id text, value float); +SELECT table_name FROM create_hypertable('osm_table', 'time'); + table_name +------------ + osm_table +(1 row) + +ALTER TABLE osm_table SET (timescaledb.compress); +INSERT INTO osm_table VALUES ('2022-11-11 11:11:11', 'foo', 1.0); +UPDATE _timescaledb_catalog.chunk ch SET osm_chunk = true FROM _timescaledb_catalog.hypertable ht WHERE ch.hypertable_id = ht.id AND ht.table_name='osm_table'; +SELECT compress_chunk(show_chunks('osm_table')); +ERROR: compress_chunk not permitted on tiered chunk "_hyper_43_31_chunk" diff --git a/tsl/test/expected/compression_errors-15.out b/tsl/test/expected/compression_errors-15.out index 364c07b98..06b046f9c 100644 --- a/tsl/test/expected/compression_errors-15.out +++ b/tsl/test/expected/compression_errors-15.out @@ -810,3 +810,16 @@ ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_s ALTER TABLE table_unique_index SET (timescaledb.compress = off); ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_segmentby = 'time,location,device_id'); ALTER TABLE table_unique_index SET (timescaledb.compress = off); +-- try compressing osm chunk +CREATE TABLE osm_table (time timestamptz NOT NULL, device_id text, value float); +SELECT table_name FROM create_hypertable('osm_table', 'time'); + table_name +------------ + osm_table +(1 row) + +ALTER TABLE osm_table SET (timescaledb.compress); +INSERT INTO osm_table VALUES ('2022-11-11 11:11:11', 'foo', 1.0); +UPDATE _timescaledb_catalog.chunk ch SET osm_chunk = true FROM _timescaledb_catalog.hypertable ht WHERE ch.hypertable_id = ht.id AND ht.table_name='osm_table'; +SELECT compress_chunk(show_chunks('osm_table')); +ERROR: compress_chunk not permitted on tiered chunk "_hyper_43_31_chunk" diff --git a/tsl/test/expected/compression_errors-16.out b/tsl/test/expected/compression_errors-16.out index c15de07dd..afd3dd9a4 100644 --- a/tsl/test/expected/compression_errors-16.out +++ b/tsl/test/expected/compression_errors-16.out @@ -810,3 +810,16 @@ ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_s ALTER TABLE table_unique_index SET (timescaledb.compress = off); ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_segmentby = 'time,location,device_id'); ALTER TABLE table_unique_index SET (timescaledb.compress = off); +-- try compressing osm chunk +CREATE TABLE osm_table (time timestamptz NOT NULL, device_id text, value float); +SELECT table_name FROM create_hypertable('osm_table', 'time'); + table_name +------------ + osm_table +(1 row) + +ALTER TABLE osm_table SET (timescaledb.compress); +INSERT INTO osm_table VALUES ('2022-11-11 11:11:11', 'foo', 1.0); +UPDATE _timescaledb_catalog.chunk ch SET osm_chunk = true FROM _timescaledb_catalog.hypertable ht WHERE ch.hypertable_id = ht.id AND ht.table_name='osm_table'; +SELECT compress_chunk(show_chunks('osm_table')); +ERROR: compress_chunk not permitted on tiered chunk "_hyper_43_31_chunk" diff --git a/tsl/test/sql/compression_errors.sql.in b/tsl/test/sql/compression_errors.sql.in index df7c84047..a81f2b8fd 100644 --- a/tsl/test/sql/compression_errors.sql.in +++ b/tsl/test/sql/compression_errors.sql.in @@ -500,3 +500,14 @@ ALTER TABLE table_unique_index SET (timescaledb.compress = off); ALTER TABLE table_unique_index SET (timescaledb.compress, timescaledb.compress_segmentby = 'time,location,device_id'); ALTER TABLE table_unique_index SET (timescaledb.compress = off); +-- try compressing osm chunk +CREATE TABLE osm_table (time timestamptz NOT NULL, device_id text, value float); +SELECT table_name FROM create_hypertable('osm_table', 'time'); +ALTER TABLE osm_table SET (timescaledb.compress); + +INSERT INTO osm_table VALUES ('2022-11-11 11:11:11', 'foo', 1.0); + +UPDATE _timescaledb_catalog.chunk ch SET osm_chunk = true FROM _timescaledb_catalog.hypertable ht WHERE ch.hypertable_id = ht.id AND ht.table_name='osm_table'; + +SELECT compress_chunk(show_chunks('osm_table')); +