Re: Question sur les restarts points.

From: Jehan-Guillaume de Rorthais <ioguix(at)free(dot)fr>
To: Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Question sur les restarts points.
Date: 2016-02-16 12:25:49
Message-ID: 20160216132549.6197e826@firost
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le Mon, 15 Feb 2016 17:19:28 +0100,
Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> 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 (pgsql-fr-generale(at)postgresql(dot)org)

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Benoit Lobréau 2016-02-16 16:32:06 Re: Question sur les restarts points.
Previous Message Pierre Chevalier Géologue 2016-02-16 09:44:26 Re: Présentation de PostgreSQL 9.5 le 23 février à Toulouse