Re: [pgsql-ru-general] Re: [pgsql-ru-general] deadlock при drop index concurrently

Lists: pgsql-ru-general
From: Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: deadlock при drop index concurrently
Date: 2017-03-23 09:45:48
Message-ID: CAHGBwKi2zPt1=6gsYaFArYXnBDZ4cobjg_OLtZu4h4f=aTix5A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Вот что видим в логах:

Mar 23 15:45:07 mdb postgres[26481]: [177-1]
user=pgsql,db=geo,client=10.77.255.13 ERROR: deadlock detected
Mar 23 15:45:07 mdb postgres[26481]: [177-2]
user=pgsql,db=geo,client=10.77.255.13 DETAIL: Process 26481 waits for
ShareLock on virtual transaction 8/29343079; blocked by process 15087.
Mar 23 15:45:07 mdb postgres[26481]: [177-3] Process 15087 waits for
AccessExclusiveLock on relation 24694 of database 17701; blocked by process
26481.
Mar 23 15:45:07 mdb postgres[26481]: [177-4] Process 26481: DROP
INDEX CONCURRENTLY IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
Mar 23 15:45:07 mdb postgres[26481]: [177-5]
Mar 23 15:45:07 mdb postgres[26481]: [177-6] Process 15087: LOCK
TABLE geo_11 IN ACCESS EXCLUSIVE MODE
Mar 23 15:45:07 mdb postgres[26481]: [177-7]
user=pgsql,db=geo,client=10.77.255.13 HINT: See server log for query
details.
Mar 23 15:45:07 mdb postgres[26481]: [177-8]
user=pgsql,db=geo,client=10.77.255.13 STATEMENT: DROP INDEX CONCURRENTLY
IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
Mar 23 15:45:07 mdb postgres[26481]: [177-9]

кто-нибудь может объяснить откуда мог взяться при указании конкурентности
дедлок?
версия postgres 9.4.4
--
С уважением,
Вавржин Игорь


From: Dmitry Igrishin <dmitigr(at)gmail(dot)com>
To: Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] deadlock при drop index concurrently
Date: 2017-03-23 11:41:57
Message-ID: CAAfz9KMkxs4S6qtVaaQYbTvZ1gxBJrfaE8+p5WGx7-DYkenw7g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

2017-03-23 12:45 GMT+03:00 Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>:

> Вот что видим в логах:
>
> Mar 23 15:45:07 mdb postgres[26481]: [177-1] user=pgsql,db=geo,client=10.77.255.13
> ERROR: deadlock detected
> Mar 23 15:45:07 mdb postgres[26481]: [177-2] user=pgsql,db=geo,client=10.77.255.13
> DETAIL: Process 26481 waits for ShareLock on virtual transaction
> 8/29343079; blocked by process 15087.
> Mar 23 15:45:07 mdb postgres[26481]: [177-3] Process 15087 waits
> for AccessExclusiveLock on relation 24694 of database 17701; blocked by
> process 26481.
> Mar 23 15:45:07 mdb postgres[26481]: [177-4] Process 26481: DROP
> INDEX CONCURRENTLY IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
> Mar 23 15:45:07 mdb postgres[26481]: [177-5]
> Mar 23 15:45:07 mdb postgres[26481]: [177-6] Process 15087: LOCK
> TABLE geo_11 IN ACCESS EXCLUSIVE MODE
> Mar 23 15:45:07 mdb postgres[26481]: [177-7] user=pgsql,db=geo,client=10.77.255.13
> HINT: See server log for query details.
> Mar 23 15:45:07 mdb postgres[26481]: [177-8] user=pgsql,db=geo,client=10.77.255.13
> STATEMENT: DROP INDEX CONCURRENTLY IF EXISTS geo_11_2gis_get_route_
> platform_ids_from_json
> Mar 23 15:45:07 mdb postgres[26481]: [177-9]
>
> кто-нибудь может объяснить откуда мог взяться при указании конкурентности
> дедлок?
> версия postgres 9.4.4
>
Судя по тому, что написано, процесс 15087 получил некий уровень блокировки
(скажем, ShareLock), потом запустил процесс 26481 для конкурентного
создания индекса (которому требуется ShareLock), а потом затребовал
блокировку уровня AccessExclusiveLock, которую получить не может, так как
процесс 26481 ждёт получения блокировки уровня ShareLock.


