pgsql: Improve performance of replay of AccessExclusiveLocks

From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Improve performance of replay of AccessExclusiveLocks
Date: 2017-03-22 13:11:03
Message-ID: E1cqg2Z-0002es-HM@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Improve performance of replay of AccessExclusiveLocks

A hot standby replica keeps a list of Access Exclusive locks for a top
level transaction. These locks are released when the top level transaction
ends. Searching of this list is O(N^2), and each transaction had to pay the
price of searching this list for locks, even if it didn't take any AE
locks itself.

This patch optimizes this case by having the master server track which
transactions took AE locks, and passes that along to the standby server in
the commit/abort record. This allows the standby to only try to release
locks for transactions which actually took any, avoiding the majority of
the performance issue.

Refactor MyXactAccessedTempRel into MyXactFlags to allow minimal additional
cruft with this.

Analysis and initial patch by David Rowley
Author: David Rowley and Simon Riggs

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/9b013dc238cefa2860b384a3fa016ad1ceb062e4

Modified Files
--------------
src/backend/access/heap/heapam.c | 4 ++--
src/backend/access/transam/twophase.c | 12 ++++++++++--
src/backend/access/transam/xact.c | 33 +++++++++++++++++++++------------
src/backend/commands/tablecmds.c | 2 +-
src/backend/storage/ipc/standby.c | 1 +
src/include/access/xact.h | 27 ++++++++++++++++++++++++---
6 files changed, 59 insertions(+), 20 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Alvaro Herrera 2017-03-22 14:13:05 Re: Re: [COMMITTERS] pgsql: Fix and simplify check for whether we're running as Windows serv
Previous Message Heikki Linnakangas 2017-03-22 10:48:48 Re: [COMMITTERS] pgsql: Fix and simplify check for whether we're running as Windows serv