Re: Question sur les restarts points.

Jehan-Guillaume de Rorthais <[email protected]>
Newsgroups gmane.comp.db.postgresql.french
Message-ID <20160216132549.6197e826@firost>
Le Mon, 15 Feb 2016 17:19:28 +0100,
Benoit Lobréau <[email protected]> a écrit :

> J'utilise les fonctionnalités de HotStandby sur PostgreSQL 9.1.
> 
> J'ai constaté en faisant des tests que les restarts_points (sur la standby
> donc) ne semblent pas se produire quand checkpoint_segments est atteint
> mais uniquement quand checkpoint_timeout est atteint. (et qu'il y a eu un
> checkpoint sur la primaire).
> 
> 
> 
> En regardant dans le code, j'ai trouvé ça dans bgwrite.c:
> 
> 
> 
>                 /*
> 
>                 * Check progress against WAL segments written and
> checkpoint_segments.
> 
>                 *
> 
>                 * We compare the current WAL insert location against the
> location
> 
>                 * computed before calling CreateCheckPoint. The code in
> XLogInsert that
> 
>                 * actually triggers a checkpoint when checkpoint_segments
> is exceeded
> 
>                 * compares against RedoRecptr, so this is not completely
> accurate.
> 
>                 * However, it's good enough for our purposes, we're only
> calculating an
> 
>                 * estimate anyway.
> 
>                 */
> 
>                 if (!RecoveryInProgress())  ===> cas d'une restauration ou
> d'une standby ?
> 
>                 {
> 
>                                recptr = GetInsertRecPtr();
> 
>                                elapsed_xlogs =
> 
>                                                (((double) (int32)
> (recptr.xlogid - ckpt_start_recptr.xlogid)) * XLogSegsPerFile +
> 
>                                                ((double) recptr.xrecoff -
> (double) ckpt_start_recptr.xrecoff) / XLogSegSize) /
> 
>                                                CheckPointSegments;
> 
> 
> 
>                                if (progress < elapsed_xlogs)  ===> progress
> en volume
> 
>                                {
> 
>                                                ckpt_cached_elapsed =
> elapsed_xlogs;
> 
>                                                return false;
> 
>                                }
> 
>                 }
> 
> 
> 
>                 /*
> 
>                 * Check progress against time elapsed and
> checkpoint_timeout.
> 
>                 */
> 
>                 gettimeofday(&now, NULL);
> 
>                 elapsed_time = ((double) ((pg_time_t) now.tv_sec -
> ckpt_start_time) +
> 
> 
> now.tv_usec / 1000000.0) / CheckPointTimeout;
> 
> 
> 
>                 if (progress < elapsed_time)  ===> progress en temps
> 
>                 {
> 
>                                ckpt_cached_elapsed = elapsed_time;
> 
>                                return false;
> 
>                 }
> 
> 
> 
>                 /* It looks like we're on schedule. */
> 
>                 return true;

Merci pour avoir creusé dans le code :)

De ce que j'en lis, effectivement les restartpoints ne sont effectués que sur
timeout. Le bloc "if (!RecoveryInProgress())" ne concerne qu'une instance
primaire.

> J'ai également trouvé un post de Simon Riggs [1] qui dit:
> "checkpoint_segments is ignored on standby. "
> 
> ça semble confirmer mes observations mais la doc dit [2]: "In standby mode,
> a restartpoint is also triggered if checkpoint_segments log segments have
> been replayed since last restartpoint and at least one checkpoint record
> has been replayed."
> 
> Du coup, je ne comprends pas trop. S'agit il d'une erreur dans la doc ?

La meilleure chose à faire est d'en discuter sur pgsql-hackers à mon avis.


++


--
Envoi via la liste pgsql-fr-generale ([email protected])
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.