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.94.2) (envelope-from ) id 1v3YtA-000Uoj-O4 for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Sep 2025 11:51:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v3Yt8-009Dbu-H9 for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Sep 2025 11:51:23 +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.94.2) (envelope-from ) id 1v3Yt8-009Dbk-6o for pgsql-hackers@lists.postgresql.org; Tue, 30 Sep 2025 11:51:22 +0000 Received: from mail-pg1-x536.google.com ([2607:f8b0:4864:20::536]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v3Yt6-000tOa-1Z for pgsql-hackers@lists.postgresql.org; Tue, 30 Sep 2025 11:51:22 +0000 Received: by mail-pg1-x536.google.com with SMTP id 41be03b00d2f7-b5516ee0b0bso4184707a12.1 for ; Tue, 30 Sep 2025 04:51:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759233077; x=1759837877; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=8Al+AZDTIyUyecEGgmzzfC+a75xwCYV4nRHJkBCYthw=; b=PMzgAzWsOaeMvjntIf+xwhXJcgUrDzOVjPLJZuQ6Ub47doVViSWvP/8qfC8ThJTmPK XROKeOevIsxPzFquxba9lchmca3UXO3LHFbzOhAHpfO4XxiuU+LaEyWBkGJVQUKbK/nw uCLL12MujfuulKgGML+4JjWpicHNRVvcgCuzqb1fRt7BeObW9sHtI+OfGrSDlaEQgkba 0D7vXaweLKW474yUZ1Zw9hSWLmwY3DVXx5g50Itnm2lilGg8va+/icK+7MpD7y+79ECb 9fuAnAh33Xg0QhNy69lQS3K7Uci+5snt4TSoer7DpB3YqI/g5tmaRyqDBimrpEnI1bhR nUgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759233077; x=1759837877; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=8Al+AZDTIyUyecEGgmzzfC+a75xwCYV4nRHJkBCYthw=; b=j/hji2cFBCb7/cwDamI43RXVZpQTDFWpuym9E3l7t/jRUawo+pwM9amwlRlE397JYU Bm3aMr00F10+y5r8Pu3kaaXpIGDjKBv41Fx/V8hAKODzFyIy4/kdNHJd6hfvc/pI3XvJ lerIGBhixY5ii5xnzTKAuDhMMJOBO7iC/k0Ln8MSF+GYJH/zhRZy5TQv9z1ieyoebZpS FELPF5Hnw7kWMuYu2aXOq3zBjJsl87XZebgvYnxUWgKxE/oG9GDC65ON4V/r40git/q0 Ia00VFElgR+Xr0EqIjRLzzz6uUZ8NalSA4AO3X/7xrwpO5fV7M8jfvTqi8b6kgtkVz9Z Yv9g== X-Gm-Message-State: AOJu0YzcZHkvKsi9Om3vi80t3HIjsjEAVcAPVStlnseD7o6fH1P7WceH KC7hKr3OF//5CZvGGooJc7P8db+LnA2hYiLUJQfD0p9ziA/qJSRyHGnV1p+GhQa6XomC+/KnXQX KJqc78uozJgbnerdQleivuSZx1xq0H+lRB18u1sEjNA== X-Gm-Gg: ASbGncuabQxtRFuyY97Y1XNBzKqiT396L35+Zp0CqtF2lXYY5jzjnsUnU9uclcfJJJt dNDbPAiz4FL05von/CKVJuxrde7SLNbFN4/iVSnDndgpddsC6tgjCQQ1c9pwctbEPOwvWWEdzJR csl+yzUudU/AgdtsQqOvulLvx7IXZuRM1ffpg7RbBNff+ivDpDqYToM/bLQzNQXaSOzckXtpDCv EC6jtw0gwJctmCISAo7sqlMwsssM+4lbipmOWI4w14g44ShpDgWfPRJFlCqe9CnN5maG6NhK2Aq QQdM5hoJ X-Google-Smtp-Source: AGHT+IFzO3vZxk7NL9ntCaxYut1vMr/PmYBkBt7+mMmDhgu9IauvUJq1CpI0kiRmgnE8oCYE1edES04LhIUamBlDpG0= X-Received: by 2002:a17:902:dace:b0:24a:fab6:d15a with SMTP id d9443c01a7336-27ed49ff533mr229418555ad.20.1759233077323; Tue, 30 Sep 2025 04:51:17 -0700 (PDT) MIME-Version: 1.0 From: Kevin K Biju Date: Tue, 30 Sep 2025 17:21:05 +0530 X-Gm-Features: AS18NWBrJsALvX4AQsDT9Aveox-Zfs4MNvzkTC-mzvS830XaSlCj6YVAX-yizlk Message-ID: Subject: Replace O_EXCL with O_TRUNC for creation of state.tmp in SaveSlotToPath To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000a6c2690640035e90" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a6c2690640035e90 Content-Type: multipart/alternative; boundary="000000000000a6c2680640035e8e" --000000000000a6c2680640035e8e Content-Type: text/plain; charset="UTF-8" Hi, We have encountered a few instances where logical replication errors out during SaveSlotToPath() after creating the state.tmp file, but before it was renamed (due to ENOSPC, for example). In these cases, since state.tmp is not cleaned up and is created with the O_EXCL flag, further invocations of SaveSlotToPath() for this slot will error out on OpenTransientFile() with EEXIST, completely blocking slot metadata persistence. The only explicit cleanup for state.tmp occurs during server startup as part of RestoreSlotFromDisk(). It doesn't seem that this function relies on data written to state.tmp previously, so O_EXCL is unnecessary. Attaching a patch that swaps O_EXCL for O_TRUNC, ensuring a fresh state.tmp is available for writing. Thanks, Kevin --000000000000a6c2680640035e8e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

We have encountered a few instances where logic= al replication errors out during SaveSlotToPath() after creating the state.= tmp file, but before it was renamed (due to ENOSPC, for example). In these = cases, since state.tmp is not cleaned up and is created with the O_EXCL fla= g, further invocations of SaveSlotToPath() for this slot will error out on = OpenTransientFile() with EEXIST, completely blocking slot metadata persiste= nce. The only explicit cleanup for state.tmp occurs during server startup a= s part of RestoreSlotFromDisk().

It doesn't seem that this funct= ion relies on data written to state.tmp previously, so O_EXCL is unnecessar= y. Attaching a patch that swaps O_EXCL for O_TRUNC, ensuring a fresh state.= tmp is available for writing.=C2=A0

Thanks,
Kevin =C2=A0
--000000000000a6c2680640035e8e-- --000000000000a6c2690640035e90 Content-Type: application/octet-stream; name="replslot_state_tmp_otrunc.patch" Content-Disposition: attachment; filename="replslot_state_tmp_otrunc.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mg6gzcj40 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYyBiL3NyYy9iYWNrZW5k L3JlcGxpY2F0aW9uL3Nsb3QuYwppbmRleCBmZDBmZGI5NmQ0Mi4uZWRkOWY4NDRmMjMgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYworKysgYi9zcmMvYmFja2VuZC9y ZXBsaWNhdGlvbi9zbG90LmMKQEAgLTIzMzIsNyArMjMzMiw3IEBAIFNhdmVTbG90VG9QYXRoKFJl cGxpY2F0aW9uU2xvdCAqc2xvdCwgY29uc3QgY2hhciAqZGlyLCBpbnQgZWxldmVsKQogCXNwcmlu dGYodG1wcGF0aCwgIiVzL3N0YXRlLnRtcCIsIGRpcik7CiAJc3ByaW50ZihwYXRoLCAiJXMvc3Rh dGUiLCBkaXIpOwogCi0JZmQgPSBPcGVuVHJhbnNpZW50RmlsZSh0bXBwYXRoLCBPX0NSRUFUIHwg T19FWENMIHwgT19XUk9OTFkgfCBQR19CSU5BUlkpOworCWZkID0gT3BlblRyYW5zaWVudEZpbGUo dG1wcGF0aCwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSB8IFBHX0JJTkFSWSk7CiAJaWYg KGZkIDwgMCkKIAl7CiAJCS8qCg== --000000000000a6c2690640035e90--