Commit 5762a4d9 authored by Heikki Linnakangas's avatar Heikki Linnakangas

Inherit max_safe_fds to child processes in EXEC_BACKEND mode.

Postmaster sets max_safe_fds by testing how many open file descriptors it
can open, and that is normally inherited by all child processes at fork().
Not so on EXEC_BACKEND, ie. Windows, however. Because of that, we
effectively ignored max_files_per_process on Windows, and always assumed
a conservative default of 32 simultaneous open files. That could have an
impact on performance, if you need to access a lot of different files
in a query. After this patch, the value is passed to child processes by
save/restore_backend_variables() among many other global variables.

It has been like this forever, but given the lack of complaints about it,
I'm not backpatching this.
parent d2c1740d
...@@ -438,6 +438,7 @@ typedef struct ...@@ -438,6 +438,7 @@ typedef struct
TimestampTz PgReloadTime; TimestampTz PgReloadTime;
bool redirection_done; bool redirection_done;
bool IsBinaryUpgrade; bool IsBinaryUpgrade;
int max_safe_fds;
#ifdef WIN32 #ifdef WIN32
HANDLE PostmasterHandle; HANDLE PostmasterHandle;
HANDLE initial_signal_pipe; HANDLE initial_signal_pipe;
...@@ -4741,6 +4742,7 @@ save_backend_variables(BackendParameters *param, Port *port, ...@@ -4741,6 +4742,7 @@ save_backend_variables(BackendParameters *param, Port *port,
param->redirection_done = redirection_done; param->redirection_done = redirection_done;
param->IsBinaryUpgrade = IsBinaryUpgrade; param->IsBinaryUpgrade = IsBinaryUpgrade;
param->max_safe_fds = max_safe_fds;
#ifdef WIN32 #ifdef WIN32
param->PostmasterHandle = PostmasterHandle; param->PostmasterHandle = PostmasterHandle;
...@@ -4964,6 +4966,7 @@ restore_backend_variables(BackendParameters *param, Port *port) ...@@ -4964,6 +4966,7 @@ restore_backend_variables(BackendParameters *param, Port *port)
redirection_done = param->redirection_done; redirection_done = param->redirection_done;
IsBinaryUpgrade = param->IsBinaryUpgrade; IsBinaryUpgrade = param->IsBinaryUpgrade;
max_safe_fds = param->max_safe_fds;
#ifdef WIN32 #ifdef WIN32
PostmasterHandle = param->PostmasterHandle; PostmasterHandle = param->PostmasterHandle;
......
...@@ -103,7 +103,7 @@ int max_files_per_process = 1000; ...@@ -103,7 +103,7 @@ int max_files_per_process = 1000;
* Note: the value of max_files_per_process is taken into account while * Note: the value of max_files_per_process is taken into account while
* setting this variable, and so need not be tested separately. * setting this variable, and so need not be tested separately.
*/ */
static int max_safe_fds = 32; /* default if not changed */ int max_safe_fds = 32; /* default if not changed */
/* Debugging.... */ /* Debugging.... */
......
...@@ -53,6 +53,11 @@ typedef int File; ...@@ -53,6 +53,11 @@ typedef int File;
/* GUC parameter */ /* GUC parameter */
extern int max_files_per_process; extern int max_files_per_process;
/*
* This is private to fd.c, but exported for save/restore_backend_variables()
*/
extern int max_safe_fds;
/* /*
* prototypes for functions in fd.c * prototypes for functions in fd.c
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment