Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock - Mailing list pgsql-committers

From Tatsuo Ishii
Subject Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock
Date
Msg-id 20190614.073229.1432207886733966773.t-ishii@sraoss.co.jp
Whole thread Raw
In response to pgsql: Avoid spurious deadlocks when upgrading a tuple lock  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
Responses Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock  (Alvaro Herrera <alvherre@2ndquadrant.com>)
List 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(-)
> 



pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Avoid combinatorial explosion in add_child_rel_equivalences().
Next
From: Michael Paquier
Date:
Subject: pgsql: Use OpenSSL-specific ifdefs in sha2.h