Simplify some ERROR paths clearing wait events and transient files
authorMichael Paquier <michael@paquier.xyz>
Wed, 17 Apr 2019 00:51:45 +0000 (09:51 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 17 Apr 2019 00:51:45 +0000 (09:51 +0900)
Transient files and wait events get normally cleaned up when seeing an
exception (be it in the context of a transaction for a backend or
another process like the checkpointer), hence there is little point in
complicating error code paths to do this work.  This shaves a bit of
code, and removes some extra handling with errno which needed to be
preserved during the cleanup steps done.

Reported-by: Masahiko Sawada
Author: Michael Paquier
Reviewed-by: Tom Lane, Masahiko Sawada
Discussion: https://postgr.es/m/CAD21AoDhHYVq5KkXfkaHhmjA-zJYj-e4teiRAJefvXuKJz1tKQ@mail.gmail.com

src/backend/access/transam/twophase.c
src/backend/replication/logical/origin.c
src/backend/replication/slot.c
src/backend/storage/file/copydir.c

index f9a4960f8aeb132ec70e93b3bf85e15427ed4366..a399c0052d9aeb96cf25419ce931a61248752dd2 100644 (file)
@@ -1693,26 +1693,18 @@ RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
        pgstat_report_wait_start(WAIT_EVENT_TWOPHASE_FILE_WRITE);
        if (write(fd, content, len) != len)
        {
-               int                     save_errno = errno;
-
-               pgstat_report_wait_end();
-               CloseTransientFile(fd);
-
                /* if write didn't set errno, assume problem is no disk space */
-               errno = save_errno ? save_errno : ENOSPC;
+               if (errno == 0)
+                       errno = ENOSPC;
                ereport(ERROR,
                                (errcode_for_file_access(),
                                 errmsg("could not write file \"%s\": %m", path)));
        }
        if (write(fd, &statefile_crc, sizeof(pg_crc32c)) != sizeof(pg_crc32c))
        {
-               int                     save_errno = errno;
-
-               pgstat_report_wait_end();
-               CloseTransientFile(fd);
-
                /* if write didn't set errno, assume problem is no disk space */
-               errno = save_errno ? save_errno : ENOSPC;
+               if (errno == 0)
+                       errno = ENOSPC;
                ereport(ERROR,
                                (errcode_for_file_access(),
                                 errmsg("could not write file \"%s\": %m", path)));
@@ -1725,15 +1717,9 @@ RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
         */
        pgstat_report_wait_start(WAIT_EVENT_TWOPHASE_FILE_SYNC);
        if (pg_fsync(fd) != 0)
-       {
-               int                     save_errno = errno;
-
-               CloseTransientFile(fd);
-               errno = save_errno;
                ereport(ERROR,
                                (errcode_for_file_access(),
                                 errmsg("could not fsync file \"%s\": %m", path)));
-       }
        pgstat_report_wait_end();
 
        if (CloseTransientFile(fd) != 0)
index 42fd8f5b6b7cd4584ebac98e1fcaa82fb4112a32..ff4d54d6edd6f94ada52a91628c8eb8a61d7f0b1 100644 (file)
@@ -579,12 +579,9 @@ CheckPointReplicationOrigin(void)
        errno = 0;
        if ((write(tmpfd, &magic, sizeof(magic))) != sizeof(magic))
        {
-               int                     save_errno = errno;
-
-               CloseTransientFile(tmpfd);
-
                /* if write didn't set errno, assume problem is no disk space */
-               errno = save_errno ? save_errno : ENOSPC;
+               if (errno == 0)
+                       errno = ENOSPC;
                ereport(PANIC,
                                (errcode_for_file_access(),
                                 errmsg("could not write to file \"%s\": %m",
@@ -624,12 +621,9 @@ CheckPointReplicationOrigin(void)
                if ((write(tmpfd, &disk_state, sizeof(disk_state))) !=
                        sizeof(disk_state))
                {
-                       int                     save_errno = errno;
-
-                       CloseTransientFile(tmpfd);
-
                        /* if write didn't set errno, assume problem is no disk space */
-                       errno = save_errno ? save_errno : ENOSPC;
+                       if (errno == 0)
+                               errno = ENOSPC;
                        ereport(PANIC,
                                        (errcode_for_file_access(),
                                         errmsg("could not write to file \"%s\": %m",
@@ -646,12 +640,9 @@ CheckPointReplicationOrigin(void)
        errno = 0;
        if ((write(tmpfd, &crc, sizeof(crc))) != sizeof(crc))
        {
-               int                     save_errno = errno;
-
-               CloseTransientFile(tmpfd);
-
                /* if write didn't set errno, assume problem is no disk space */
-               errno = save_errno ? save_errno : ENOSPC;
+               if (errno == 0)
+                       errno = ENOSPC;
                ereport(PANIC,
                                (errcode_for_file_access(),
                                 errmsg("could not write to file \"%s\": %m",
index 006446b663ee68d51323c81f191d7984a6442a89..057c5d7ab2ebc2bbb8aca14b4f25260cb76fdd18 100644 (file)
@@ -1398,16 +1398,10 @@ RestoreSlotFromDisk(const char *name)
         */
        pgstat_report_wait_start(WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC);
        if (pg_fsync(fd) != 0)
-       {
-               int                     save_errno = errno;
-
-               CloseTransientFile(fd);
-               errno = save_errno;
                ereport(PANIC,
                                (errcode_for_file_access(),
                                 errmsg("could not fsync file \"%s\": %m",
                                                path)));
-       }
        pgstat_report_wait_end();
 
        /* Also sync the parent directory */
@@ -1421,10 +1415,6 @@ RestoreSlotFromDisk(const char *name)
        pgstat_report_wait_end();
        if (readBytes != ReplicationSlotOnDiskConstantSize)
        {
-               int                     saved_errno = errno;
-
-               CloseTransientFile(fd);
-               errno = saved_errno;
                if (readBytes < 0)
                        ereport(PANIC,
                                        (errcode_for_file_access(),
@@ -1466,10 +1456,6 @@ RestoreSlotFromDisk(const char *name)
        pgstat_report_wait_end();
        if (readBytes != cp.length)
        {
-               int                     saved_errno = errno;
-
-               CloseTransientFile(fd);
-               errno = saved_errno;
                if (readBytes < 0)
                        ereport(PANIC,
                                        (errcode_for_file_access(),
index 342d078a8ff98818e0e342c4fa16b4c08e4cbca0..30f6200a86fc4b59a62f40888dca85c86ffdef42 100644 (file)
@@ -199,7 +199,6 @@ copy_file(char *fromfile, char *tofile)
                pgstat_report_wait_start(WAIT_EVENT_COPY_FILE_WRITE);
                if ((int) write(dstfd, buffer, nbytes) != nbytes)
                {
-                       pgstat_report_wait_end();
                        /* if write didn't set errno, assume problem is no disk space */
                        if (errno == 0)
                                errno = ENOSPC;