diff options
author | Fujii Masao <fujii@postgresql.org> | 2020-05-08 10:36:40 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2020-05-08 10:39:08 +0900 |
commit | 3a48740e898c7586d119bd821572265418ad7b43 (patch) | |
tree | c259a3d7034bbfae6e260011c42cb5a0920590bb | |
parent | 26cf16a9336101504c17e4bf7f6b6208c71bfa47 (diff) | |
download | postgresql-3a48740e898c7586d119bd821572265418ad7b43.tar.gz postgresql-3a48740e898c7586d119bd821572265418ad7b43.zip |
Report missing wait event for timeline history file.
TimelineHistoryRead and TimelineHistoryWrite wait events are reported
during waiting for a read and write of a timeline history file, respectively.
However, previously, TimelineHistoryRead wait event was not reported
while readTimeLineHistory() was reading a timeline history file. Also
TimelineHistoryWrite was not reported while writeTimeLineHistory() was
writing one line with the details of the timeline split, at the end.
This commit fixes these issues.
Back-patch to v10 where wait events for a timeline history file was added.
Author: Masahiro Ikeda
Reviewed-by: Michael Paquier, Fujii Masao
Discussion: https://postgr.es/m/d11b0c910b63684424e06772eb844ab5@oss.nttdata.com
-rw-r--r-- | src/backend/access/transam/timeline.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/backend/access/transam/timeline.c b/src/backend/access/transam/timeline.c index 9975548f4b7..8c92ee5356c 100644 --- a/src/backend/access/transam/timeline.c +++ b/src/backend/access/transam/timeline.c @@ -77,7 +77,6 @@ readTimeLineHistory(TimeLineID targetTLI) List *result; char path[MAXPGPATH]; char histfname[MAXFNAMELEN]; - char fline[MAXPGPATH]; FILE *fd; TimeLineHistoryEntry *entry; TimeLineID lasttli = 0; @@ -122,15 +121,30 @@ readTimeLineHistory(TimeLineID targetTLI) * Parse the file... */ prevend = InvalidXLogRecPtr; - while (fgets(fline, sizeof(fline), fd) != NULL) + for (;;) { - /* skip leading whitespace and check for # comment */ + char fline[MAXPGPATH]; + char *res; char *ptr; TimeLineID tli; uint32 switchpoint_hi; uint32 switchpoint_lo; int nfields; + pgstat_report_wait_start(WAIT_EVENT_TIMELINE_HISTORY_READ); + res = fgets(fline, sizeof(fline), fd); + pgstat_report_wait_end(); + if (res == NULL) + { + if (ferror(fd)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", path))); + + break; + } + + /* skip leading whitespace and check for # comment */ for (ptr = fline; *ptr; ptr++) { if (!isspace((unsigned char) *ptr)) @@ -389,6 +403,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI, nbytes = strlen(buffer); errno = 0; + pgstat_report_wait_start(WAIT_EVENT_TIMELINE_HISTORY_WRITE); if ((int) write(fd, buffer, nbytes) != nbytes) { int save_errno = errno; @@ -404,6 +419,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI, (errcode_for_file_access(), errmsg("could not write to file \"%s\": %m", tmppath))); } + pgstat_report_wait_end(); pgstat_report_wait_start(WAIT_EVENT_TIMELINE_HISTORY_SYNC); if (pg_fsync(fd) != 0) |