From 51b3a597700ebece10d030764803f7933e268a13 Mon Sep 17 00:00:00 2001 From: MasaoFujii Date: Thu, 7 Oct 2010 19:15:43 +0900 Subject: [PATCH] Add restart_after_crash GUC. Normally, we automatically restart after a backend crash, but in some cases when PostgreSQL is invoked by clusterware it may be desirable to suppress this behavior, so we provide an option which does this. Since no existing GUC group quite fits, create a new group called "error handling options" for this and the previously undocumented GUC exit_on_error, which is now documented. Review by Fujii Masao. Conflicts: doc/src/sgml/config.sgml src/backend/postmaster/postmaster.c src/backend/utils/misc/guc.c --- doc/src/sgml/config.sgml | 41 +++++++++++++++++++++++++++ src/backend/postmaster/postmaster.c | 12 ++++---- src/backend/utils/misc/check_guc | 2 +- src/backend/utils/misc/guc.c | 20 +++++++++---- src/backend/utils/misc/postgresql.conf.sample | 8 ++++++ src/include/postmaster/postmaster.h | 3 +- src/include/utils/guc_tables.h | 3 +- 7 files changed, 76 insertions(+), 13 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 39be6243ca..6f0f8c1c75 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5330,6 +5330,47 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' + + Error Handling + + + + + exit_on_error (boolean) + + exit_on_error configuration parameter + + + + If true, any error will terminate the current session. By default, + this is set to false, so that only FATAL errors will terminate the + session. + + + + + + restart_after_crash (boolean) + + restart_after_crash configuration parameter + + + + When set to true, which is the default, PostgreSQL + will automatically reinitialize after a backend crash. Leaving this + value set to true is normally the best way to maximize the availability + of the database. However, in some circumstances, such as when + PostgreSQL is being invoked by clusterware, it may be + useful to disable this behavior, so that the clusterware can gain + control and take any actions it deems appropriate. + + + + + + + + Preset Options diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 4666fd60e1..0b591d4ebf 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -203,6 +203,7 @@ bool Db_user_namespace = false; bool enable_bonjour = false; char *bonjour_name; +bool restart_after_crash = true; /* PIDs of special child processes; 0 when not running */ static pid_t StartupPID = 0, @@ -3061,12 +3062,13 @@ PostmasterStateMachine(void) } /* - * If recovery failed, wait for all non-syslogger children to exit, and - * then exit postmaster. We don't try to reinitialize when recovery fails, - * because more than likely it will just fail again and we will keep - * trying forever. + * If recovery failed, or the user does not want an automatic restart after + * backend crashes, wait for all non-syslogger children to exit, and then + * exit postmaster. We don't try to reinitialize when recovery fails, + * because more than likely it will just fail again and we will keep trying + * forever. */ - if (RecoveryError && pmState == PM_NO_CHILDREN) + if (pmState == PM_NO_CHILDREN && (RecoveryError || !restart_after_crash)) ExitPostmaster(1); /* diff --git a/src/backend/utils/misc/check_guc b/src/backend/utils/misc/check_guc index df597b4879..5152b4e929 100755 --- a/src/backend/utils/misc/check_guc +++ b/src/backend/utils/misc/check_guc @@ -16,7 +16,7 @@ ## if an option is valid but shows up in only one file (guc.c but not ## postgresql.conf.sample), it should be listed here so that it ## can be ignored -INTENTIONALLY_NOT_INCLUDED="autocommit debug_deadlocks exit_on_error \ +INTENTIONALLY_NOT_INCLUDED="autocommit debug_deadlocks \ is_superuser lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time \ pre_auth_delay role seed server_encoding server_version server_version_int \ session_authorization trace_lock_oidmin trace_lock_table trace_locks trace_lwlocks \ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 4e55b161f6..362daaeefd 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -548,6 +548,8 @@ const char *const config_group_names[] = gettext_noop("Version and Platform Compatibility / Previous PostgreSQL Versions"), /* COMPAT_OPTIONS_CLIENT */ gettext_noop("Version and Platform Compatibility / Other Platforms and Clients"), + /* ERROR_HANDLING */ + gettext_noop("Error Handling"), /* PRESET_OPTIONS */ gettext_noop("Preset Options"), /* CUSTOM_OPTIONS */ @@ -811,17 +813,25 @@ static struct config_bool ConfigureNamesBool[] = #endif assign_debug_assertions, NULL }, + { - /* currently undocumented, so don't show in SHOW ALL */ - {"exit_on_error", PGC_USERSET, UNGROUPED, - gettext_noop("No description available."), - NULL, - GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE + {"exit_on_error", PGC_USERSET, ERROR_HANDLING_OPTIONS, + gettext_noop("Terminate session on any error."), + NULL }, &ExitOnAnyError, false, NULL, NULL }, { + {"restart_after_crash", PGC_SIGHUP, ERROR_HANDLING_OPTIONS, + gettext_noop("Reinitialize after backend crash."), + NULL + }, + &restart_after_crash, + true, NULL, NULL + }, + + { {"log_duration", PGC_SUSET, LOGGING_WHAT, gettext_noop("Logs the duration of each completed SQL statement."), NULL diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index e1f5ab66ed..ba8a77586c 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -522,6 +522,14 @@ #------------------------------------------------------------------------------ +# ERROR HANDLING +#------------------------------------------------------------------------------ + +#exit_on_error = false # terminate session on any error? +#restart_after_crash = true # reinitialize after backend crash? + + +#------------------------------------------------------------------------------ # CUSTOMIZED OPTIONS #------------------------------------------------------------------------------ diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h index b99ffec431..7cdcc7998f 100644 --- a/src/include/postmaster/postmaster.h +++ b/src/include/postmaster/postmaster.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/postmaster/postmaster.h,v 1.22 2010/01/02 16:58:08 momjian Exp $ + * $PostgreSQL: pgsql/src/include/postmaster/postmaster.h,v 1.23 2010/07/20 00:47:53 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -29,6 +29,7 @@ extern bool Log_connections; extern bool log_hostname; extern bool enable_bonjour; extern char *bonjour_name; +extern bool restart_after_crash; #ifdef WIN32 extern HANDLE PostmasterHandle; diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index 54aba388ec..01c6174f04 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -7,7 +7,7 @@ * * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.49 2010/06/15 07:52:11 itagaki Exp $ + * $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.50 2010/07/20 00:47:53 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -80,6 +80,7 @@ enum config_group COMPAT_OPTIONS, COMPAT_OPTIONS_PREVIOUS, COMPAT_OPTIONS_CLIENT, + ERROR_HANDLING_OPTIONS, PRESET_OPTIONS, CUSTOM_OPTIONS, DEVELOPER_OPTIONS -- 2.11.0