On 2020/05/02 11:24, Michael Paquier wrote:
On Fri, May 01, 2020 at 12:04:56PM +0900, Fujii Masao wrote:
I applied cosmetic changes to the patch (attached). Barring any objection,
I will push this patch (also back-patch to v10 where wait-event for timeline
file was added).

Sorry for arriving late to the party.  I have one tiny comment.

+               pgstat_report_wait_start(WAIT_EVENT_TIMELINE_HISTORY_READ);
+               res = fgets(fline, sizeof(fline), fd);
+               pgstat_report_wait_end();
+               if (ferror(fd))
+                       ereport(ERROR,
+                                       (errcode_for_file_access(),
+                                        errmsg("could not read file \"%s\": 
%m", path)));
+               if (res == NULL)
+                       break;

It seems to me that there is no point to check ferror() if fgets()
does not return NULL, no?

Yeah, so I updated the patch so that ferror() is called only
when fgets() returns NULL. Attached is the updated version of
the patch.

Regards,

--
Fujii Masao
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION
diff --git a/src/backend/access/transam/timeline.c 
b/src/backend/access/transam/timeline.c
index de57d699af..e6a29d9a9b 100644
--- a/src/backend/access/transam/timeline.c
+++ b/src/backend/access/transam/timeline.c
@@ -78,7 +78,6 @@ readTimeLineHistory(TimeLineID targetTLI)
        List       *result;
        char            path[MAXPGPATH];
        char            histfname[MAXFNAMELEN];
-       char            fline[MAXPGPATH];
        FILE       *fd;
        TimeLineHistoryEntry *entry;
        TimeLineID      lasttli = 0;
@@ -123,15 +122,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))
@@ -393,6 +407,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;
@@ -408,6 +423,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)

Reply via email to