| From: | Heikki Linnakangas <hlinnakangas(at)vmware(dot)com> |
|---|---|
| To: | Andres Freund <andres(at)2ndquadrant(dot)com> |
| Cc: | PostgreSQL-development <pgsql-hackers(at)postgreSQL(dot)org> |
| Subject: | Re: Heap truncation without AccessExclusiveLock (9.4) |
| Date: | 2013-05-17 07:45:26 |
| Message-ID: | 5195E016.8000000@vmware.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On 16.05.2013 04:15, Andres Freund wrote:
> On 2013-05-15 18:35:35 +0300, Heikki Linnakangas wrote:
>> Truncating a heap at the end of vacuum, to release unused space back to
>> the OS, currently requires taking an AccessExclusiveLock. Although it's only
>> held for a short duration, it can be enough to cause a hiccup in query
>> processing while it's held. Also, if there is a continuous stream of queries
>> on the table, autovacuum never succeeds in acquiring the lock, and thus the
>> table never gets truncated.
>>
>> I'd like to eliminate the need for AccessExclusiveLock while truncating.
>
> Couldn't we "just" take the extension lock and then walk backwards from
> the rechecked end of relation ConditionalLockBufferForCleanup() the
> buffers?
> For every such locked page we check whether its still empty. If we find
> a page that we couldn't lock, isn't empty or we already locked a
> sufficient number of pages we truncate.
You need an AccessExclusiveLock on the relation to make sure that after
you have checked that pages 10-15 are empty, and truncated them away, a
backend doesn't come along a few seconds later and try to read page 10
again. There might be an old sequential scan in progress, for example,
that thinks that the pages are still there.
- Heikki
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Nikolay Samokhvalov | 2013-05-17 09:29:37 | Full (special) logs for specified users/hosts/etc |
| Previous Message | Heikki Linnakangas | 2013-05-17 07:38:17 | Re: Heap truncation without AccessExclusiveLock (9.4) |