Skip to content

Commit a586cc4

Browse files
committed
Use a fd opened for read/write when syncing slots during startup, take 2.
Cribbing from dfbaed4: Some operating systems, including the reporter's windows, return EBADFD or similar when fsync() is invoked on a O_RDONLY file descriptor. Unfortunately RestoreSlotFromDisk() does exactly that; which causes failures after restarts in at least some scenarios. If you hit the bug the error message will be something like ERROR: could not fsync file "pg_replslot/$name/state": Bad file descriptor Simply use O_RDWR instead of O_RDONLY when opening the relevant file descriptor to fix the bug. Unfortunately this fix was undone in 82a5649. Re-apply, and add a comment. Bug: 16039 Reported-By: Hans Buschmann Author: Andres Freund Discussion: https://postgr.es/m/16039-196fc97cc05e141c@postgresql.org Backpatch: 12-, as 82a5649
1 parent ad7595b commit a586cc4

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

src/backend/replication/slot.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1386,7 +1386,8 @@ RestoreSlotFromDisk(const char *name)
13861386

13871387
elog(DEBUG1, "restoring replication slot from \"%s\"", path);
13881388

1389-
fd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
1389+
/* on some operating systems fsyncing a file requires O_RDWR */
1390+
fd = OpenTransientFile(path, O_RDWR | PG_BINARY);
13901391

13911392
/*
13921393
* We do not need to handle this as we are rename()ing the directory into

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy