Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1waCep-001bT9-2J for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2026 13:19:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1waCdp-00BQQ0-19 for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2026 13:18:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1waCdo-00BQPs-2i for pgsql-hackers@lists.postgresql.org; Thu, 18 Jun 2026 13:18:45 +0000 Received: from mail-vk1-xa36.google.com ([2607:f8b0:4864:20::a36]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1waCdl-0000000162b-3O97 for pgsql-hackers@lists.postgresql.org; Thu, 18 Jun 2026 13:18:44 +0000 Received: by mail-vk1-xa36.google.com with SMTP id 71dfb90a1353d-59b074ec7ceso315701e0c.1 for ; Thu, 18 Jun 2026 06:18:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dunslane-net.20251104.gappssmtp.com; s=20251104; t=1781788719; x=1782393519; darn=lists.postgresql.org; h=autocrypt:subject:to:content-language:from:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to; bh=kDyXo4+1E8I6aJueqBgmhCehNhUtSXRUcM7+Qv59jX8=; b=mxOMBA37VCY4hyxP6Cn/edH8TDhXfNoK+AtTGikqCqn3vcsfm3VkUZCbpU92KzvR1m emuKLcVpFxMqsjvy+CmKK8h5rIwj0wwiUOKFMGTwLChIuBRIAzpejigjbInAqGIarFKo CLMfh47j4SiwXjbp8o4nZHzFulZ+UMtWTXlaZB4P+3KT/rttwlOrx06Q7dbJV/vpRtGt Kvzib8E1VdJDi1jpnWJVCIerh8AubVc0Ud2AJog3R5Je0+m9zUl0BGFDmaYCanRqLBgi cj9mEXIwS+Sc6fHrPBXOFh0Ak9hX8J3VjdGmLHtrxuNLcLV/5nVtufClBD3x7aQSqa1F 0PiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781788719; x=1782393519; h=autocrypt:subject:to:content-language:from:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=kDyXo4+1E8I6aJueqBgmhCehNhUtSXRUcM7+Qv59jX8=; b=M1NacMq+9jY0lWIvA2HMGNx8MKmQPRO7kmKzAITaSQKcanPfoDheW5eMxK7m3OY/Od X8/nWDc41qTsiNBj7YqLdLRvWMGDlEoi5sXQWCGjh3ga6Kt1EE1ypWv8C7shNJ7wyTMu js/ZJNl3+wZUyZzTT6tv8f+8UdOYTcD7jdXzxU53No1AFcZ9IgSyrcDUBn0rPEhpYVHp wZPGbEjLhdk4Uv5jxrgNhn4thl5GFBX0Z7Fyt8NxgfNGpy++U4mfIz1b6LFbansBmw+F 9NdNJocjs2OipFHbO6luFAqgQSS3KCQnBS/q5PuRoUUToolIWzRTYTnXRR+YUV6kiqW6 JXTg== X-Gm-Message-State: AOJu0YwPGxKGo49RpX6YKCmKIe/2sMNmnFcaZ4lEEgFniHHr13JSfUZX 4ZTVwJhCb0di8gUOF0xnYJP1CFJpQzpB+m51Z3Z78IJkMtN+O9oBieSC85CBMrJmKOrOUs7RLQl hxB9u X-Gm-Gg: AfdE7cmEW+KRsLU9MQDWCCOTQKG6P2+uiulM73NnbTqktSc02IhhXryAlPqftAgyaKC ZW/btymRVddmIriphcsreM7dAQT5foMF38nFc8iyOXS7CAH5VyoCind3B4qZ8YFCSCRecrL+8OO 6ixRCx4T+EIs27K9XlLC/2ALxAjnZtp6ORwtiYdsCUQDaRb1xr0kAmfxM4RcybOimMIfbcDPrO8 RHvJawh4reafg2OPWo2rUmih8AG8jNV1dSmBBYPbRAEGo3IAylntHOX2PZ2kWSw1Nu8An6LDJoF x6Z9Fh7XjPDZqKv7aQaYG2N06E01lrsUSqEEiAL3J08KbKLUSwJ1Z7TMuHU+2bmGUtT4K3xyWxv nPWbDG0boV6WF1V/SSpXsam0Y7UhpwNiwM0wuk5t5fZn7iqMSIc8xxf8JzAizgD3B+IL9l/MTsm ouOdn7UA2Pw3VzWBDXq/FyrCDrZ6AHCQX1yoFfadpV/HUpBRUiA+oPTYiO/GmS X-Received: by 2002:a05:6102:947:b0:6e0:3d72:3044 with SMTP id ada2fe7eead31-7246d538e5cmr4577470137.28.1781788719249; Thu, 18 Jun 2026 06:18:39 -0700 (PDT) Received: from ?IPV6:2605:a601:a6b0:500:ccb8:56eb:bfc6:86b5? ([2605:a601:a6b0:500:ccb8:56eb:bfc6:86b5]) by smtp.googlemail.com with ESMTPSA id ada2fe7eead31-7208736cb45sm9272649137.7.2026.06.18.06.18.38 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 18 Jun 2026 06:18:38 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------BR1ttoiWFK4saGSxAIYyIGYH" Message-ID: <3ca004de-e49b-4471-b8aa-fd656e70f68c@dunslane.net> Date: Thu, 18 Jun 2026 09:18:37 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Andrew Dunstan Content-Language: en-US To: PostgreSQL Hackers Subject: fix pg_mkdir_p to tolerate concurrent directory creation Autocrypt: addr=andrew@dunslane.net; keydata= xsBNBE7KWFkBCAClridxur2AIc7eW2AR7izbfp3EnNefie2HbLF0izW5Ik5UjX2HBXBx4syI gY6b0ugohXrr274+baoAlvSbq6cAoQuEVrk5IZFzt20b1Xkx65FwGSEj526yiKLocqkJceSq Xr9xcA5SGY+FZv441chh5SU92v4q6z+6LPpoHOh97ptAVXZYNTtU0LevyvD5lja0TzbvJm6C eFXitJfnm1pLEr0DGJCR/iUOl/N62Kh4855zZC7NHIjQHPOvV5Stz/l5ilDhvGVk+xkXFPys SjZoUr1rXhYLpiyi5sR0X9FHXT0KnGuz1F5ERO7ZTLSSQ6fJwPj6gOk9K+vvoKvoeql5ABEB AAHNJEFuZHJldyBEdW5zdGFuIDxhbmRyZXdAZHVuc2xhbmUubmV0PsLAlwQTAQgAQQIbAwIX gAIZAQULCQgHAwUVCgkICwUWAgMBAAIeBRYhBOQ+WEYd/Hy/RGkVpZn6f8tZ/DuBBQJoGNGd BQkdEO8nAAoJEJn6f8tZ/DuBq74H/jkTR4Zi3stbw+xC7v2u3QozssK7MYPL2AsVfh7OealS h182fiWXpfvmmAB7WUHbhk9GC2RAOnHI/2d2jgKaMLAHsGYOT0YopTVIwRY43fCw/mK67yxc wmDcX+zyKfLaivNbf5A7QPLNwda98bEAMSJ8Sn652Uc6cA8t3uKGsVzbRBQOoYzjgvBCfSrE 9ql3PDNg0l4BfAqabd2f70ZUm9VAMEPrgv/v2xI7M2XiL4g5BVmqLCOwxLM8RMCotCuoweUr VO43DeBCIDwLxotMJKvGWDjBzQYlU1NPUAtNcz/gN9ITUe1VUGjyvGj4u1lxBOcQQUw7l1+T 5moZ4iZxXzvOwE0ETspYWQEIANGc4zQULOxhbqO2dyD51YhqCNRmm9oKWaqf+wmW4tpDe/VV cxAnNizd4LWCHfzpb5cHAtGkOPePMfzWVf6nvdF7d3eglbtf59+zG7O7llV0xSSoFiieQBsr GvqDInXYX/4mRRXMtyhM353/tixC9RWLs1oofyYmCPPXXY7h9R7en3B8BoVrRFcdzlIY/NFN hFGW/9dkEiGjgna2Rk6e15kln4ZvFBWUg23p93w/pqXcxY6+k/8TEk+C4R+M6w7o2PLGOjdZ +kPiUcw5H85zf/yZJwQXzisXaNduwWB6Vads9YC9dj6kPR1c4VGRqAaYL++LAEOqrlvm2Tvq QqZRtnEAEQEAAcLAfAQYAQgAJgIbDBYhBOQ+WEYd/Hy/RGkVpZn6f8tZ/DuBBQJoGNI2BQkd EODdAAoJEJn6f8tZ/DuBfw0IAKTsfD40teP/pp+bsLLMSxPXUYrrprTj7WFB5v61p6dkpSr/ qXmMlyahdxQFaPmfVgVirB1Vk/kHiWNnnGjfUV9nB2Zg9LI0Xb9/ts3LsUiRWXzG3tkMY6XL vsVOxW4XFRND9l2q+WW93aZ1DZl+fqWfYgMvsusFRhmGFOKTRfKPta2Pkv+AhA24N4+PrR5p bU4k2MO8PAGiK8eaYKGFG1bHKuAvoDoF7WXJ3FHxuWqLnKEt4dfOLm5pAe3zq1Lt6q8azT9i QWGpSAK5vQUWQHBHpiDjdPeqKZ6HiAXIIKfSmb+jrvXBqoP+D6/K7rUjG2aXiRtTIAXms9sm VRu7cmw= List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------BR1ttoiWFK4saGSxAIYyIGYH Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 --------------BR1ttoiWFK4saGSxAIYyIGYH Content-Type: text/x-patch; charset=UTF-8; name="0001-Make-pg_mkdir_p-tolerant-of-a-concurrent-directory-c.patch" Content-Disposition: attachment; filename*0="0001-Make-pg_mkdir_p-tolerant-of-a-concurrent-directory-c.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1NWRlNGE2OWM2ZmNmYmU3MmM1ODAxYWNkNjdhNzhiYWU2ZDg5ZTk2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgRHVuc3RhbiA8YW5kcmV3QGR1bnNsYW5l Lm5ldD4KRGF0ZTogVGh1LCAxOCBKdW4gMjAyNiAwODo0OTo1NyAtMDQwMApTdWJqZWN0OiBb UEFUQ0hdIE1ha2UgcGdfbWtkaXJfcCB0b2xlcmFudCBvZiBhIGNvbmN1cnJlbnQgZGlyZWN0 b3J5IGNyZWF0aW9uCgpwZ19ta2Rpcl9wIGNyZWF0ZXMgZWFjaCBtaXNzaW5nIHBhdGggY29t cG9uZW50IHdpdGggYSBzdGF0KCkgZm9sbG93ZWQKYnkgbWtkaXIoKS4gIElmIHRoZSBzdGF0 KCkgcmVwb3J0cyB0aGUgY29tcG9uZW50IGFzIGFic2VudCBidXQgYW5vdGhlcgpwcm9jZXNz IGNyZWF0ZXMgaXQgaW4gdGhlIHdpbmRvdyBiZWZvcmUgdGhpcyBwcm9jZXNzJ3MgbWtkaXIo KSwgbWtkaXIoKQpmYWlscyB3aXRoIEVFWElTVCBhbmQgcGdfbWtkaXJfcCB0cmVhdGVkIHRo YXQgYXMgYSBoYXJkIGVycm9yIC0tIHVubGlrZQoibWtkaXIgLXAiLCB3aGljaCBpcyBtZWFu dCB0byBiZSBpZGVtcG90ZW50IGFuZCByYWNlLXRvbGVyYW50LgoKVGhpcyBzaG93cyB1cCB3 aGVuIHNldmVyYWwgcHJvY2Vzc2VzIGNvbmN1cnJlbnRseSBjcmVhdGUgcGF0aHMgdGhhdApz aGFyZSBhbiBhbmNlc3RvciBkaXJlY3Rvcnk6IGZvciBleGFtcGxlLCBwYXJhbGxlbCBpbml0 ZGIgcnVucyB3aG9zZQpkYXRhIGRpcmVjdG9yaWVzIGxpdmUgdW5kZXIgYSBjb21tb24gdGVt cG9yYXJ5IGRpcmVjdG9yeS4gIE9uZSBwcm9jZXNzCndpbnMgdGhlIHJhY2UgdG8gY3JlYXRl IHRoZSBzaGFyZWQgYW5jZXN0b3IgYW5kIHRoZSBvdGhlcnMgZmFpbCB3aXRoCgogICAgY291 bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgIi4uLiI6IEZpbGUgZXhpc3RzCgpPbiBXaW5kb3dz LCBzdGF0KCkgb3BlbnMgYSBmaWxlIGhhbmRsZSBhbmQgcGFydGljaXBhdGVzIGluIHNoYXJl LW1vZGUKbG9ja2luZywgd2hpY2ggbWVhbnMgaXQgY2FuIHRyYW5zaWVudGx5IGZhaWwgb24g YSBkaXJlY3RvcnkgYW5vdGhlcgpwcm9jZXNzIGlzIGNvbmN1cnJlbnRseSBjcmVhdGluZy4g IFVzZSBHZXRGaWxlQXR0cmlidXRlcygpIGluc3RlYWQ6IGl0CnJlcXVlc3RzIG9ubHkgRklM RV9SRUFEX0FUVFJJQlVURVMgYW5kIGlzIGV4ZW1wdCBmcm9tIHNoYXJlLW1vZGUKZGVuaWFs LCBzbyBpdCByZWxpYWJseSBzZWVzIGEgY29uY3VycmVudGx5LWNyZWF0ZWQgZGlyZWN0b3J5 LiAgVXNlIHRoZQpzYW1lIHByb2JlIGZvciB0aGUgcG9zdC1ta2RpcigpIGZhbGxiYWNrIGNo ZWNrLgoKT24gb3RoZXIgcGxhdGZvcm1zLCBhZnRlciBhIGZhaWxpbmcgbWtkaXIoKSB3aXRo IEVFWElTVCwgdGhlIGVycm9yIGlzCmdlbnVpbmUgb25seSBpZiB0aGUgcGF0aCBpcyBzdGls bCBub3QgYSBkaXJlY3RvcnkuCi0tLQogc3JjL3BvcnQvcGdta2RpcnAuYyB8IDUyICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLQogMSBmaWxlIGNoYW5n ZWQsIDUwIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L3BvcnQvcGdta2RpcnAuYyBiL3NyYy9wb3J0L3BnbWtkaXJwLmMKaW5kZXggN2Q3Y2VhNGRk MGUuLjJjZTkxODZmMTFmIDEwMDY0NAotLS0gYS9zcmMvcG9ydC9wZ21rZGlycC5jCisrKyBi L3NyYy9wb3J0L3BnbWtkaXJwLmMKQEAgLTU2LDcgKzU2LDkgQEAKIGludAogcGdfbWtkaXJf cChjaGFyICpwYXRoLCBpbnQgb21vZGUpCiB7CisjaWZuZGVmIFdJTjMyCiAJc3RydWN0IHN0 YXQgc2I7CisjZW5kaWYKIAltb2RlX3QJCW51bWFzaywKIAkJCQlvdW1hc2s7CiAJaW50CQkJ bGFzdCwKQEAgLTExOSw2ICsxMjEsNDIgQEAgcGdfbWtkaXJfcChjaGFyICpwYXRoLCBpbnQg b21vZGUpCiAJCWlmIChsYXN0KQogCQkJKHZvaWQpIHVtYXNrKG91bWFzayk7CiAKKyNpZmRl ZiBXSU4zMgorCQl7CisJCQkvKgorCQkJICogT24gV2luZG93cywgc3RhdCgpIG9wZW5zIGEg aGFuZGxlIGFuZCBjYW4gdHJhbnNpZW50bHkgZmFpbCBvbiBhCisJCQkgKiBkaXJlY3Rvcnkg YW5vdGhlciBwcm9jZXNzIGlzIGNvbmN1cnJlbnRseSBjcmVhdGluZy4gIFByb2JlIHdpdGgK KwkJCSAqIGEgcGF0aC1iYXNlZCBhdHRyaWJ1dGUgcXVlcnkgaW5zdGVhZDogaXQgcmVxdWVz dHMgb25seQorCQkJICogRklMRV9SRUFEX0FUVFJJQlVURVMgYW5kIGlzIGV4ZW1wdCBmcm9t IHNoYXJlLW1vZGUgZGVuaWFsLCBzbyBpdAorCQkJICogcmVsaWFibHkgc2VlcyBhIGNvbmN1 cnJlbnRseS1jcmVhdGVkIGRpcmVjdG9yeS4KKwkJCSAqLworCQkJRFdPUkQJCWF0dHIgPSBH ZXRGaWxlQXR0cmlidXRlcyhwYXRoKTsKKworCQkJaWYgKGF0dHIgIT0gSU5WQUxJRF9GSUxF X0FUVFJJQlVURVMpCisJCQl7CisJCQkJLyogcHJlLWV4aXN0aW5nIGVudHJ5ICovCisJCQkJ aWYgKCEoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisJCQkJeworCQkJCQll cnJubyA9IGxhc3QgPyBFRVhJU1QgOiBFTk9URElSOworCQkJCQlyZXR2YWwgPSAtMTsKKwkJ CQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGFscmVhZHkgYSBkaXJlY3Rvcnk6IG5vdGhpbmcg dG8gZG8sIGZhbGwgdGhyb3VnaCAqLworCQkJfQorCQkJZWxzZSBpZiAobWtkaXIocGF0aCwg bGFzdCA/IG9tb2RlIDogU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKSA8IDApCisJCQl7 CisJCQkJLyogdG9sZXJhdGUgYSBjb25jdXJyZW50IGNyZWF0aW9uOyByZS1wcm9iZSB0aGUg c2FtZSB3YXkgKi8KKwkJCQlhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aCk7CisJCQkJ aWYgKGVycm5vICE9IEVFWElTVCB8fAorCQkJCQlhdHRyID09IElOVkFMSURfRklMRV9BVFRS SUJVVEVTIHx8CisJCQkJCSEoYXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisJ CQkJeworCQkJCQlyZXR2YWwgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9 CisjZWxzZQogCQkvKiBjaGVjayBmb3IgcHJlLWV4aXN0aW5nIGRpcmVjdG9yeSAqLwogCQlp ZiAoc3RhdChwYXRoLCAmc2IpID09IDApCiAJCXsKQEAgLTEzNCw5ICsxNzIsMTkgQEAgcGdf bWtkaXJfcChjaGFyICpwYXRoLCBpbnQgb21vZGUpCiAJCX0KIAkJZWxzZSBpZiAobWtkaXIo cGF0aCwgbGFzdCA/IG9tb2RlIDogU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKSA8IDAp CiAJCXsKLQkJCXJldHZhbCA9IC0xOwotCQkJYnJlYWs7CisJCQkvKgorCQkJICogVG9sZXJh dGUgYSBjb25jdXJyZW50IGNyZWF0aW9uOiBhbm90aGVyIHByb2Nlc3MgbWF5IGhhdmUKKwkJ CSAqIGNyZWF0ZWQgdGhlIGRpcmVjdG9yeSBpbiB0aGUgd2luZG93IGJldHdlZW4gdGhlIHN0 YXQoKSBhYm92ZQorCQkJICogYW5kIHRoaXMgbWtkaXIoKS4gIE9ubHkgdHJlYXQgaXQgYXMg YW4gZXJyb3IgaWYgdGhlIHBhdGggc3RpbGwKKwkJCSAqIGlzIG5vdCBhIGRpcmVjdG9yeS4K KwkJCSAqLworCQkJaWYgKGVycm5vICE9IEVFWElTVCB8fCBzdGF0KHBhdGgsICZzYikgIT0g MCB8fCAhU19JU0RJUihzYi5zdF9tb2RlKSkKKwkJCXsKKwkJCQlyZXR2YWwgPSAtMTsKKwkJ CQlicmVhazsKKwkJCX0KIAkJfQorI2VuZGlmCiAJCWlmICghbGFzdCkKIAkJCSpwID0gJy8n OwogCX0KLS0gCjIuNDMuMAoK --------------BR1ttoiWFK4saGSxAIYyIGYH--