partition_magic
partition_magic copied to clipboard
fixed race condition on new partition
Исправление гонки при создании новой партиции.
Как проявлялась ошибка:
- Создаем таблицу и готовим ее партицировать:
CREATE TABLE news (
id bigserial,
category_id INT,
title TEXT,
data TEXT
);
SELECT public._2gis_partition_magic('news', 'category_id')
- Открываем первую транзакцию:
BEGIN
insert into news(category_id) values(1);
- Открываем вторую транзакцию:
BEGIN
insert into news(category_id) values(1);
- Коммитим первую транзакцию:
COMMIT
- При попытке закоммитать вторую транзакцию:
ERROR: relation "news_1" already exists
КОНТЕКСТ: SQL statement "CREATE TABLE news_1 (CONSTRAINT news_1_category_id_check CHECK (category_id = 1)) INHERITS (news);"
PL/pgSQL function _2gis_partition_magic(text,text,integer,text,text,boolean) line 77 at EXECUTE
PL/pgSQL function _2gis_partition_magic_before_insert_trigger() line 21 at assignment
SQL statement "insert into news(category_id) values(1)"
В зависимости от workload-а lock можно вешать по хешу таблицы куда идет вставка, а не использовать один хэш для всех спартицированных через утилиту таблиц.