From: Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>
To: Dmitry Igrishin <dmitigr(at)gmail(dot)com>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] deadlock при drop index concurrently
Date: 2017-03-23 13:09:40
Message-ID: CAHGBwKgxjTARYx=CVCJOyN2rfDkBVZBKCbdBCe=8-X4Mcrd+Sw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Лог я прочитал :) вопрос в другом: почему конкурентное удаление индекса
просто не подаждало, пока локи снимутся, как это описано в документации!?
Баг? Или я что-то не понимаю?

23 марта 2017 г. 18:41 пользователь "Dmitry Igrishin" <dmitigr(at)gmail(dot)com>
написал:

>
>
> 2017-03-23 12:45 GMT+03:00 Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>:
>
>> Вот что видим в логах:
>>
>> Mar 23 15:45:07 mdb postgres[26481]: [177-1]
>> user=pgsql,db=geo,client=10.77.255.13 ERROR: deadlock detected
>> Mar 23 15:45:07 mdb postgres[26481]: [177-2]
>> user=pgsql,db=geo,client=10.77.255.13 DETAIL: Process 26481 waits for
>> ShareLock on virtual transaction 8/29343079; blocked by process 15087.
>> Mar 23 15:45:07 mdb postgres[26481]: [177-3] Process 15087 waits
>> for AccessExclusiveLock on relation 24694 of database 17701; blocked by
>> process 26481.
>> Mar 23 15:45:07 mdb postgres[26481]: [177-4] Process 26481: DROP
>> INDEX CONCURRENTLY IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
>> Mar 23 15:45:07 mdb postgres[26481]: [177-5]
>> Mar 23 15:45:07 mdb postgres[26481]: [177-6] Process 15087: LOCK
>> TABLE geo_11 IN ACCESS EXCLUSIVE MODE
>> Mar 23 15:45:07 mdb postgres[26481]: [177-7]
>> user=pgsql,db=geo,client=10.77.255.13 HINT: See server log for query
>> details.
>> Mar 23 15:45:07 mdb postgres[26481]: [177-8]
>> user=pgsql,db=geo,client=10.77.255.13 STATEMENT: DROP INDEX
>> CONCURRENTLY IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
>> Mar 23 15:45:07 mdb postgres[26481]: [177-9]
>>
>> кто-нибудь может объяснить откуда мог взяться при указании конкурентности
>> дедлок?
>> версия postgres 9.4.4
>>
> Судя по тому, что написано, процесс 15087 получил некий уровень блокировки
> (скажем, ShareLock), потом запустил процесс 26481 для конкурентного
> создания индекса (которому требуется ShareLock), а потом затребовал
> блокировку уровня AccessExclusiveLock, которую получить не может, так как
> процесс 26481 ждёт получения блокировки уровня ShareLock.
>


From: Dmitry Igrishin <dmitigr(at)gmail(dot)com>
To: Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] deadlock при drop index concurrently
Date: 2017-03-23 13:28:21
Message-ID: CAAfz9KOd_gs+jPc9gFsjbc=iyE3CAiru9x0qsho4e2=i5=YfaA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg사설 토토 사이트SQL

23 марта 2017 г., 16:09 пользователь Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>
написал:

> Лог я прочитал :) вопрос в другом: почему конкурентное удаление индекса
> просто не подаждало, пока локи снимутся, как это описано в документации!?
> Баг? Или я что-то не понимаю?
>
"так как процесс 26481 *ждёт* получения блокировки уровня ShareLock.".
Т.е. DROP INDEX CONCURRENTLY ждёт, как и написано. Только он не может
дождаться потому, что процесс 15087 требует эксклюзивного доступа *после* того,
как 26481 встал в очередь на блокировку. А вот почему так сказать сложно,
не видя прикладного кода.


