pgsql: Track unowned relations in doubly-linked list

From: Tomas Vondra <tomas(dot)vondra(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Track unowned relations in doubly-linked list
Date: 2019-03-27 02:27:28
Message-ID: E1h8yHo-00012l-GI@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Track unowned relations in doubly-linked list

Relations dropped in a single transaction are tracked in a list of
unowned relations. With large number of dropped relations this resulted
in poor performance at the end of a transaction, when the relations are
removed from the singly linked list one by one.

Commit b4166911 attempted to address this issue (particularly when it
happens during recovery) by removing the relations in a reverse order,
resulting in O(1) lookups in the list of unowned relations. This did
not work reliably, though, and it was possible to trigger the O(N^2)
behavior in various ways.

Instead of trying to remove the relations in a specific order with
respect to the linked list, which seems rather fragile, switch to a
regular doubly linked. That allows us to remove relations cheaply no
matter where in the list they are.

As b4166911 was a bugfix, backpatched to all supported versions, do the
same thing here.

Reviewed-by: Alvaro Herrera
Discussion: https://www.postgresql.org/message-id/flat/80c27103-99e4-1d0c-642c-d9f3b94aaa0a%402ndquadrant.com
Backpatch-through: 9.4

Branch
------
REL9_5_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/261aa218c9a0fcd93f6a27ca014c9d1ee278fa8b

Modified Files
--------------
src/backend/storage/smgr/md.c | 8 +----
src/backend/storage/smgr/smgr.c | 74 ++++++++++-------------------------------
src/include/storage/smgr.h | 3 +-
3 files changed, 20 insertions(+), 65 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tomas Vondra 2019-03-27 02:28:51 pgsql: Track unowned relations in doubly-linked list
Previous Message Tomas Vondra 2019-03-27 02:26:16 pgsql: Track unowned relations in doubly-linked list