timescaledb/sql/meta/chunk_triggers.sql
Matvey Arye 42ee7c8586 starting refactor of clustering and naming logic
This fix allows more flexible placement of tables on a node; better
and more flexible logic for remote placement of chunks on nodes.
2016-11-22 16:41:27 -05:00

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;