pg_ctl¶
pg_ctl
accepte trois modes d’arrêt :
smart
: pour vider les buffers sur disque, attendre la fin de l’exécution des clients (pgAdmin,pg_dump
,psql
,libpq
, etc…) :fast
: on vide les buffers sur disque et on n’attend pas les clients ;immediate
: c’est un peu le mode fatal, on quitte en toute hâte une situation très ennuyante.
La fonction main()
de pg_ctl
va initialiser une variable importante suivant le mode d’arrêt : sig
(à savoir le signal à envoyer au processus père) :
smart
:sig = SIGTERM
fast
:sig = SIGINT
immediate
:sig = SIGQUIT
Dit autrement, un kill -SIGINT $(head -1 $PGDATA/postmaster.pid)
est équivalent à un pg_ctl --mode=force stop
.
pg_ctl
va ensuite appeler la fonction do_stop()
. Cette dernière envoie le signal sig
au processus père des postmaster,
affiche waiting for server to shutdown
, attend au pire 60 secondes
(défaut si --timeout
n’est pas rempli)
Si au bout des 60 secondes, le processus père est toujours présent, pg_ctl quitte avec le code d’erreur 1
et affiche
failed server does not shutdown
.
Cette fonction teste le signal envoyé. Dans le cas de SIGTERM
(donc -m smart
), elle va envoyer SIGINT
à l’autovacuum
,
SIGUSR2
à bgwriter
, SIGQUIT
à pgarch
(archivage des journaux), SIGQUIT
à pgstat
. Dans le cas de SIGINT
(donc -m fast
), SIGTERM
est envoyé à tous les enfants ainsi qu’à l’autovacuum
, SIGUSR2
à bgwriter
, SIGQUIT
à
pgarch
, SIGQUIT
à pgstat
. Enfin, dans le cas de SIGQUIT
(donc -m immediate
), elle envoie SIGQUIT
à tout le monde.