PostgreSQL does not start when max_files_per_process> 1200 on Windows 7

Started by Victor Spirinover 7 years ago3 messages
#1Victor Spirin
v.spirin@postgrespro.ru
1 attachment(s)

Hi,

I have a bug in Windows 7 with max_files_per_process> 1200.

Using dup (0) in the  function count_usable_fds more than 1200 times (0
= stdin) causes further unpredictable errors with file operations.

When I open a real file and use its descriptor for the dup, no error
occurs. In the patch I check the file postgresql.conf

--
Victor Spirin
Postgres Professional:http://www.postgrespro.com
The Russian Postgres Company

Attachments:

max_files_per_process.patchtext/plain; charset=UTF-8; name=max_files_per_process.patchDownload
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 8dd51f1..79054e5 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -828,6 +828,15 @@ count_usable_fds(int max_to_probe, int *usable_fds, int *already_open)
 		ereport(WARNING, (errmsg("getrlimit failed: %m")));
 #endif							/* HAVE_GETRLIMIT */
 
+	int fd_test = 0;
+#ifdef WIN32
+	/*
+	 * we have error on Windows7 with max_files_per_process > 1200 when dup(0) - stdin
+	 * make test on postgresql.conf file	
+	 */
+	fd_test = _open(ConfigFileName, _O_RDONLY);
+	if (fd_test < 0) fd_test = 0; /* if was error then = stdin */
+#endif
 	/* dup until failure or probe limit reached */
 	for (;;)
 	{
@@ -843,7 +852,7 @@ count_usable_fds(int max_to_probe, int *usable_fds, int *already_open)
 			break;
 #endif
 
-		thisfd = dup(0);
+		thisfd = dup(fd_test);
 		if (thisfd < 0)
 		{
 			/* Expect EMFILE or ENFILE, else it's fishy */
@@ -869,7 +878,9 @@ count_usable_fds(int max_to_probe, int *usable_fds, int *already_open)
 	/* release the files we opened */
 	for (j = 0; j < used; j++)
 		close(fd[j]);
-
+#ifdef WIN32
+	if (fd_test > 0) _close(fd_test);
+#endif
 	pfree(fd);
 
 	/*
#2Andres Freund
andres@anarazel.de
In reply to: Victor Spirin (#1)
Re: PostgreSQL does not start when max_files_per_process> 1200 on Windows 7

Hi,

On 2018-09-05 13:06:06 +0300, Victor Spirin wrote:

I have a bug in Windows 7 with max_files_per_process> 1200.

Using dup (0) in the� function count_usable_fds more than 1200 times (0 =
stdin) causes further unpredictable errors with file operations.

Could you expand a bit on this?

Greetings,

Andres Freund

#3Victor Spirin
v.spirin@postgrespro.ru
In reply to: Andres Freund (#2)
Re: PostgreSQL does not start when max_files_per_process> 1200 on Windows 7

When max_files_per_process=1201 or more server not start. I tested and
debugged this on Windows 7. On Windows 10 work all right.

I found this take place after call function  count_usable_fds(int
max_to_probe, int *usable_fds, int *already_open)

Error occured on the first call selres = select(nSockets, &rmask, NULL,
NULL, &timeout) from ServerLoop. Error 0xC0000142:  "{DLL Initialization
Failed} Initialization of the dynamic link library %hs failed. The
process is terminating abnormally."

I temporarily moved call set_max_safe_fds() to top of the PostmasterMain
and error moved to ReadFile in function pipe_read_line(char *cmd, char
*line, int maxsize):

if (!ReadFile(childstdoutrddup, lineptr, maxsize - (lineptr - line),
                          &bytesread, NULL))

Repeat the error in a separate example did not work yet.

Replacing dup for stdin on dup of file handle resolve this problem.

Victor Spirin
Postgres Professional:http://www.postgrespro.com
The Russian Postgres Company

05.09.2018 19:24, Andres Freund пишет:

Show quoted text

Hi,

On 2018-09-05 13:06:06 +0300, Victor Spirin wrote:

I have a bug in Windows 7 with max_files_per_process> 1200.

Using dup (0) in the  function count_usable_fds more than 1200 times (0 =
stdin) causes further unpredictable errors with file operations.

Could you expand a bit on this?

Greetings,

Andres Freund