Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock

From: Tatsuo Ishii <ishii(at)sraoss(dot)co(dot)jp>
To: alvherre(at)alvh(dot)no-ip(dot)org
Cc: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock
Date: 2019-06-13 22:32:29
Message-ID: 20190614.073229.1432207886733966773.t-ishii@sraoss.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

I am a little bit confused. Here T1 and X are the same transaction?

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp

> Avoid spurious deadlocks when upgrading a tuple lock
>
> When two (or more) transactions are waiting for transaction T1 to release a
> tuple-level lock, and transaction T1 upgrades its lock to a higher level, a
> spurious deadlock can be reported among the waiting transactions when T1
> finishes. The simplest example case seems to be:
>
> T1: select id from job where name = 'a' for key share;
> Y: select id from job where name = 'a' for update; -- starts waiting for X
> Z: select id from job where name = 'a' for key share;
> T1: update job set name = 'b' where id = 1;
> Z: update job set name = 'c' where id = 1; -- starts waiting for X
> T1: rollback;
>
> At this point, transaction Y is rolled back on account of a deadlock: Y
> holds the heavyweight tuple lock and is waiting for the Xmax to be released,
> while Z holds part of the multixact and tries to acquire the heavyweight
> lock (per protocol) and goes to sleep; once X releases its part of the
> multixact, Z is awakened only to be put back to sleep on the heavyweight
> lock that Y is holding while sleeping. Kaboom.
>
> This can be avoided by having Z skip the heavyweight lock acquisition. As
> far as I can see, the biggest downside is that if there are multiple Z
> transactions, the order in which they resume after X finishes is not
> guaranteed.
>
> Backpatch to 9.6. The patch applies cleanly on 9.5, but the new tests don't
> work there (because isolationtester is not smart enough), so I'm not going
> to risk it.
>
> Author: Oleksii Kliukin
> Discussion: https://postgr.es/m/B9C9D7CD-EB94-4635-91B6-E558ACEC0EC3@hintbits.com
>
> Branch
> ------
> REL_11_STABLE
>
> Details
> -------
> https://git.postgresql.org/pg/commitdiff/85600b7b5da42c5166eb1188c173beb3cc356178
>
> Modified Files
> --------------
> src/backend/access/heap/README.tuplock | 10 ++
> src/backend/access/heap/heapam.c | 84 +++++++++---
> .../expected/tuplelock-upgrade-no-deadlock.out | 150 +++++++++++++++++++++
> src/test/isolation/isolation_schedule | 1 +
> .../specs/tuplelock-upgrade-no-deadlock.spec | 57 ++++++++
> 5 files changed, 281 insertions(+), 21 deletions(-)
>

In response to

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2019-06-14 00:10:41 pgsql: Use OpenSSL-specific ifdefs in sha2.h
Previous Message Tom Lane 2019-06-13 22:10:29 pgsql: Avoid combinatorial explosion in add_child_rel_equivalences().