Re: Re: BUG #13685: Archiving while idle every archive_timeout with wal_level hot_standby
От | Andres Freund |
---|---|
Тема | Re: Re: BUG #13685: Archiving while idle every archive_timeout with wal_level hot_standby |
Дата | |
Msg-id | 20160129081330.e5mj65du2cknxsja@alap3.anarazel.de обсуждение исходный текст |
Ответ на | Re: Re: BUG #13685: Archiving while idle every archive_timeout with wal_level hot_standby (Michael Paquier <michael.paquier@gmail.com>) |
Ответы |
Re: Re: BUG #13685: Archiving while idle every
archive_timeout with wal_level hot_standby
|
Список | 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 whileholding all the insertion locks. *RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; computing the next redo rec ptr and thenif (!shutdown && XLogStandbyInfoActive()) LogStandbySnapshot(); before the finalXLogRegisterData((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
В списке pgsql-hackers по дате отправления: