0001-Fix-read_relmap_file-concurrency-on-Windows.patch
text/x-patch
Filename: 0001-Fix-read_relmap_file-concurrency-on-Windows.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Fix read_relmap_file() concurrency on Windows.
| File | + | − |
|---|---|---|
| src/backend/utils/cache/relmapper.c | 10 | 10 |
From c4f52c8cabb35d7db6d24681227146a195688c39 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Wed, 27 Jul 2022 18:01:12 +1200
Subject: [PATCH] Fix read_relmap_file() concurrency on Windows.
Commit d8cd0c6c introduced a file rename that could fail on Windows due
to other backends reading an old file of the same name. Re-arrange the
locking slightly to prevent that.
Discussion: https://postgr.es/m/CA%2BhUKGLZtCTgp4NTWV-wGbR2Nyag71%3DEfYTKjDKnk%2BfkhuFMHw%40mail.gmail.com
---
src/backend/utils/cache/relmapper.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c
index 79e09181b6..4562a0ad6f 100644
--- a/src/backend/utils/cache/relmapper.c
+++ b/src/backend/utils/cache/relmapper.c
@@ -788,16 +788,6 @@ read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held, int elevel)
Assert(elevel >= ERROR);
- /* Open the target file. */
- snprintf(mapfilename, sizeof(mapfilename), "%s/%s", dbpath,
- RELMAPPER_FILENAME);
- fd = OpenTransientFile(mapfilename, O_RDONLY | PG_BINARY);
- if (fd < 0)
- ereport(elevel,
- (errcode_for_file_access(),
- errmsg("could not open file \"%s\": %m",
- mapfilename)));
-
/*
* Grab the lock to prevent the file from being updated while we read it,
* unless the caller is already holding the lock. If the file is updated
@@ -808,6 +798,16 @@ read_relmap_file(RelMapFile *map, char *dbpath, bool lock_held, int elevel)
if (!lock_held)
LWLockAcquire(RelationMappingLock, LW_SHARED);
+ /* Open the target file. */
+ snprintf(mapfilename, sizeof(mapfilename), "%s/%s", dbpath,
+ RELMAPPER_FILENAME);
+ fd = OpenTransientFile(mapfilename, O_RDONLY | PG_BINARY);
+ if (fd < 0)
+ ereport(elevel,
+ (errcode_for_file_access(),
+ errmsg("could not open file \"%s\": %m",
+ mapfilename)));
+
/* Now read the data. */
pgstat_report_wait_start(WAIT_EVENT_RELATION_MAP_READ);
r = read(fd, map, sizeof(RelMapFile));
--
2.35.1