inefficient loop in StandbyReleaseLockList()

From: "Bossart, Nathan" <bossartn(at)amazon(dot)com>
To: "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: inefficient loop in StandbyReleaseLockList()
Date: 2021-10-28 03:37:29
Message-ID: CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi hackers,

I've seen a few cases now for v13 where the startup process on a
standby appears to be stuck on StandbyReleaseLockList(). It looks
like most of the time is spent on list_delete_first(). I believe this
is related to the recent list rewrite (1cff1b9), which has the
following note in the commit message:

* Inserting or deleting a list element now takes time proportional to
the distance to the end of the list, due to moving the array elements.
(However, it typically *doesn't* require palloc or pfree, so except in
long lists it's probably still faster than before.) Notably, lcons()
used to be about the same cost as lappend(), but that's no longer true
if the list is long. Code that uses lcons() and list_delete_first()
to maintain a stack might usefully be rewritten to push and pop at the
end of the list rather than the beginning.

The current form of StandbyReleaseLockList() is something like this:

while (mylist != NIL)
{
int i = linitial_int(mylist);
...
mylist = list_delete_first(mylist);
}

For a long enough list, this is wildly inefficient. The following
form is much faster for longer lists:

foreach(lc, mylist)
{
int i = lfirst_int(lc);
...
}
list_free(mylist);

I wrote up a simple test function for each form. For a list of
500,000 integers, the first form took about a minute, while the second
form took about 6 milliseconds.

I've attached a patch that converts StandbyReleaseLockList() to the
second loop form.

Nathan

Attachment Content-Type Size
improve_loop.patch application/octet-stream 817 bytes

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amul Sul 2021-10-28 03:55:43 Re: TAP test for recovery_end_command
Previous Message Amit Kapila 2021-10-28 02:45:24 Re: pgsql: Document XLOG_INCLUDE_XID a little better