mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 05:31:41 +08:00
This fix allows more flexible placement of tables on a node; better and more flexible logic for remote placement of chunks on nodes.
69 lines
2.1 KiB
PL/PgSQL
69 lines
2.1 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION _sysinternal.on_create_chunk()
|
|
RETURNS TRIGGER LANGUAGE PLPGSQL AS
|
|
$BODY$
|
|
DECLARE
|
|
field_row field;
|
|
schema_name NAME;
|
|
BEGIN
|
|
IF TG_OP = 'UPDATE' THEN
|
|
IF (
|
|
(OLD.start_time IS NULL AND new.start_time IS NOT NULL)
|
|
OR
|
|
(OLD.end_time IS NULL AND new.end_time IS NOT NULL)
|
|
)
|
|
AND (
|
|
OLD.id = NEW.id AND
|
|
OLD.partition_id = NEW.partition_id
|
|
) THEN
|
|
NULL;
|
|
ELSE
|
|
RAISE EXCEPTION 'This type of update not allowed on % table', TG_TABLE_NAME
|
|
USING ERRCODE = 'IO101';
|
|
END IF;
|
|
ELSIF TG_OP <> 'INSERT' THEN
|
|
RAISE EXCEPTION 'Only inserts and updates supported on % table', TG_TABLE_NAME
|
|
USING ERRCODE = 'IO101';
|
|
END IF;
|
|
|
|
--sync data on insert
|
|
IF TG_OP = 'INSERT' THEN
|
|
FOR schema_name IN
|
|
SELECT n.schema_name
|
|
FROM node AS n
|
|
LOOP
|
|
EXECUTE format(
|
|
$$
|
|
INSERT INTO %I.%I SELECT $1.*
|
|
$$,
|
|
schema_name,
|
|
TG_TABLE_NAME
|
|
)
|
|
USING NEW;
|
|
END LOOP;
|
|
|
|
--do not sync data on update. synced by close_chunk logic.
|
|
|
|
--TODO: random node picking broken (should make sure replicas are on different nodes). also stickiness.
|
|
INSERT INTO chunk_replica_node(chunk_id,partition_replica_id, database_name, schema_name, table_name)
|
|
SELECT NEW.id,
|
|
pr.id,
|
|
(SELECT database_name FROM node ORDER BY random() LIMIT 1),
|
|
pr.schema_name,
|
|
format('%s_%s_%s_%s_data', h.associated_table_prefix, pr.id, pr.replica_id, NEW.id)
|
|
FROM partition_replica pr
|
|
INNER JOIN hypertable h ON (h.name = pr.hypertable_name)
|
|
WHERE pr.partition_id = NEW.partition_id;
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END
|
|
$BODY$;
|
|
|
|
BEGIN;
|
|
DROP TRIGGER IF EXISTS trigger_on_create_chunk
|
|
ON chunk;
|
|
CREATE TRIGGER trigger_on_create_chunk AFTER INSERT OR UPDATE OR DELETE ON chunk
|
|
FOR EACH ROW EXECUTE PROCEDURE _sysinternal.on_create_chunk();
|
|
COMMIT;
|
|
|