Replace O_EXCL with O_TRUNC for creation of state.tmp in SaveSlotToPath - Mailing list pgsql-hackers

From Kevin K Biju
Subject Replace O_EXCL with O_TRUNC for creation of state.tmp in SaveSlotToPath
Date
Msg-id CAM45KeHa32soKL_G8Vk38CWvTBeOOXcsxAPAs7Jt7yPRf2mbVA@mail.gmail.com
Whole thread Raw
List pgsql-hackers
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  
Attachment

pgsql-hackers by date:

Previous
From: Álvaro Herrera
Date:
Subject: Re: anonymous unions (C11)
Next
From: Dilip Kumar
Date:
Subject: Re: pgstattuple "unexpected zero page" for gist and hash indexes