Use pg_pread() and pg_pwrite() in slru.c.
authorThomas Munro <tmunro@postgresql.org>
Sat, 1 Aug 2020 11:39:36 +0000 (23:39 +1200)
committerThomas Munro <tmunro@postgresql.org>
Sat, 1 Aug 2020 12:23:35 +0000 (00:23 +1200)
This avoids lseek() system calls at every SLRU I/O, as was
done for relation files in commit c24dcd0c.

Reviewed-by: Ashwin Agrawal <aagrawal@pivotal.io>
Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/CA%2BhUKG%2Biqke4uTRFj8D8uEUUgj%2BRokPSp%2BCWM6YYzaaamG9Wvg%40mail.gmail.com
Discussion: https://postgr.es/m/CA%2BhUKGJ%2BoHhnvqjn3%3DHro7xu-YDR8FPr0FL6LF35kHRX%3D_bUzg%40mail.gmail.com

src/backend/access/transam/slru.c

index 61249f4a12dff191cc387c7bc072d375c34017b6..9e145f1c36acb245a1aa9791a970ba0a4bd206dd 100644 (file)
@@ -669,7 +669,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno)
        SlruShared      shared = ctl->shared;
        int                     segno = pageno / SLRU_PAGES_PER_SEGMENT;
        int                     rpageno = pageno % SLRU_PAGES_PER_SEGMENT;
-       int                     offset = rpageno * BLCKSZ;
+       off_t           offset = rpageno * BLCKSZ;
        char            path[MAXPGPATH];
        int                     fd;
 
@@ -699,17 +699,9 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno)
                return true;
        }
 
-       if (lseek(fd, (off_t) offset, SEEK_SET) < 0)
-       {
-               slru_errcause = SLRU_SEEK_FAILED;
-               slru_errno = errno;
-               CloseTransientFile(fd);
-               return false;
-       }
-
        errno = 0;
        pgstat_report_wait_start(WAIT_EVENT_SLRU_READ);
-       if (read(fd, shared->page_buffer[slotno], BLCKSZ) != BLCKSZ)
+       if (pg_pread(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
        {
                pgstat_report_wait_end();
                slru_errcause = SLRU_READ_FAILED;
@@ -749,7 +741,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruFlush fdata)
        SlruShared      shared = ctl->shared;
        int                     segno = pageno / SLRU_PAGES_PER_SEGMENT;
        int                     rpageno = pageno % SLRU_PAGES_PER_SEGMENT;
-       int                     offset = rpageno * BLCKSZ;
+       off_t           offset = rpageno * BLCKSZ;
        char            path[MAXPGPATH];
        int                     fd = -1;
 
@@ -862,18 +854,9 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruFlush fdata)
                }
        }
 
-       if (lseek(fd, (off_t) offset, SEEK_SET) < 0)
-       {
-               slru_errcause = SLRU_SEEK_FAILED;
-               slru_errno = errno;
-               if (!fdata)
-                       CloseTransientFile(fd);
-               return false;
-       }
-
        errno = 0;
        pgstat_report_wait_start(WAIT_EVENT_SLRU_WRITE);
-       if (write(fd, shared->page_buffer[slotno], BLCKSZ) != BLCKSZ)
+       if (pg_pwrite(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
        {
                pgstat_report_wait_end();
                /* if write didn't set errno, assume problem is no disk space */