agora inbox for [email protected]
help / color / mirror / Atom feedFrom: Kyotaro Horiguchi <[email protected]>
Subject: [PATCH v2 2/2] Forcibly initialize lastRemovedSegNo at the first checkpoint
Date: Thu, 18 Jun 2020 14:49:48 +0900
If we have a replication slot retaining all existing WAL segments, a
checkpoint doesn't initialize lastRemovedSegNo. That means
pg_replication_slots can not show min_safe_lsn until any slot loses a
segment. Forcibly initialize it even if no WAL segments are removed at
the first checkpoint.
---
src/backend/access/transam/xlog.c | 33 +++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 940f5fcb18..282bac32ab 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -4025,6 +4025,16 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr)
DIR *xldir;
struct dirent *xlde;
char lastoff[MAXFNAMELEN];
+ char oldest[MAXFNAMELEN];
+ bool remember_oldest = false;
+
+ /*
+ * If we haven't set the initial last removed segno, force to set it even
+ * if we wouldn't have removed any segments.
+ */
+ oldest[0] = 0;
+ if (XLogGetLastRemovedSegno() == 0)
+ remember_oldest = true;
/*
* Construct a filename of the last segment to be kept. The timeline ID
@@ -4062,10 +4072,33 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr)
{
/* Update the last removed location in shared memory first */
UpdateLastRemovedPtr(xlde->d_name);
+ remember_oldest = false;
RemoveXlogFile(xlde->d_name, lastredoptr, endptr);
}
}
+ /* Remember the oldest file left in the directotry */
+ else if(remember_oldest &&
+ (oldest[0] == 0 || strcmp(xlde->d_name + 8, oldest + 8) < 0))
+ strncpy(oldest, xlde->d_name, MAXFNAMELEN);
+ }
+
+ /*
+ * We haven't initialize the pointer, initialize it.
+ * The last removed pointer is the oldest existing segment minus 1.
+ */
+ if (remember_oldest && oldest[0] != 0)
+ {
+ uint32 tli;
+ XLogSegNo segno;
+
+ XLogFromFileName(oldest, &tli, &segno, wal_segment_size);
+
+ if (segno > 1)
+ {
+ XLogFileName(oldest, tli, segno - 1, wal_segment_size);
+ UpdateLastRemovedPtr(oldest);
+ }
}
FreeDir(xldir);
--
2.18.4
----Next_Part(Thu_Jun_18_15_22_16_2020_362)----
view thread (2+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v2 2/2] Forcibly initialize lastRemovedSegNo at the first checkpoint
In-Reply-To: <no-message-id-190725@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox