Skip to content

Commit 421484f

Browse files
committed
Remove XLogFileInit() ability to unlink a pre-existing file.
Only initdb used it. initdb refuses to operate on a non-empty directory and generally does not cope with pre-existing files of other kinds. Hence, use the opportunity to simplify. Discussion: https://postgr.es/m/20210202151416.GB3304930@rfd.leadboat.com
1 parent 85656bc commit 421484f

File tree

3 files changed

+28
-40
lines changed

3 files changed

+28
-40
lines changed

src/backend/access/transam/xlog.c

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,7 +2424,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
24242424
bool ispartialpage;
24252425
bool last_iteration;
24262426
bool finishing_seg;
2427-
bool use_existent;
2427+
bool added;
24282428
int curridx;
24292429
int npages;
24302430
int startidx;
@@ -2490,8 +2490,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
24902490
wal_segment_size);
24912491

24922492
/* create/use new log file */
2493-
use_existent = true;
2494-
openLogFile = XLogFileInit(openLogSegNo, &use_existent);
2493+
openLogFile = XLogFileInit(openLogSegNo, &added);
24952494
ReserveExternalFD();
24962495
}
24972496

@@ -3260,9 +3259,7 @@ XLogNeedsFlush(XLogRecPtr record)
32603259
*
32613260
* logsegno: identify segment to be created/opened.
32623261
*
3263-
* *use_existent: if true, OK to use a pre-existing file (else, any
3264-
* pre-existing file will be deleted). On return, false iff this call added
3265-
* some segment on disk.
3262+
* *added: on return, true if this call raised the number of extant segments.
32663263
*
32673264
* Returns FD of opened file.
32683265
*
@@ -3272,7 +3269,7 @@ XLogNeedsFlush(XLogRecPtr record)
32723269
* in a critical section.
32733270
*/
32743271
int
3275-
XLogFileInit(XLogSegNo logsegno, bool *use_existent)
3272+
XLogFileInit(XLogSegNo logsegno, bool *added)
32763273
{
32773274
char path[MAXPGPATH];
32783275
char tmppath[MAXPGPATH];
@@ -3287,19 +3284,17 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
32873284
/*
32883285
* Try to use existent file (checkpoint maker may have created it already)
32893286
*/
3290-
if (*use_existent)
3287+
*added = false;
3288+
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
3289+
if (fd < 0)
32913290
{
3292-
fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method));
3293-
if (fd < 0)
3294-
{
3295-
if (errno != ENOENT)
3296-
ereport(ERROR,
3297-
(errcode_for_file_access(),
3298-
errmsg("could not open file \"%s\": %m", path)));
3299-
}
3300-
else
3301-
return fd;
3291+
if (errno != ENOENT)
3292+
ereport(ERROR,
3293+
(errcode_for_file_access(),
3294+
errmsg("could not open file \"%s\": %m", path)));
33023295
}
3296+
else
3297+
return fd;
33033298

33043299
/*
33053300
* Initialize an empty (all zeroes) segment. NOTE: it is possible that
@@ -3412,12 +3407,9 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
34123407
errmsg("could not close file \"%s\": %m", tmppath)));
34133408

34143409
/*
3415-
* Now move the segment into place with its final name.
3416-
*
3417-
* If caller didn't want to use a pre-existing file, get rid of any
3418-
* pre-existing file. Otherwise, cope with possibility that someone else
3419-
* has created the file while we were filling ours: if so, use ours to
3420-
* pre-create a future log segment.
3410+
* Now move the segment into place with its final name. Cope with
3411+
* possibility that someone else has created the file while we were
3412+
* filling ours: if so, use ours to pre-create a future log segment.
34213413
*/
34223414
installed_segno = logsegno;
34233415

@@ -3431,9 +3423,8 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent)
34313423
* CheckPointSegments.
34323424
*/
34333425
max_segno = logsegno + CheckPointSegments;
3434-
if (InstallXLogFileSegment(&installed_segno, tmppath,
3435-
*use_existent, max_segno))
3436-
*use_existent = false;
3426+
if (InstallXLogFileSegment(&installed_segno, tmppath, true, max_segno))
3427+
*added = true;
34373428
else
34383429
{
34393430
/*
@@ -3918,18 +3909,17 @@ PreallocXlogFiles(XLogRecPtr endptr)
39183909
{
39193910
XLogSegNo _logSegNo;
39203911
int lf;
3921-
bool use_existent;
3912+
bool added;
39223913
uint64 offset;
39233914

39243915
XLByteToPrevSeg(endptr, _logSegNo, wal_segment_size);
39253916
offset = XLogSegmentOffset(endptr - 1, wal_segment_size);
39263917
if (offset >= (uint32) (0.75 * wal_segment_size))
39273918
{
39283919
_logSegNo++;
3929-
use_existent = true;
3930-
lf = XLogFileInit(_logSegNo, &use_existent);
3920+
lf = XLogFileInit(_logSegNo, &added);
39313921
close(lf);
3932-
if (!use_existent)
3922+
if (added)
39333923
CheckpointStats.ckpt_segs_added++;
39343924
}
39353925
}
@@ -5224,7 +5214,7 @@ BootStrapXLOG(void)
52245214
XLogLongPageHeader longpage;
52255215
XLogRecord *record;
52265216
char *recptr;
5227-
bool use_existent;
5217+
bool added;
52285218
uint64 sysidentifier;
52295219
struct timeval tv;
52305220
pg_crc32c crc;
@@ -5321,8 +5311,7 @@ BootStrapXLOG(void)
53215311
record->xl_crc = crc;
53225312

53235313
/* Create first XLOG segment file */
5324-
use_existent = false;
5325-
openLogFile = XLogFileInit(1, &use_existent);
5314+
openLogFile = XLogFileInit(1, &added);
53265315

53275316
/*
53285317
* We needn't bother with Reserve/ReleaseExternalFD here, since we'll
@@ -5628,10 +5617,10 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog)
56285617
* The switch happened at a segment boundary, so just create the next
56295618
* segment on the new timeline.
56305619
*/
5631-
bool use_existent = true;
5620+
bool added;
56325621
int fd;
56335622

5634-
fd = XLogFileInit(startLogSegNo, &use_existent);
5623+
fd = XLogFileInit(startLogSegNo, &added);
56355624

56365625
if (close(fd) != 0)
56375626
{

src/backend/replication/walreceiver.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
885885

886886
if (recvFile < 0 || !XLByteInSeg(recptr, recvSegNo, wal_segment_size))
887887
{
888-
bool use_existent;
888+
bool added;
889889

890890
/*
891891
* fsync() and close current file before we switch to next one. We
@@ -923,8 +923,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
923923

924924
/* Create/use new log file */
925925
XLByteToSeg(recptr, recvSegNo, wal_segment_size);
926-
use_existent = true;
927-
recvFile = XLogFileInit(recvSegNo, &use_existent);
926+
recvFile = XLogFileInit(recvSegNo, &added);
928927
recvFileTLI = ThisTimeLineID;
929928
}
930929

src/include/access/xlog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata,
296296
extern void XLogFlush(XLogRecPtr RecPtr);
297297
extern bool XLogBackgroundFlush(void);
298298
extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
299-
extern int XLogFileInit(XLogSegNo segno, bool *use_existent);
299+
extern int XLogFileInit(XLogSegNo segno, bool *added);
300300
extern int XLogFileOpen(XLogSegNo segno);
301301

302302
extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);

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