From: Миша Тюрин <tmihail@bk.ru>
To: pgsql-hackers@postgresql.org <pgsql-hackers@postgresql.org>
Cc: Sergey Burladyan <eshkinkot@gmail.com>
Subject: freeze cannot be finished
Date: Sun, 17 Nov 2013 00:05:55 +0400
Message-ID: <1384632355.250156225@f64.i.mail.ru> (raw)
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-hackers>
Hello!
Could anyone review patch suggested by Jeff Janes ?
Initial thread http://www.postgresql.org/message-id/flat/1384356585.995240612@f50.i.mail.ru#1384356585.995240612@f5...
Thanks in advance!
>
> On Wed, Nov 13, 2013 at 3:53 PM, Sergey Burladyan < eshkinkot@gmail.com > wrote:
> >Jeff Janes < jeff.janes@gmail.com > writes:
> >
> >If I not mistaken, looks like lazy_scan_heap() called from lazy_vacuum_rel()
> >(see [1]) skip pages, even if it run with scan_all == true, lazy_scan_heap()
> >does not increment scanned_pages if lazy_check_needs_freeze() return false, so
> >if this occurred at wraparound vacuum it cannot update pg_class, because
> >pg_class updated via this code:
> >
> > new_frozen_xid = FreezeLimit;
> > if (vacrelstats->scanned_pages < vacrelstats->rel_pages)
> > new_frozen_xid = InvalidTransactionId;
> >
> > vac_update_relstats(onerel,
> > new_rel_pages,
> > new_rel_tuples,
> > new_rel_allvisible,
> > vacrelstats->hasindex,
> > new_frozen_xid);
> >
> >so i think in our prevent wraparound vacuum vacrelstats->scanned_pages always
> >less than vacrelstats->rel_pages and pg_class relfrozenxid never updated.
>
> Yeah, I think that that is a bug. If the clean-up lock is unavailable but the page is inspected without it and found not to need freezing, then the page needs to be counted as scanned, but is not so counted.
>
> commit bbb6e559c4ea0fb4c346beda76736451dc24eb4e
> Date: Mon Nov 7 21:39:40 2011 -0500
>
> But this was introduced in 9.2.0, so unless the OP didn't upgrade to 9.2 until recently, I don't know why it just started happening.
>
> It looks like a simple fix (to HEAD attached), but I don't know how to test it.
>
> Also, it seem like it might be worth issuing a warning if scan_all is true but all was not scanned.
>
> Cheers,
>
> Jeff
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general>
--
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackersAttachments:fix_freeze.patch (application/x-patch, 478B) downloaddiff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.cnew file mode 100644index e1d6d1c..6778c7d
*** a/src/backend/commands/vacuumlazy.c
--- b/src/backend/commands/vacuumlazy.c
*************** lazy_scan_heap(Relation onerel, LVRelSta
*** 602,607 ****
--- 602,608 ----
if (!lazy_check_needs_freeze(buf))
{
UnlockReleaseBuffer(buf);
+ vacrelstats->scanned_pages++;
continue;
}
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: tmihail@bk.ru, eshkinkot@gmail.com
Subject: Re: freeze cannot be finished
In-Reply-To: <1384632355.250156225@f64.i.mail.ru>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox