From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | Michael Paquier <michael(dot)paquier(at)gmail(dot)com> |
Cc: | Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Jeff Janes <jeff(dot)janes(at)gmail(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Re: BUG #13685: Archiving while idle every archive_timeout with wal_level hot_standby |
Date: | 2016-01-29 08:13:30 |
Message-ID: | 20160129081330.e5mj65du2cknxsja@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs pgsql-hackers |
On 2016-01-28 16:40:13 +0900, Michael Paquier wrote:
> OK, so as a first step and after thinking about the whole for a while,
> I have finished with the patch attached. This patch is aimed at
> avoiding unnecessary checkpoints on idle systems when wal_level >=
> hot_standby by centralizing the check to look at if there has some WAL
> activity since the last checkpoint.
That's not what I suggested.
> /*
> + * XLOGHasActivity -- Check if XLOG had some significant activity or
> + * if it is idle lately. This is primarily used to check if there has
> + * been some WAL activity since the last checkpoint that occurred on
> + * system to control the generaton of XLOG record related to standbys.
> + */
> +bool
> +XLOGHasActivity(void)
> +{
> + XLogCtlInsert *Insert = &XLogCtl->Insert;
> + XLogRecPtr redo_lsn = ControlFile->checkPointCopy.redo;
> + uint64 prev_bytepos;
> +
> + /* Check if any activity has happened since last checkpoint */
> + SpinLockAcquire(&Insert->insertpos_lck);
> + prev_bytepos = Insert->PrevBytePos;
> + SpinLockRelease(&Insert->insertpos_lck);
> +
> + return XLogBytePosToRecPtr(prev_bytepos) == redo_lsn;
> +}
>
How should this actually should work reliably, given we *want* to have
included a standby snapshot after the last checkpoint?
In CreateCheckPoint() we have
/*
* Here we update the shared RedoRecPtr for future XLogInsert calls; this
* must be done while holding all the insertion locks.
*
RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo;
computing the next redo rec ptr and then
if (!shutdown && XLogStandbyInfoActive())
LogStandbySnapshot();
before the final
XLogRegisterData((char *) (&checkPoint), sizeof(checkPoint));
recptr = XLogInsert(RM_XLOG_ID,
shutdown ? XLOG_CHECKPOINT_SHUTDOWN :
XLOG_CHECKPOINT_ONLINE);
so the above condition doesn't really something we want to rely on. Am I
missing what you're trying to do?
Greetings,
Andres Freund
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2016-01-29 08:25:54 | Re: BUG #13899: \det ignores visibility; patch attached |
Previous Message | Michael Paquier | 2016-01-29 08:06:19 | Re: Long text values destroys logical replication slots |
From | Date | Subject | |
---|---|---|---|
Next Message | Etsuro Fujita | 2016-01-29 08:35:12 | Re: postgres_fdw join pushdown (was Re: Custom/Foreign-Join-APIs) |
Previous Message | Michael Paquier | 2016-01-29 07:00:34 | Re: insufficient qualification of some objects in dump files |