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])