From ab7d4213f93f0ef0e45b9b9343725974f196b091 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 9 Dec 2011 15:05:48 -0500 Subject: [PATCH] If pg_test_fsync is interrupted, clean up the temp file. Marti Raudsepp, with additional paranoia by me. --- contrib/pg_test_fsync/pg_test_fsync.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/contrib/pg_test_fsync/pg_test_fsync.c b/contrib/pg_test_fsync/pg_test_fsync.c index 3791f5a071..042b02bfae 100644 --- a/contrib/pg_test_fsync/pg_test_fsync.c +++ b/contrib/pg_test_fsync/pg_test_fsync.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "getopt_long.h" #include "access/xlogdefs.h" @@ -29,6 +30,7 @@ static const char *progname; static int ops_per_test = 2000; +static int needs_unlink = 0; static char full_buf[XLOG_SEG_SIZE], *buf, *filename = FSYNC_FILENAME; @@ -44,6 +46,7 @@ static void test_sync(int writes_per_op); static void test_open_syncs(void); static void test_open_sync(const char *msg, int writes_size); static void test_file_descriptor_sync(void); +static void signal_cleanup(int sig); #ifdef HAVE_FSYNC_WRITETHROUGH static int pg_fsync_writethrough(int fd); @@ -59,6 +62,14 @@ main(int argc, char *argv[]) handle_args(argc, argv); + /* Prevent leaving behind the test file */ + signal(SIGINT, signal_cleanup); + signal(SIGTERM, signal_cleanup); +#ifdef SIGHUP + /* Not defined on win32 */ + signal(SIGHUP, signal_cleanup); +#endif + prepare_buf(); test_open(); @@ -167,6 +178,7 @@ test_open(void) */ if ((tmpfile = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1) die("could not open output file"); + needs_unlink = 1; if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE) die("write failed"); @@ -490,6 +502,17 @@ test_non_sync(void) print_elapse(start_t, stop_t); } +static void +signal_cleanup(int signum) +{ + /* Delete the file if it exists. Ignore errors */ + if (needs_unlink) + unlink(filename); + /* Finish incomplete line on stdout */ + puts(""); + exit(signum); +} + #ifdef HAVE_FSYNC_WRITETHROUGH static int