Aller au contenu

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.