pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
fix pg_mkdir_p to tolerate concurrent directory creation
11+ messages / 3 participants
[nested] [flat]

Commits from this thread:
  2026-06-19 f25a07b2d9 aa80c34c85 f0a831ef3e 9951e3d382 4647ac1423 4b3bc6b714  Make pg_mkdir_p() tolerant of a concurrent directory creation.
* fix pg_mkdir_p to tolerate concurrent directory creation
@ 2026-06-18 13:18 Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 14:24 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
  0 siblings, 2 replies; 11+ messages in thread

From: Andrew Dunstan @ 2026-06-18 13:18 UTC (permalink / raw)
  To: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>


While working on the pytest stuff, I found this issue when making it 
work on Windows, but the issue can exist everywhere. pg_mkdir_p can fail 
if there is a concurrent directory creation. This patch makes it 
tolerant of concurrent directory creation. To make it more robust it 
stops using stat() on Windows and instead uses GetFileAttributes().

I think this makes the function actually meet the contract set out in 
the file's header comment:

  * pg_mkdir_p --- create a directory and, if necessary, parent directories
  *
  * This is equivalent to "mkdir -p" except we don't complain if the target
  * directory already exists.

Thanks to Bryan Green for help with the Windows part.

There might be a few call sites that actually work around this bug that 
we can clean up.


cheers


andrew



--
Andrew Dunstan
EDB: https://www.enterprisedb.com

Attachments:

