]> granicus.if.org Git - postgresql/commitdiff
Correct handling of fsync failures with tar mode of walmethods.c
authorMichael Paquier <michael@paquier.xyz>
Tue, 26 Jun 2018 00:56:55 +0000 (09:56 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 26 Jun 2018 00:56:55 +0000 (09:56 +0900)
This file has been missing the fact that it needs to report back to
callers a proper failure on fsync calls.  I have spotted the one in
tar_finish() while Kuntal has spotted the one in tar_close().

Backpatch down to 10 where this code has been introduced.

Reported by: Michael Paquier, Kuntal Ghosh
Author: Michael Paquier
Reviewed-by: Kuntal Ghosh, Magnus Hagander
Discussion: https://postgr.es/m/20180625024356.GD1146@paquier.xyz

src/bin/pg_basebackup/walmethods.c

index a48aacf7661e76fd5446e3c1303d00fc7fbe3f41..82cbf8700253eae3a46f599a22877b696e3667cc 100644 (file)
@@ -863,7 +863,8 @@ tar_close(Walfile f, WalCloseMethod method)
                return -1;
 
        /* Always fsync on close, so the padding gets fsynced */
-       tar_sync(f);
+       if (tar_sync(f) < 0)
+               return -1;
 
        /* Clean up and done */
        pg_free(tf->pathname);
@@ -894,7 +895,7 @@ tar_finish(void)
                        return false;
        }
 
-       /* A tarfile always ends with two empty  blocks */
+       /* A tarfile always ends with two empty blocks */
        MemSet(zerobuf, 0, sizeof(zerobuf));
        if (!tar_data->compression)
        {
@@ -955,7 +956,10 @@ tar_finish(void)
 
        /* sync the empty blocks as well, since they're after the last file */
        if (tar_data->sync)
-               fsync(tar_data->fd);
+       {
+               if (fsync(tar_data->fd) != 0)
+                       return false;
+       }
 
        if (close(tar_data->fd) != 0)
                return false;