From: Oleksii Kliukin <alexk(at)hintbits(dot)com>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] deadlock при drop index concurrently
Date: 2017-03-24 11:27:07
Message-ID: 1490354827.2909511.922069000.70D450ED@webmail.messagingengine.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

On Thu, Mar 23, 2017, at 02:09 PM, Вавржин Игорь wrote:

> Лог я прочитал :) вопрос в другом: почему конкурентное удаление
> индекса просто не подаждало, пока локи снимутся, как это описано в
> документации!? Баг? Или я что-то не понимаю?

Возможно, но это также должно произойти, если LOCK TABLE был в
транзакции, которая до этого обращалась к той же таблице, и началась
перед тем, как стал выполняться DROP INDEX CONCURRENTLY;

Пример:

Допустим есть таблица CREATE TABLE foobar(id INTEGER) и на ней (поле id)
создан индекс CREATE INDEX ON foobar(id);

T TX1 TX2

1 BEGIN

2 SELECT * FROM foobar;

3 DROP INDEX
CONCURRENTLY foobar_id_idx
4 LOCK TABLE foobar;

ERROR: 40P01: deadlock detected

DETAIL: Process 17989 waits for AccessExclusiveLock on relation 24662 of database 16385; blocked by process 17796.
Process 17796 waits for ShareLock on virtual transaction 3/2; blocked by
process 17989.

В T=3 DROP INDEX concurrently будет ждать окончания TX1, чтобы
убедиться, что все работающие транзакции завершились (в обычном случае
DROP INDEX без CONCURRENTLY для этого эксклюзивно блокируется таблица).
При этом та транзакция, которой он ждет, попыталась взять
AccessExclusiveLock, который конфликтует со всеми остальными
блокировками, в т.ч. и с ShareUpdateExclusiveLock у DROP INDEX
CONCURRENTLY.

Вообще делать LOCK TABLE не вначале транзакции - это провоцировать
подобные дедлоки.

>

> 23 марта 2017 г. 18:41 пользователь "Dmitry Igrishin"
> <dmitigr(at)gmail(dot)com> написал:
>>

>>

>> 2017-03-23 12:45 GMT+03:00 Вавржин Игорь <igor(dot)vavrjin(at)gmail(dot)com>:

>>> Вот что видим в логах:

>>>

>>> Mar 23 15:45:07 mdb postgres[26481]: [177-1]
>>> user=pgsql,db=geo,client=10.77.255.13 ERROR: deadlock detected
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-2]
>>> user=pgsql,db=geo,client=10.77.255.13 DETAIL: Process 26481 waits
>>> for ShareLock on virtual transaction 8/29343079; blocked by process
>>> 15087.
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-3] Process 15087
>>> waits for AccessExclusiveLock on relation 24694 of database 17701;
>>> blocked by process 26481.
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-4] Process 26481:
>>> DROP INDEX CONCURRENTLY IF EXISTS
>>> geo_11_2gis_get_route_platform_ids_from_json
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-5]

>>> Mar 23 15:45:07 mdb postgres[26481]: [177-6] Process 15087:
>>> LOCK TABLE geo_11 IN ACCESS EXCLUSIVE MODE
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-7]
>>> user=pgsql,db=geo,client=10.77.255.13 HINT: See server log for
>>> query details.
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-8]
>>> user=pgsql,db=geo,client=10.77.255.13 STATEMENT: DROP INDEX
>>> CONCURRENTLY IF EXISTS geo_11_2gis_get_route_platform_ids_from_json
>>> Mar 23 15:45:07 mdb postgres[26481]: [177-9]

>>>

>>> кто-нибудь может объяснить откуда мог взяться при указании
>>> конкурентности дедлок?
>>> версия postgres 9.4.4

>> Судя по тому, что написано, процесс 15087 получил некий уровень
>> блокировки (скажем, ShareLock), потом запустил процесс 26481 для
>> конкурентного создания индекса (которому требуется ShareLock), а
>> потом затребовал блокировку уровня AccessExclusiveLock, которую
>> получить не может, так как процесс 26481 ждёт получения блокировки
>> уровня ShareLock.

Alex