mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	If pg_test_fsync is interrupted, clean up the temp file.
Marti Raudsepp, with additional paranoia by me.
This commit is contained in:
		@@ -9,6 +9,7 @@
 | 
				
			|||||||
#include <sys/time.h>
 | 
					#include <sys/time.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "getopt_long.h"
 | 
					#include "getopt_long.h"
 | 
				
			||||||
#include "access/xlogdefs.h"
 | 
					#include "access/xlogdefs.h"
 | 
				
			||||||
@@ -29,6 +30,7 @@
 | 
				
			|||||||
static const char *progname;
 | 
					static const char *progname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int	ops_per_test = 2000;
 | 
					static int	ops_per_test = 2000;
 | 
				
			||||||
 | 
					static int	needs_unlink = 0;
 | 
				
			||||||
static char full_buf[XLOG_SEG_SIZE],
 | 
					static char full_buf[XLOG_SEG_SIZE],
 | 
				
			||||||
		   *buf,
 | 
							   *buf,
 | 
				
			||||||
		   *filename = FSYNC_FILENAME;
 | 
							   *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_syncs(void);
 | 
				
			||||||
static void test_open_sync(const char *msg, int writes_size);
 | 
					static void test_open_sync(const char *msg, int writes_size);
 | 
				
			||||||
static void test_file_descriptor_sync(void);
 | 
					static void test_file_descriptor_sync(void);
 | 
				
			||||||
 | 
					static void signal_cleanup(int sig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FSYNC_WRITETHROUGH
 | 
					#ifdef HAVE_FSYNC_WRITETHROUGH
 | 
				
			||||||
static int	pg_fsync_writethrough(int fd);
 | 
					static int	pg_fsync_writethrough(int fd);
 | 
				
			||||||
@@ -59,6 +62,14 @@ main(int argc, char *argv[])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	handle_args(argc, 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();
 | 
						prepare_buf();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	test_open();
 | 
						test_open();
 | 
				
			||||||
@@ -167,6 +178,7 @@ test_open(void)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	if ((tmpfile = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1)
 | 
						if ((tmpfile = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1)
 | 
				
			||||||
		die("could not open output file");
 | 
							die("could not open output file");
 | 
				
			||||||
 | 
						needs_unlink = 1;
 | 
				
			||||||
	if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE)
 | 
						if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE)
 | 
				
			||||||
		die("write failed");
 | 
							die("write failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -490,6 +502,17 @@ test_non_sync(void)
 | 
				
			|||||||
	print_elapse(start_t, stop_t);
 | 
						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
 | 
					#ifdef HAVE_FSYNC_WRITETHROUGH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user