agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH 2/2] Simplify XLogReader's open_segment API 25+ messages / 3 participants [nested] [flat]
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* [PATCH 2/2] Simplify XLogReader's open_segment API @ 2020-05-08 21:03 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: Alvaro Herrera @ 2020-05-08 21:03 UTC (permalink / raw) Instead of returning the file descriptor, install it directly in XLogReaderState->seg.ws_file. --- src/backend/access/transam/xlogreader.c | 4 ++-- src/backend/access/transam/xlogutils.c | 32 ++++++++++++------------- src/backend/replication/walsender.c | 12 ++++------ src/bin/pg_waldump/pg_waldump.c | 9 ++++--- src/include/access/xlogreader.h | 12 +++++----- src/include/access/xlogutils.h | 2 +- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index f42dee2640..a533241370 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1092,8 +1092,8 @@ WALRead(XLogReaderState *state, state->routine.segment_close(state); XLByteToSeg(recptr, nextSegNo, state->segcxt.ws_segsize); - state->seg.ws_file = state->routine.segment_open(state, nextSegNo, - &state->segcxt, &tli); + state->routine.segment_open(state, nextSegNo, &state->segcxt, &tli); + Assert(state->seg.ws_file >= 0); /* shouldn't happen */ /* Update the current segment info. */ state->seg.ws_tli = tli; diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index fc0bb7d059..1cc2c624a4 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -784,7 +784,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa } /* XLogReaderRoutine->segment_open callback for local pg_wal files */ -int +void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { @@ -793,22 +793,20 @@ wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, int fd; XLogFilePath(path, tli, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; - - if (errno == ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("requested WAL segment %s has already been removed", - path))); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", - path))); - - return -1; /* keep compiler quiet */ + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file < 0) + { + if (errno == ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + } } /* stock XLogReaderRoutine->segment_close callback */ diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index ed8c08cb6a..b9f029d44f 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -248,7 +248,7 @@ static void LagTrackerWrite(XLogRecPtr lsn, TimestampTz local_flush_time); static TimeOffset LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now); static bool TransactionIdInRecentPast(TransactionId xid, uint32 epoch); -static int WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); static void UpdateSpillStats(LogicalDecodingContext *ctx); @@ -2445,13 +2445,12 @@ WalSndKill(int code, Datum arg) } /* XLogReaderRoutine->segment_open callback */ -static int +static void WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) { char path[MAXPGPATH]; - int fd; /*------- * When reading from a historic timeline, and there is a timeline switch @@ -2488,9 +2487,9 @@ WalSndSegmentOpen(XLogReaderState *state, } XLogFilePath(path, *tli_p, nextSegNo, segcxt->ws_segsize); - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - return fd; + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + return; /* * If the file is not found, assume it's because the standby asked for a @@ -2513,7 +2512,6 @@ WalSndSegmentOpen(XLogReaderState *state, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", path))); - return -1; /* keep compiler quiet */ } /* diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 46734914b7..1a5c5a157c 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -280,7 +280,7 @@ identify_target_directory(char *directory, char *fname) } /* pg_waldump's XLogReaderRoutine->segment_open callback */ -static int +static void WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p) @@ -300,9 +300,9 @@ WALDumpOpenSegment(XLogReaderState *state, */ for (tries = 0; tries < 10; tries++) { - fd = open_file_in_directory(segcxt->ws_dir, fname); - if (fd >= 0) - return fd; + state->seg.ws_file = open_file_in_directory(segcxt->ws_dir, fname); + if (state->seg.ws_file >= 0) + return; if (errno == ENOENT) { int save_errno = errno; @@ -318,7 +318,6 @@ WALDumpOpenSegment(XLogReaderState *state, } fatal_error("could not find file \"%s\": %m", fname); - return -1; /* keep compiler quiet */ } /* diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index e77f478d68..b73df02218 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -63,10 +63,10 @@ typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader, int reqLen, XLogRecPtr targetRecPtr, char *readBuf); -typedef int (*WALSegmentOpenCB) (XLogReaderState *xlogreader, - XLogSegNo nextSegNo, - WALSegmentContext *segcxt, - TimeLineID *tli_p); +typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader, + XLogSegNo nextSegNo, + WALSegmentContext *segcxt, + TimeLineID *tli_p); typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader); typedef struct XLogReaderRoutine @@ -94,8 +94,8 @@ typedef struct XLogReaderRoutine XLogPageReadCB page_read; /* - * Callback to open the specified WAL segment for reading. The file - * descriptor of the opened segment shall be returned. In case of + * Callback to open the specified WAL segment for reading. ->seg.ws_file + * shall be set to the file descriptor of the opened segment. In case of * failure, an error shall be raised by the callback and it shall not * return. * diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 68ce815476..b7bdc5db34 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -50,7 +50,7 @@ extern void FreeFakeRelcacheEntry(Relation fakerel); extern int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page); -extern int wal_segment_open(XLogReaderState *state, +extern void wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, WALSegmentContext *segcxt, TimeLineID *tli_p); -- 2.20.1 --/04w6evG8XlLl3ft-- ^ permalink raw reply [nested|flat] 25+ messages in thread
* Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE @ 2024-04-01 13:41 vignesh C <[email protected]> 0 siblings, 1 reply; 25+ messages in thread From: vignesh C @ 2024-04-01 13:41 UTC (permalink / raw) To: Masahiko Sawada <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]> On Thu, 28 Mar 2024 at 13:05, Masahiko Sawada <[email protected]> wrote: > > Hi, > > Thank you for the patch! > > On Mon, Jul 3, 2023 at 12:12 AM vignesh C <[email protected]> wrote: > > > > Hi, > > > > Improved tab completion for "ALTER DEFAULT PRIVILEGE" and "ALTER TABLE": > > 1) GRANT, REVOKE and FOR USER keyword was not displayed in tab > > completion of alter default privileges like the below statement: > > ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; > > ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; > > ALTER DEFAULT PRIVILEGES FOR USER vignesh revoke INSERT ON tables FROM dba1; > > +1 > > > > > 2) USER was not displayed for "ALTER DEFAULT PRIVILEGES IN SCHEMA > > public FOR " like in below statement: > > ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR USER dba1 GRANT INSERT > > ON TABLES TO PUBLIC; > > Since there is no difference FOR USER and FOR ROLE, I'm not sure we > really want to support both in tab-completion. I have removed this change > > > > 3) "FOR GRANT OPTION" was not display for "ALTER DEFAULT PRIVILEGES > > REVOKE " like in below statement: > > alter default privileges revoke grant option for select ON tables FROM dba1; > > +1. But the v3 patch doesn't cover the following case: > > =# alter default privileges for role masahiko revoke [tab] > ALL CREATE DELETE EXECUTE INSERT MAINTAIN > REFERENCES SELECT TRIGGER TRUNCATE UPDATE USAGE Modified in the updated patch > And it doesn't cover MAINTAIN neither: > > =# alter default privileges revoke [tab] > ALL DELETE GRANT OPTION FOR REFERENCES > TRIGGER UPDATE > CREATE EXECUTE INSERT SELECT > TRUNCATE USAGE Modified in the updated patch > The patch adds the completions for ALTER DEFAULT PRIVILEGES REVOKE, > but we handle such case in GRANT and REVOKE part: > > (around L3958) > /* > * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable > * privileges (can't grant roles) > */ > if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) > COMPLETE_WITH("SELECT", "INSERT", "UPDATE", > "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", > "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); The current patch handles the fix from here now. > Also, I think we can support WITH GRANT OPTION too. For example, > > =# alter default privileges for role masahiko grant all on tables to > public [tab] I have handled this in the updated patch > It's already supported in the GRANT statement. > > > > > 4) "DATA TYPE" was missing in "ALTER TABLE table-name ALTER COLUMN > > column-name SET" like in: > > ALTER TABLE t1 ALTER COLUMN c1 SET DATA TYPE text; > > > > +1. The patch looks good to me, so pushed. Thanks for committing this. The updated patch has the changes for the above comments. Regards, Vignesh Attachments: [application/x-patch] v4-0001-Fix-missing-tab-completion-in-ALTER-DEFAULT-PRIVI.patch (3.1K, ../../CALDaNm0LwarKqtyuWQFyvP4h1H8FwkVg3MzSXYFCWgwkU2XdRA@mail.gmail.com/2-v4-0001-Fix-missing-tab-completion-in-ALTER-DEFAULT-PRIVI.patch) download | inline diff: From 7c3bbfb0c8c17bf5d4a7e2ce579d00b811844a06 Mon Sep 17 00:00:00 2001 From: Vignesh C <[email protected]> Date: Sun, 2 Jul 2023 19:35:46 +0530 Subject: [PATCH v4] Fix missing tab completion in "ALTER DEFAULT PRIVILEGES" GRANT, REVOKE and FOR USER keyword was not displayed in tab completion of "ALTER DEFAULT PRIVILEGES" like the below statements: ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR USER testdba REVOKE INSERT ON tables FROM testdba; "GRANT OPTION OPTION" was not displayed in tab completion of "ALTER DEFAULT PRIVILEGES REVOKE " like in below statement: ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON tables FROM testdba; "WITH GRANT OPTION" was not completed in tab completion of "ALTER DEFAULT PRIVILEGES ... GRANT ... to role" like in below statement: ALTER DEFAULT PRIVILEGES FOR ROLE testdba1 GRANT ALL ON tables to testdba2 WITH GRANT OPTION; --- src/bin/psql/tab-complete.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 82eb3955ab..620628948a 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2147,7 +2147,7 @@ psql_completion(const char *text, int start, int end) /* ALTER DEFAULT PRIVILEGES */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("FOR ROLE", "IN SCHEMA"); + COMPLETE_WITH("FOR", "GRANT", "IN SCHEMA", "REVOKE"); /* ALTER DEFAULT PRIVILEGES FOR */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR")) COMPLETE_WITH("ROLE"); @@ -3949,9 +3949,17 @@ psql_completion(const char *text, int start, int end) * privileges (can't grant roles) */ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("SELECT", "INSERT", "UPDATE", - "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", - "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + { + if (TailMatches("GRANT")) + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + else + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", + "GRANT OPTION FOR", "ALL"); + } else if (TailMatches("GRANT")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Privilege_options_of_grant_and_revoke); @@ -4133,6 +4141,10 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Keywords_for_list_of_grant_roles); + /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT ... TO ROLE */ + else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && + TailMatches("GRANT", MatchAny, MatchAny, MatchAny, "TO", MatchAny)) + COMPLETE_WITH("WITH GRANT OPTION"); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny)) COMPLETE_WITH("TO"); -- 2.34.1 ^ permalink raw reply [nested|flat] 25+ messages in thread
* Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE @ 2024-04-02 07:38 Masahiko Sawada <[email protected]> parent: vignesh C <[email protected]> 0 siblings, 1 reply; 25+ messages in thread From: Masahiko Sawada @ 2024-04-02 07:38 UTC (permalink / raw) To: vignesh C <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]> On Mon, Apr 1, 2024 at 10:41 PM vignesh C <[email protected]> wrote: > > On Thu, 28 Mar 2024 at 13:05, Masahiko Sawada <[email protected]> wrote: > > > > Hi, > > > > Thank you for the patch! > > > > On Mon, Jul 3, 2023 at 12:12 AM vignesh C <[email protected]> wrote: > > > > > > Hi, > > > > > > Improved tab completion for "ALTER DEFAULT PRIVILEGE" and "ALTER TABLE": > > > 1) GRANT, REVOKE and FOR USER keyword was not displayed in tab > > > completion of alter default privileges like the below statement: > > > ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; > > > ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; > > > ALTER DEFAULT PRIVILEGES FOR USER vignesh revoke INSERT ON tables FROM dba1; > > > > +1 > > > > > > > > 2) USER was not displayed for "ALTER DEFAULT PRIVILEGES IN SCHEMA > > > public FOR " like in below statement: > > > ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR USER dba1 GRANT INSERT > > > ON TABLES TO PUBLIC; > > > > Since there is no difference FOR USER and FOR ROLE, I'm not sure we > > really want to support both in tab-completion. > > I have removed this change > > > > > > > 3) "FOR GRANT OPTION" was not display for "ALTER DEFAULT PRIVILEGES > > > REVOKE " like in below statement: > > > alter default privileges revoke grant option for select ON tables FROM dba1; > > > > +1. But the v3 patch doesn't cover the following case: > > > > =# alter default privileges for role masahiko revoke [tab] > > ALL CREATE DELETE EXECUTE INSERT MAINTAIN > > REFERENCES SELECT TRIGGER TRUNCATE UPDATE USAGE > > Modified in the updated patch > > > And it doesn't cover MAINTAIN neither: > > > > =# alter default privileges revoke [tab] > > ALL DELETE GRANT OPTION FOR REFERENCES > > TRIGGER UPDATE > > CREATE EXECUTE INSERT SELECT > > TRUNCATE USAGE > > Modified in the updated patch > > > The patch adds the completions for ALTER DEFAULT PRIVILEGES REVOKE, > > but we handle such case in GRANT and REVOKE part: > > > > (around L3958) > > /* > > * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable > > * privileges (can't grant roles) > > */ > > if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) > > COMPLETE_WITH("SELECT", "INSERT", "UPDATE", > > "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", > > "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); > > The current patch handles the fix from here now. > > > Also, I think we can support WITH GRANT OPTION too. For example, > > > > =# alter default privileges for role masahiko grant all on tables to > > public [tab] > > I have handled this in the updated patch > > > It's already supported in the GRANT statement. > > > > > > > > 4) "DATA TYPE" was missing in "ALTER TABLE table-name ALTER COLUMN > > > column-name SET" like in: > > > ALTER TABLE t1 ALTER COLUMN c1 SET DATA TYPE text; > > > > > > > +1. The patch looks good to me, so pushed. > > Thanks for committing this. > > The updated patch has the changes for the above comments. > Thank you for updating the patch. I think it doesn't work well as "GRANT OPTION FOR" is complemented twice. For example, =# alter default privileges for user masahiko revoke [tab] ALL DELETE GRANT OPTION FOR MAINTAIN SELECT TRUNCATE USAGE CREATE EXECUTE INSERT REFERENCES TRIGGER UPDATE =# alter default privileges for user masahiko revoke grant option for [tab] ALL DELETE GRANT OPTION FOR MAINTAIN SELECT TRUNCATE USAGE CREATE EXECUTE INSERT REFERENCES TRIGGER UPDATE Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com ^ permalink raw reply [nested|flat] 25+ messages in thread
* Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE @ 2024-04-04 16:18 vignesh C <[email protected]> parent: Masahiko Sawada <[email protected]> 0 siblings, 1 reply; 25+ messages in thread From: vignesh C @ 2024-04-04 16:18 UTC (permalink / raw) To: Masahiko Sawada <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]> On Tue, 2 Apr 2024 at 13:08, Masahiko Sawada <[email protected]> wrote: > > On Mon, Apr 1, 2024 at 10:41 PM vignesh C <[email protected]> wrote: > > > > On Thu, 28 Mar 2024 at 13:05, Masahiko Sawada <[email protected]> wrote: > > > > > > Hi, > > > > > > Thank you for the patch! > > > > > > On Mon, Jul 3, 2023 at 12:12 AM vignesh C <[email protected]> wrote: > > > > > > > > Hi, > > > > > > > > Improved tab completion for "ALTER DEFAULT PRIVILEGE" and "ALTER TABLE": > > > > 1) GRANT, REVOKE and FOR USER keyword was not displayed in tab > > > > completion of alter default privileges like the below statement: > > > > ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; > > > > ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; > > > > ALTER DEFAULT PRIVILEGES FOR USER vignesh revoke INSERT ON tables FROM dba1; > > > > > > +1 > > > > > > > > > > > 2) USER was not displayed for "ALTER DEFAULT PRIVILEGES IN SCHEMA > > > > public FOR " like in below statement: > > > > ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR USER dba1 GRANT INSERT > > > > ON TABLES TO PUBLIC; > > > > > > Since there is no difference FOR USER and FOR ROLE, I'm not sure we > > > really want to support both in tab-completion. > > > > I have removed this change > > > > > > > > > > 3) "FOR GRANT OPTION" was not display for "ALTER DEFAULT PRIVILEGES > > > > REVOKE " like in below statement: > > > > alter default privileges revoke grant option for select ON tables FROM dba1; > > > > > > +1. But the v3 patch doesn't cover the following case: > > > > > > =# alter default privileges for role masahiko revoke [tab] > > > ALL CREATE DELETE EXECUTE INSERT MAINTAIN > > > REFERENCES SELECT TRIGGER TRUNCATE UPDATE USAGE > > > > Modified in the updated patch > > > > > And it doesn't cover MAINTAIN neither: > > > > > > =# alter default privileges revoke [tab] > > > ALL DELETE GRANT OPTION FOR REFERENCES > > > TRIGGER UPDATE > > > CREATE EXECUTE INSERT SELECT > > > TRUNCATE USAGE > > > > Modified in the updated patch > > > > > The patch adds the completions for ALTER DEFAULT PRIVILEGES REVOKE, > > > but we handle such case in GRANT and REVOKE part: > > > > > > (around L3958) > > > /* > > > * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable > > > * privileges (can't grant roles) > > > */ > > > if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) > > > COMPLETE_WITH("SELECT", "INSERT", "UPDATE", > > > "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", > > > "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); > > > > The current patch handles the fix from here now. > > > > > Also, I think we can support WITH GRANT OPTION too. For example, > > > > > > =# alter default privileges for role masahiko grant all on tables to > > > public [tab] > > > > I have handled this in the updated patch > > > > > It's already supported in the GRANT statement. > > > > > > > > > > > 4) "DATA TYPE" was missing in "ALTER TABLE table-name ALTER COLUMN > > > > column-name SET" like in: > > > > ALTER TABLE t1 ALTER COLUMN c1 SET DATA TYPE text; > > > > > > > > > > +1. The patch looks good to me, so pushed. > > > > Thanks for committing this. > > > > The updated patch has the changes for the above comments. > > > > Thank you for updating the patch. > > I think it doesn't work well as "GRANT OPTION FOR" is complemented > twice. For example, > > =# alter default privileges for user masahiko revoke [tab] > ALL DELETE GRANT OPTION FOR MAINTAIN > SELECT TRUNCATE USAGE > CREATE EXECUTE INSERT REFERENCES > TRIGGER UPDATE > =# alter default privileges for user masahiko revoke grant option for [tab] > ALL DELETE GRANT OPTION FOR MAINTAIN > SELECT TRUNCATE USAGE > CREATE EXECUTE INSERT REFERENCES > TRIGGER UPDATE Thanks for finding this issue, the attached v5 version patch has the fix for the same. Regards, Vignesh Attachments: [text/x-patch] v5-0001-Fix-missing-tab-completion-in-ALTER-DEFAULT-PRIVI.patch (3.2K, ../../CALDaNm0VdEdCoYQ_+8_pSkzU+k7aDHC5s+d86HSXSd4Pmsk3uQ@mail.gmail.com/2-v5-0001-Fix-missing-tab-completion-in-ALTER-DEFAULT-PRIVI.patch) download | inline diff: From 7aecc1d577f5608384044692dbffee7018e434fd Mon Sep 17 00:00:00 2001 From: Vignesh C <[email protected]> Date: Sun, 2 Jul 2023 19:35:46 +0530 Subject: [PATCH v5] Fix missing tab completion in "ALTER DEFAULT PRIVILEGES" GRANT, REVOKE and FOR USER keyword was not displayed in tab completion of "ALTER DEFAULT PRIVILEGES" like the below statements: ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR USER testdba REVOKE INSERT ON tables FROM testdba; "GRANT OPTION OPTION" was not displayed in tab completion of "ALTER DEFAULT PRIVILEGES REVOKE " like in below statement: ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON tables FROM testdba; "WITH GRANT OPTION" was not completed in tab completion of "ALTER DEFAULT PRIVILEGES ... GRANT ... to role" like in below statement: ALTER DEFAULT PRIVILEGES FOR ROLE testdba1 GRANT ALL ON tables to testdba2 WITH GRANT OPTION; --- src/bin/psql/tab-complete.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 82eb3955ab..0a9cdea9a2 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2147,7 +2147,7 @@ psql_completion(const char *text, int start, int end) /* ALTER DEFAULT PRIVILEGES */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("FOR ROLE", "IN SCHEMA"); + COMPLETE_WITH("FOR", "GRANT", "IN SCHEMA", "REVOKE"); /* ALTER DEFAULT PRIVILEGES FOR */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR")) COMPLETE_WITH("ROLE"); @@ -3949,9 +3949,18 @@ psql_completion(const char *text, int start, int end) * privileges (can't grant roles) */ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("SELECT", "INSERT", "UPDATE", - "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", - "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + { + if (TailMatches("GRANT") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR")) + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + else if (TailMatches("REVOKE")) + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", + "GRANT OPTION FOR", "ALL"); + } else if (TailMatches("GRANT")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Privilege_options_of_grant_and_revoke); @@ -4133,6 +4142,10 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Keywords_for_list_of_grant_roles); + /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT ... TO ROLE */ + else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && + TailMatches("GRANT", MatchAny, MatchAny, MatchAny, "TO", MatchAny)) + COMPLETE_WITH("WITH GRANT OPTION"); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny)) COMPLETE_WITH("TO"); -- 2.34.1 ^ permalink raw reply [nested|flat] 25+ messages in thread
* Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE @ 2024-04-08 04:58 Masahiko Sawada <[email protected]> parent: vignesh C <[email protected]> 0 siblings, 1 reply; 25+ messages in thread From: Masahiko Sawada @ 2024-04-08 04:58 UTC (permalink / raw) To: vignesh C <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]> On Fri, Apr 5, 2024 at 1:18 AM vignesh C <[email protected]> wrote: > > On Tue, 2 Apr 2024 at 13:08, Masahiko Sawada <[email protected]> wrote: > > > > On Mon, Apr 1, 2024 at 10:41 PM vignesh C <[email protected]> wrote: > > > > > > On Thu, 28 Mar 2024 at 13:05, Masahiko Sawada <[email protected]> wrote: > > > > > > > > Hi, > > > > > > > > Thank you for the patch! > > > > > > > > On Mon, Jul 3, 2023 at 12:12 AM vignesh C <[email protected]> wrote: > > > > > > > > > > Hi, > > > > > > > > > > Improved tab completion for "ALTER DEFAULT PRIVILEGE" and "ALTER TABLE": > > > > > 1) GRANT, REVOKE and FOR USER keyword was not displayed in tab > > > > > completion of alter default privileges like the below statement: > > > > > ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; > > > > > ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; > > > > > ALTER DEFAULT PRIVILEGES FOR USER vignesh revoke INSERT ON tables FROM dba1; > > > > > > > > +1 > > > > > > > > > > > > > > 2) USER was not displayed for "ALTER DEFAULT PRIVILEGES IN SCHEMA > > > > > public FOR " like in below statement: > > > > > ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR USER dba1 GRANT INSERT > > > > > ON TABLES TO PUBLIC; > > > > > > > > Since there is no difference FOR USER and FOR ROLE, I'm not sure we > > > > really want to support both in tab-completion. > > > > > > I have removed this change > > > > > > > > > > > > > 3) "FOR GRANT OPTION" was not display for "ALTER DEFAULT PRIVILEGES > > > > > REVOKE " like in below statement: > > > > > alter default privileges revoke grant option for select ON tables FROM dba1; > > > > > > > > +1. But the v3 patch doesn't cover the following case: > > > > > > > > =# alter default privileges for role masahiko revoke [tab] > > > > ALL CREATE DELETE EXECUTE INSERT MAINTAIN > > > > REFERENCES SELECT TRIGGER TRUNCATE UPDATE USAGE > > > > > > Modified in the updated patch > > > > > > > And it doesn't cover MAINTAIN neither: > > > > > > > > =# alter default privileges revoke [tab] > > > > ALL DELETE GRANT OPTION FOR REFERENCES > > > > TRIGGER UPDATE > > > > CREATE EXECUTE INSERT SELECT > > > > TRUNCATE USAGE > > > > > > Modified in the updated patch > > > > > > > The patch adds the completions for ALTER DEFAULT PRIVILEGES REVOKE, > > > > but we handle such case in GRANT and REVOKE part: > > > > > > > > (around L3958) > > > > /* > > > > * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable > > > > * privileges (can't grant roles) > > > > */ > > > > if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) > > > > COMPLETE_WITH("SELECT", "INSERT", "UPDATE", > > > > "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", > > > > "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); > > > > > > The current patch handles the fix from here now. > > > > > > > Also, I think we can support WITH GRANT OPTION too. For example, > > > > > > > > =# alter default privileges for role masahiko grant all on tables to > > > > public [tab] > > > > > > I have handled this in the updated patch > > > > > > > It's already supported in the GRANT statement. > > > > > > > > > > > > > > 4) "DATA TYPE" was missing in "ALTER TABLE table-name ALTER COLUMN > > > > > column-name SET" like in: > > > > > ALTER TABLE t1 ALTER COLUMN c1 SET DATA TYPE text; > > > > > > > > > > > > > +1. The patch looks good to me, so pushed. > > > > > > Thanks for committing this. > > > > > > The updated patch has the changes for the above comments. > > > > > > > Thank you for updating the patch. > > > > I think it doesn't work well as "GRANT OPTION FOR" is complemented > > twice. For example, > > > > =# alter default privileges for user masahiko revoke [tab] > > ALL DELETE GRANT OPTION FOR MAINTAIN > > SELECT TRUNCATE USAGE > > CREATE EXECUTE INSERT REFERENCES > > TRIGGER UPDATE > > =# alter default privileges for user masahiko revoke grant option for [tab] > > ALL DELETE GRANT OPTION FOR MAINTAIN > > SELECT TRUNCATE USAGE > > CREATE EXECUTE INSERT REFERENCES > > TRIGGER UPDATE > > Thanks for finding this issue, the attached v5 version patch has the > fix for the same. Thank you for updating the patch! I've pushed with minor adjustments. Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com ^ permalink raw reply [nested|flat] 25+ messages in thread
* Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE @ 2024-04-08 06:40 vignesh C <[email protected]> parent: Masahiko Sawada <[email protected]> 0 siblings, 0 replies; 25+ messages in thread From: vignesh C @ 2024-04-08 06:40 UTC (permalink / raw) To: Masahiko Sawada <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]> On Mon, 8 Apr 2024 at 10:29, Masahiko Sawada <[email protected]> wrote: > > On Fri, Apr 5, 2024 at 1:18 AM vignesh C <[email protected]> wrote: > > > > On Tue, 2 Apr 2024 at 13:08, Masahiko Sawada <[email protected]> wrote: > > > > > > On Mon, Apr 1, 2024 at 10:41 PM vignesh C <[email protected]> wrote: > > > > > > > > On Thu, 28 Mar 2024 at 13:05, Masahiko Sawada <[email protected]> wrote: > > > > > > > > > > Hi, > > > > > > > > > > Thank you for the patch! > > > > > > > > > > On Mon, Jul 3, 2023 at 12:12 AM vignesh C <[email protected]> wrote: > > > > > > > > > > > > Hi, > > > > > > > > > > > > Improved tab completion for "ALTER DEFAULT PRIVILEGE" and "ALTER TABLE": > > > > > > 1) GRANT, REVOKE and FOR USER keyword was not displayed in tab > > > > > > completion of alter default privileges like the below statement: > > > > > > ALTER DEFAULT PRIVILEGES GRANT INSERT ON tables TO PUBLIC; > > > > > > ALTER DEFAULT PRIVILEGES REVOKE INSERT ON tables FROM PUBLIC; > > > > > > ALTER DEFAULT PRIVILEGES FOR USER vignesh revoke INSERT ON tables FROM dba1; > > > > > > > > > > +1 > > > > > > > > > > > > > > > > > 2) USER was not displayed for "ALTER DEFAULT PRIVILEGES IN SCHEMA > > > > > > public FOR " like in below statement: > > > > > > ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR USER dba1 GRANT INSERT > > > > > > ON TABLES TO PUBLIC; > > > > > > > > > > Since there is no difference FOR USER and FOR ROLE, I'm not sure we > > > > > really want to support both in tab-completion. > > > > > > > > I have removed this change > > > > > > > > > > > > > > > > 3) "FOR GRANT OPTION" was not display for "ALTER DEFAULT PRIVILEGES > > > > > > REVOKE " like in below statement: > > > > > > alter default privileges revoke grant option for select ON tables FROM dba1; > > > > > > > > > > +1. But the v3 patch doesn't cover the following case: > > > > > > > > > > =# alter default privileges for role masahiko revoke [tab] > > > > > ALL CREATE DELETE EXECUTE INSERT MAINTAIN > > > > > REFERENCES SELECT TRIGGER TRUNCATE UPDATE USAGE > > > > > > > > Modified in the updated patch > > > > > > > > > And it doesn't cover MAINTAIN neither: > > > > > > > > > > =# alter default privileges revoke [tab] > > > > > ALL DELETE GRANT OPTION FOR REFERENCES > > > > > TRIGGER UPDATE > > > > > CREATE EXECUTE INSERT SELECT > > > > > TRUNCATE USAGE > > > > > > > > Modified in the updated patch > > > > > > > > > The patch adds the completions for ALTER DEFAULT PRIVILEGES REVOKE, > > > > > but we handle such case in GRANT and REVOKE part: > > > > > > > > > > (around L3958) > > > > > /* > > > > > * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable > > > > > * privileges (can't grant roles) > > > > > */ > > > > > if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) > > > > > COMPLETE_WITH("SELECT", "INSERT", "UPDATE", > > > > > "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", > > > > > "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); > > > > > > > > The current patch handles the fix from here now. > > > > > > > > > Also, I think we can support WITH GRANT OPTION too. For example, > > > > > > > > > > =# alter default privileges for role masahiko grant all on tables to > > > > > public [tab] > > > > > > > > I have handled this in the updated patch > > > > > > > > > It's already supported in the GRANT statement. > > > > > > > > > > > > > > > > > 4) "DATA TYPE" was missing in "ALTER TABLE table-name ALTER COLUMN > > > > > > column-name SET" like in: > > > > > > ALTER TABLE t1 ALTER COLUMN c1 SET DATA TYPE text; > > > > > > > > > > > > > > > > +1. The patch looks good to me, so pushed. > > > > > > > > Thanks for committing this. > > > > > > > > The updated patch has the changes for the above comments. > > > > > > > > > > Thank you for updating the patch. > > > > > > I think it doesn't work well as "GRANT OPTION FOR" is complemented > > > twice. For example, > > > > > > =# alter default privileges for user masahiko revoke [tab] > > > ALL DELETE GRANT OPTION FOR MAINTAIN > > > SELECT TRUNCATE USAGE > > > CREATE EXECUTE INSERT REFERENCES > > > TRIGGER UPDATE > > > =# alter default privileges for user masahiko revoke grant option for [tab] > > > ALL DELETE GRANT OPTION FOR MAINTAIN > > > SELECT TRUNCATE USAGE > > > CREATE EXECUTE INSERT REFERENCES > > > TRIGGER UPDATE > > > > Thanks for finding this issue, the attached v5 version patch has the > > fix for the same. > > Thank you for updating the patch! I've pushed with minor adjustments. Thanks for pushing this patch. Regards, Vignesh ^ permalink raw reply [nested|flat] 25+ messages in thread
end of thread, other threads:[~2024-04-08 06:40 UTC | newest] Thread overview: 25+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2020-05-08 21:03 [PATCH 2/2] Simplify XLogReader's open_segment API Alvaro Herrera <[email protected]> 2024-04-01 13:41 Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE vignesh C <[email protected]> 2024-04-02 07:38 ` Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE Masahiko Sawada <[email protected]> 2024-04-04 16:18 ` Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE vignesh C <[email protected]> 2024-04-08 04:58 ` Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE Masahiko Sawada <[email protected]> 2024-04-08 06:40 ` Re: Improve tab completion for ALTER DEFAULT PRIVILEGE and ALTER TABLE vignesh C <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox