diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 04a6c41..124f08c 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5241,6 +5241,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. Normally, + this is set to false, so that only FATAL errors will terminate the + session. + + + + + + automatic_restart (boolean) + + automatic_restart 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 7cf3a41..b04551c 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 automatic_restart = true; /* PIDs of special child processes; 0 when not running */ static pid_t StartupPID = 0, @@ -3047,12 +3048,12 @@ 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 if automatic restart has been disabled, 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 || !automatic_restart)) ExitPostmaster(1); /* diff --git a/src/backend/utils/misc/check_guc b/src/backend/utils/misc/check_guc index df597b4..5152b4e 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 b423d80..d34e0e0 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_HANDING */ + 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, + gettext_noop("Terminate session on any error."), + NULL }, &ExitOnAnyError, false, NULL, NULL }, { + {"automatic_restart", PGC_SIGHUP, ERROR_HANDLING, + gettext_noop("Reinitialize after backend crash."), + NULL + }, + &automatic_restart, + 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 5ea568a..189ccb1 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -514,6 +514,14 @@ #------------------------------------------------------------------------------ +# ERROR HANDING +#------------------------------------------------------------------------------ + +#exit_on_error = false # terminate session on any error? +#automatic_restart = true # reinitialize after backend crash? + + +#------------------------------------------------------------------------------ # CUSTOMIZED OPTIONS #------------------------------------------------------------------------------ diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h index 56d7d8e..948e1a0 100644 --- a/src/include/postmaster/postmaster.h +++ b/src/include/postmaster/postmaster.h @@ -29,6 +29,7 @@ extern bool Log_connections; extern bool log_hostname; extern bool enable_bonjour; extern char *bonjour_name; +extern bool automatic_restart; #ifdef WIN32 extern HANDLE PostmasterHandle; diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index a4c32fa..c6c3d06 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -80,6 +80,7 @@ enum config_group COMPAT_OPTIONS, COMPAT_OPTIONS_PREVIOUS, COMPAT_OPTIONS_CLIENT, + ERROR_HANDLING, PRESET_OPTIONS, CUSTOM_OPTIONS, DEVELOPER_OPTIONS