partition_magic icon indicating copy to clipboard operation
partition_magic copied to clipboard

fixed race condition on new partition

Open chobostar opened this issue 7 years ago • 1 comments

Исправление гонки при создании новой партиции.

Как проявлялась ошибка:

  1. Создаем таблицу и готовим ее партицировать:
CREATE TABLE news (
	  id bigserial,
	  category_id INT,
	  title TEXT,
	  data TEXT
);

SELECT public._2gis_partition_magic('news', 'category_id')
  1. Открываем первую транзакцию:
BEGIN
insert into news(category_id) values(1);
  1. Открываем вторую транзакцию:
BEGIN
insert into news(category_id) values(1);
  1. Коммитим первую транзакцию:
COMMIT
  1. При попытке закоммитать вторую транзакцию:
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)"

chobostar avatar Apr 09 '18 15:04 chobostar

В зависимости от workload-а lock можно вешать по хешу таблицы куда идет вставка, а не использовать один хэш для всех спартицированных через утилиту таблиц.

chobostar avatar Apr 09 '18 16:04 chobostar