0001-Make-pg_mkdir_p-tolerant-of-a-concurrent-directory-c.patch (text/x-patch, 3.6K) download From 55de4a69c6fcfbe72c5801acd67a78bae6d89e96 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan <andrew@dunslane.net> Date: Thu, 18 Jun 2026 08:49:57 -0400 Subject: [PATCH] Make pg_mkdir_p tolerant of a concurrent directory creation pg_mkdir_p creates each missing path component with a stat() followed by mkdir(). If the stat() reports the component as absent but another process creates it in the window before this process's mkdir(), mkdir() fails with EEXIST and pg_mkdir_p treated that as a hard error -- unlike "mkdir -p", which is meant to be idempotent and race-tolerant. This shows up when several processes concurrently create paths that share an ancestor directory: for example, parallel initdb runs whose data directories live under a common temporary directory. One process wins the race to create the shared ancestor and the others fail with could not create directory "...": File exists On Windows, stat() opens a file handle and participates in share-mode locking, which means it can transiently fail on a directory another process is concurrently creating. Use GetFileAttributes() instead: it requests only FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so it reliably sees a concurrently-created directory. Use the same probe for the post-mkdir() fallback check. On other platforms, after a failing mkdir() with EEXIST, the error is genuine only if the path is still not a directory. --- src/port/pgmkdirp.c | 52 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/port/pgmkdirp.c b/src/port/pgmkdirp.c index 7d7cea4dd0e..2ce9186f11f 100644 --- a/src/port/pgmkdirp.c +++ b/src/port/pgmkdirp.c @@ -56,7 +56,9 @@ int pg_mkdir_p(char *path, int omode) { +#ifndef WIN32 struct stat sb; +#endif mode_t numask, oumask; int last, @@ -119,6 +121,42 @@ pg_mkdir_p(char *path, int omode) if (last) (void) umask(oumask); +#ifdef WIN32 + { + /* + * On Windows, stat() opens a handle and can transiently fail on a + * directory another process is concurrently creating. Probe with + * a path-based attribute query instead: it requests only + * FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so it + * reliably sees a concurrently-created directory. + */ + DWORD attr = GetFileAttributes(path); + + if (attr != INVALID_FILE_ATTRIBUTES) + { + /* pre-existing entry */ + if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + errno = last ? EEXIST : ENOTDIR; + retval = -1; + break; + } + /* already a directory: nothing to do, fall through */ + } + else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) + { + /* tolerate a concurrent creation; re-probe the same way */ + attr = GetFileAttributes(path); + if (errno != EEXIST || + attr == INVALID_FILE_ATTRIBUTES || + !(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + retval = -1; + break; + } + } + } +#else /* check for pre-existing directory */ if (stat(path, &sb) == 0) { @@ -134,9 +172,19 @@ pg_mkdir_p(char *path, int omode) } else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { - retval = -1; - break; + /* + * Tolerate a concurrent creation: another process may have + * created the directory in the window between the stat() above + * and this mkdir(). Only treat it as an error if the path still + * is not a directory. + */ + if (errno != EEXIST || stat(path, &sb) != 0 || !S_ISDIR(sb.st_mode)) + { + retval = -1; + break; + } } +#endif if (!last) *p = '/'; } -- 2.43.0
^ permalink raw reply [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
@ 2026-06-18 14:24 ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 15:37   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  1 sibling, 1 reply; 11+ messages in thread

From: Tom Lane @ 2026-06-18 14:24 UTC (permalink / raw)
  To: Andrew Dunstan <andrew@dunslane.net>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

Andrew Dunstan <andrew@dunslane.net> writes:
> While working on the pytest stuff, I found this issue when making it 
> work on Windows, but the issue can exist everywhere. pg_mkdir_p can fail 
> if there is a concurrent directory creation.

This bit:

+			if (errno != EEXIST || stat(path, &sb) != 0 || !S_ISDIR(sb.st_mode))
+			{
+				retval = -1;
+				break;
+			}

looks like it could corrupt the reported errno, ie stat() could
overwrite what mkdir() reported.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 14:24 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-06-18 15:37   ` Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 15:43     ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 1 reply; 11+ messages in thread

From: Andrew Dunstan @ 2026-06-18 15:37 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>


On 2026-06-18 Th 10:24 AM, Tom Lane wrote:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> While working on the pytest stuff, I found this issue when making it
>> work on Windows, but the issue can exist everywhere. pg_mkdir_p can fail
>> if there is a concurrent directory creation.
> This bit:
>
> +			if (errno != EEXIST || stat(path, &sb) != 0 || !S_ISDIR(sb.st_mode))
> +			{
> +				retval = -1;
> +				break;
> +			}
>
> looks like it could corrupt the reported errno, ie stat() could
> overwrite what mkdir() reported.
>
> 			


Oh, good catch, thanks! Here's a revised patch.


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com

Attachments:

v2-0001-Make-pg_mkdir_p-tolerant-of-a-concurrent-director.patch (text/x-patch, 3.8K) download From ab26c8e02b20edc13ce9216c92a2141dc7ca9f90 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan <andrew@dunslane.net> Date: Thu, 18 Jun 2026 11:34:33 -0400 Subject: [PATCH v2] Make pg_mkdir_p tolerant of a concurrent directory creation pg_mkdir_p creates each missing path component with a stat() followed by mkdir(). If the stat() reports the component as absent but another process creates it in the window before this process's mkdir(), mkdir() fails with EEXIST and pg_mkdir_p treated that as a hard error -- unlike "mkdir -p", which is meant to be idempotent and race-tolerant. This shows up when several processes concurrently create paths that share an ancestor directory: for example, parallel initdb runs whose data directories live under a common temporary directory. One process wins the race to create the shared ancestor and the others fail with could not create directory "...": File exists On Windows, stat() opens a file handle and participates in share-mode locking, which means it can transiently fail on a directory another process is concurrently creating. Use GetFileAttributes() instead: it requests only FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so it reliably sees a concurrently-created directory. Use the same probe for the post-mkdir() fallback check. On other platforms, after a failing mkdir() with EEXIST, the error is genuine only if the path is still not a directory. Save errno before the stat() probe so that mkdir()'s error is not clobbered if we have to report failure. --- src/port/pgmkdirp.c | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/port/pgmkdirp.c b/src/port/pgmkdirp.c index 7d7cea4dd0e..f4c481515d1 100644 --- a/src/port/pgmkdirp.c +++ b/src/port/pgmkdirp.c @@ -56,7 +56,9 @@ int pg_mkdir_p(char *path, int omode) { +#ifndef WIN32 struct stat sb; +#endif mode_t numask, oumask; int last, @@ -119,6 +121,42 @@ pg_mkdir_p(char *path, int omode) if (last) (void) umask(oumask); +#ifdef WIN32 + { + /* + * On Windows, stat() opens a handle and can transiently fail on a + * directory another process is concurrently creating. Probe with + * a path-based attribute query instead: it requests only + * FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so it + * reliably sees a concurrently-created directory. + */ + DWORD attr = GetFileAttributes(path); + + if (attr != INVALID_FILE_ATTRIBUTES) + { + /* pre-existing entry */ + if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + errno = last ? EEXIST : ENOTDIR; + retval = -1; + break; + } + /* already a directory: nothing to do, fall through */ + } + else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) + { + /* tolerate a concurrent creation; re-probe the same way */ + attr = GetFileAttributes(path); + if (errno != EEXIST || + attr == INVALID_FILE_ATTRIBUTES || + !(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + retval = -1; + break; + } + } + } +#else /* check for pre-existing directory */ if (stat(path, &sb) == 0) { @@ -134,9 +172,22 @@ pg_mkdir_p(char *path, int omode) } else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { - retval = -1; - break; + /* + * Tolerate a concurrent creation: another process may have + * created the directory in the window between the stat() above + * and this mkdir(). Save errno before the stat() probe so that + * mkdir()'s error is not clobbered if we have to report failure. + */ + int save_errno = errno; + + if (save_errno != EEXIST || stat(path, &sb) != 0 || !S_ISDIR(sb.st_mode)) + { + errno = save_errno; + retval = -1; + break; + } } +#endif if (!last) *p = '/'; } -- 2.43.0
^ permalink raw reply [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 14:24 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 15:37   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
@ 2026-06-18 15:43     ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 16:56       ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  0 siblings, 1 reply; 11+ messages in thread

From: Tom Lane @ 2026-06-18 15:43 UTC (permalink / raw)
  To: Andrew Dunstan <andrew@dunslane.net>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

Andrew Dunstan <andrew@dunslane.net> writes:
> Oh, good catch, thanks! Here's a revised patch.

The Unix side of this LGTM.  I have no idea about the Windows
half (... but are we sure GetFileAttributes() can't change errno?)

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 14:24 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-18 15:37   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-18 15:43     ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-06-18 16:56       ` Andrew Dunstan <andrew@dunslane.net>
  0 siblings, 0 replies; 11+ messages in thread

From: Andrew Dunstan @ 2026-06-18 16:56 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>


On 2026-06-18 Th 11:43 AM, Tom Lane wrote:
> Andrew Dunstan<andrew@dunslane.net> writes:
>> Oh, good catch, thanks! Here's a revised patch.
> The Unix side of this LGTM.  I have no idea about the Windows
> half (... but are we sure GetFileAttributes() can't change errno?)
>
> 			


I'm told it does not. Google says:


GetFileAttributes does not set errno. Because it is a Win32 API function 
rather than a standard C library function, it sets the thread-local 
Last-Error Code instead.


|
|

|cheers|

|
|

|andrew|


--
Andrew Dunstan
EDB:https://www.enterprisedb.com

^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
@ 2026-06-19 14:01 ` Álvaro Herrera <alvherre@kurilemu.de>
  2026-06-19 14:51   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 15:07   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  1 sibling, 2 replies; 11+ messages in thread

From: Álvaro Herrera @ 2026-06-19 14:01 UTC (permalink / raw)
  To: Andrew Dunstan <andrew@dunslane.net>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

On 2026-Jun-18, Andrew Dunstan wrote:

> 
> While working on the pytest stuff, I found this issue when making it work on
> Windows, but the issue can exist everywhere. pg_mkdir_p can fail if there is
> a concurrent directory creation. This patch makes it tolerant of concurrent
> directory creation.

Hmm, should the 'break's in the loop be 'continue's?  If you're creating
path a/b/c, and a concurrent process beats you but is only attempting to
do a/b, then with the break you'll fail to create the final c.

-- 
Álvaro Herrera               48°01'N 7°57'E  —  https://www.EnterpriseDB.com/
Bob [Floyd] used to say that he was planning to get a Ph.D. by the "green
stamp method," namely by saving envelopes addressed to him as 'Dr. Floyd'.
After collecting 500 such letters, he mused, a university somewhere in
Arizona would probably grant him a degree.              (Don Knuth)





^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
@ 2026-06-19 14:51   ` Tom Lane <tgl@sss.pgh.pa.us>
  1 sibling, 0 replies; 11+ messages in thread

From: Tom Lane @ 2026-06-19 14:51 UTC (permalink / raw)
  To: Álvaro Herrera <alvherre@kurilemu.de>; +Cc: Andrew Dunstan <andrew@dunslane.net>; PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

=?utf-8?Q?=C3=81lvaro?= Herrera <alvherre@kurilemu.de> writes:
> Hmm, should the 'break's in the loop be 'continue's?  If you're creating
> path a/b/c, and a concurrent process beats you but is only attempting to
> do a/b, then with the break you'll fail to create the final c.

Maybe I'm confused, but I think it's right as-is.  The "break"s are
places where we're giving up and reporting a hard error.  If we want
to continue to the next directory level, we just fall through ---
and doing that with "continue" would be wrong because it'd miss the
step at the bottom of the loop:

		if (!last)
			*p = '/';


			regards, tom lane





^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
@ 2026-06-19 15:07   ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 15:40     ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  1 sibling, 1 reply; 11+ messages in thread

From: Tom Lane @ 2026-06-19 15:07 UTC (permalink / raw)
  To: Álvaro Herrera <alvherre@kurilemu.de>; +Cc: Andrew Dunstan <andrew@dunslane.net>; PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

Actually ... given this change, why don't we drop the initial stat()
call?  Just try mkdir(), and move on if it succeeds.  If not, but
there's already a directory there, we're good.  That eliminates the
race condition without duplicating code.

			regards, tom lane

Attachments:

v3-0001-Make-pg_mkdir_p-tolerant-of-a-concurrent-director.patch (text/x-diff, 1.7K) download diff --git a/src/port/pgmkdirp.c b/src/port/pgmkdirp.c index 7d7cea4dd0e..3e6b06fce79 100644 --- a/src/port/pgmkdirp.c +++ b/src/port/pgmkdirp.c @@ -56,7 +56,6 @@ int pg_mkdir_p(char *path, int omode) { - struct stat sb; mode_t numask, oumask; int last, @@ -119,24 +118,46 @@ pg_mkdir_p(char *path, int omode) if (last) (void) umask(oumask); - /* check for pre-existing directory */ - if (stat(path, &sb) == 0) + if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { - if (!S_ISDIR(sb.st_mode)) + /* + * If we got EEXIST because there's already a directory there, + * don't complain. + */ +#ifndef WIN32 + int save_errno = errno; + struct stat sb; + + if (save_errno != EEXIST || + stat(path, &sb) != 0 || + !S_ISDIR(sb.st_mode)) { - if (last) - errno = EEXIST; - else - errno = ENOTDIR; + /* Don't let stat replace mkdir's errno */ + errno = save_errno; retval = -1; break; } +#else /* WIN32 */ + /* + * On Windows, stat() opens a handle and can transiently fail on a + * directory another process is concurrently creating. Probe with + * a path-based attribute query instead: it requests only + * FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so + * it reliably sees a concurrently-created directory. We assume + * GetFileAttributes() won't change errno. + */ + DWORD attr = GetFileAttributes(path); + + if (errno != EEXIST || + attr == INVALID_FILE_ATTRIBUTES || + !(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + retval = -1; + break; + } +#endif /* WIN32 */ } - else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) - { - retval = -1; - break; - } + if (!last) *p = '/'; }
^ permalink raw reply [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
  2026-06-19 15:07   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-06-19 15:40     ` Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 16:52       ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 1 reply; 11+ messages in thread

From: Andrew Dunstan @ 2026-06-19 15:40 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; Álvaro Herrera <alvherre@kurilemu.de>; +Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>


On 2026-06-19 Fr 11:07 AM, Tom Lane wrote:
> Actually ... given this change, why don't we drop the initial stat()
> call?  Just try mkdir(), and move on if it succeeds.  If not, but
> there's already a directory there, we're good.  That eliminates the
> race condition without duplicating code.


LGTM, thanks!


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com






^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
  2026-06-19 15:07   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 15:40     ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
@ 2026-06-19 16:52       ` Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 18:39         ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  0 siblings, 1 reply; 11+ messages in thread

From: Tom Lane @ 2026-06-19 16:52 UTC (permalink / raw)
  To: Andrew Dunstan <andrew@dunslane.net>; +Cc: Álvaro Herrera <alvherre@kurilemu.de>; PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>

Andrew Dunstan <andrew@dunslane.net> writes:
> LGTM, thanks!

OK, pushed.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 11+ messages in thread

* Re: fix pg_mkdir_p to tolerate concurrent directory creation
  2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 14:01 ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Álvaro Herrera <alvherre@kurilemu.de>
  2026-06-19 15:07   ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
  2026-06-19 15:40     ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
  2026-06-19 16:52       ` Re: fix pg_mkdir_p to tolerate concurrent directory creation Tom Lane <tgl@sss.pgh.pa.us>
@ 2026-06-19 18:39         ` Andrew Dunstan <andrew@dunslane.net>
  0 siblings, 0 replies; 11+ messages in thread

From: Andrew Dunstan @ 2026-06-19 18:39 UTC (permalink / raw)
  To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: Álvaro Herrera <alvherre@kurilemu.de>; PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>


On 2026-06-19 Fr 12:52 PM, Tom Lane wrote:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> LGTM, thanks!
> OK, pushed.
>
> 			


Thanks!


cheers


andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com






^ permalink  raw  reply  [nested|flat] 11+ messages in thread


end of thread, other threads:[~2026-06-19 18:39 UTC | newest]

Thread overview: 11+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-06-18 13:18 fix pg_mkdir_p to tolerate concurrent directory creation Andrew Dunstan <andrew@dunslane.net>
2026-06-18 14:24 ` Tom Lane <tgl@sss.pgh.pa.us>
2026-06-18 15:37   ` Andrew Dunstan <andrew@dunslane.net>
2026-06-18 15:43     ` Tom Lane <tgl@sss.pgh.pa.us>
2026-06-18 16:56       ` Andrew Dunstan <andrew@dunslane.net>
2026-06-19 14:01 ` Álvaro Herrera <alvherre@kurilemu.de>
2026-06-19 14:51   ` Tom Lane <tgl@sss.pgh.pa.us>
2026-06-19 15:07   ` Tom Lane <tgl@sss.pgh.pa.us>
2026-06-19 15:40     ` Andrew Dunstan <andrew@dunslane.net>
2026-06-19 16:52       ` Tom Lane <tgl@sss.pgh.pa.us>
2026-06-19 18:39         ` Andrew Dunstan <andrew@dunslane.net>

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox