From 9e231bab65b60ccea05ff6adce7feceae6844220 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 18 Mar 2004 19:54:00 +0000
Subject: [PATCH] Have program default to 1000 loops, and add file name and
 loop option.

Make open/close loop testings the same.  Add descriptions for certain tests.
---
 src/tools/fsync/README       |   8 +-
 src/tools/fsync/test_fsync.c | 159 +++++++++++++++++++++++------------
 2 files changed, 109 insertions(+), 58 deletions(-)

diff --git a/src/tools/fsync/README b/src/tools/fsync/README
index 6da713afbf4..570708ed510 100644
--- a/src/tools/fsync/README
+++ b/src/tools/fsync/README
@@ -1,7 +1,5 @@
-This program tests fsync.  If first times a simple read.  Then, it times
-an fsync that is part of a write, and one that is done on a newly opened
-file.  Third, it tests various fsync methods.
+This program tests fsync.  The tests are described as part of the program output.
 
-The program writes to /var/tmp because /tmp is sometimes a memory file
-system.
+	Usage:	test_fsync [-f filename] [loops]
 
+Loops defaults to 1000.
diff --git a/src/tools/fsync/test_fsync.c b/src/tools/fsync/test_fsync.c
index 1579eaaae0d..2a01c4ec114 100644
--- a/src/tools/fsync/test_fsync.c
+++ b/src/tools/fsync/test_fsync.c
@@ -14,6 +14,8 @@
 #include <sys/time.h>
 #include <unistd.h>
 
+#define FSYNC_FILENAME	"/var/tmp/test_fsync.out"
+
 /* O_SYNC and O_FSYNC are the same */
 #if defined(O_SYNC)
 #define OPEN_SYNC_FLAG		O_SYNC
@@ -36,12 +38,25 @@ main(int argc, char *argv[])
 	struct timeval start_t;
 	struct timeval elapse_t;
 	int			tmpfile,
-				i;
+				i,
+				loops=1000;
 	char	   *strout = (char *) malloc(65536);
+	char	   *filename = FSYNC_FILENAME;
 
+	if (argc > 2 && strcmp(argv[1],"-f") == 0)
+	{
+		filename = argv[2];
+		argv += 2;
+		argc -= 2;
+	}
+		
+	if (argc > 1)
+			loops = atoi(argv[1]);
+		
 	for (i = 0; i < 65536; i++)
 		strout[i] = 'a';
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1)
+
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	write(tmpfile, strout, 65536);
 	fsync(tmpfile);				/* fsync so later fsync's don't have to do
@@ -51,24 +66,35 @@ main(int argc, char *argv[])
 	printf("Simple write timing:\n");
 	/* write only */
 	gettimeofday(&start_t, NULL);
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
-		die("can't open /var/tmp/test_fsync.out");
-	write(tmpfile, strout, 8192);
-	close(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
+			die("can't open /var/tmp/test_fsync.out");
+		write(tmpfile, strout, 8192);
+		close(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	printf("\twrite                  ");
 	print_elapse(start_t, elapse_t);
-	printf("\n\n");
+	printf("\n");
 
-	printf("Compare fsync before and after write's close:\n");
+	printf("\nCompare fsync times on write() and non-write() descriptor:\n");
+	printf("(If the times are similar, fsync() can sync data written\n on a different descriptor.)\n");
 
 	/* write, fsync, close */
 	gettimeofday(&start_t, NULL);
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
-		die("can't open /var/tmp/test_fsync.out");
-	write(tmpfile, strout, 8192);
-	fsync(tmpfile);
-	close(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
+			die("can't open /var/tmp/test_fsync.out");
+		write(tmpfile, strout, 8192);
+		fsync(tmpfile);
+		close(tmpfile);
+		if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
+			die("can't open /var/tmp/test_fsync.out");
+		/* do nothing but the open/close the tests are consistent. */
+		close(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	printf("\twrite, fsync, close    ");
 	print_elapse(start_t, elapse_t);
@@ -76,15 +102,18 @@ main(int argc, char *argv[])
 
 	/* write, close, fsync */
 	gettimeofday(&start_t, NULL);
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
-		die("can't open /var/tmp/test_fsync.out");
-	write(tmpfile, strout, 8192);
-	close(tmpfile);
-	/* reopen file */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
-		die("can't open /var/tmp/test_fsync.out");
-	fsync(tmpfile);
-	close(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
+			die("can't open /var/tmp/test_fsync.out");
+		write(tmpfile, strout, 8192);
+		close(tmpfile);
+		/* reopen file */
+		if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
+			die("can't open /var/tmp/test_fsync.out");
+		fsync(tmpfile);
+		close(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	printf("\twrite, close, fsync    ");
 	print_elapse(start_t, elapse_t);
@@ -93,10 +122,11 @@ main(int argc, char *argv[])
 	printf("\nCompare one o_sync write to two:\n");
 
 	/* 16k o_sync write */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 16384);
+	for (i = 0; i < loops; i++)
+		write(tmpfile, strout, 16384);
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\tone 16k o_sync write   ");
@@ -104,11 +134,14 @@ main(int argc, char *argv[])
 	printf("\n");
 
 	/* 2*8k o_sync writes */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	write(tmpfile, strout, 8192);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		write(tmpfile, strout, 8192);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\ttwo 8k o_sync writes   ");
@@ -119,10 +152,11 @@ main(int argc, char *argv[])
 
 #ifdef OPEN_DATASYNC_FLAG
 	/* open_dsync, write */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_DSYNC)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_DSYNC)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
+	for (i = 0; i < loops; i++)
+		write(tmpfile, strout, 8192);
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\topen o_dsync, write    ");
@@ -133,10 +167,11 @@ main(int argc, char *argv[])
 	printf("\n");
 
 	/* open_fsync, write */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
+	for (i = 0; i < loops; i++)
+		write(tmpfile, strout, 8192);
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\topen o_sync, write     ");
@@ -145,11 +180,14 @@ main(int argc, char *argv[])
 
 #ifdef HAVE_FDATASYNC
 	/* write, fdatasync */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	fdatasync(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		fdatasync(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\twrite, fdatasync       ");
@@ -160,11 +198,14 @@ main(int argc, char *argv[])
 	printf("\n");
 
 	/* write, fsync, close */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	fsync(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		fsync(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\twrite, fsync,          ");
@@ -176,11 +217,14 @@ main(int argc, char *argv[])
 
 #ifdef OPEN_DATASYNC_FLAG
 	/* open_dsync, write */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | O_DSYNC)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | O_DSYNC)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	write(tmpfile, strout, 8192);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		write(tmpfile, strout, 8192);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\topen o_dsync, write    ");
@@ -191,11 +235,14 @@ main(int argc, char *argv[])
 	printf("\n");
 
 	/* open_fsync, write */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR | OPEN_SYNC_FLAG)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR | OPEN_SYNC_FLAG)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	write(tmpfile, strout, 8192);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		write(tmpfile, strout, 8192);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\topen o_sync, write     ");
@@ -204,12 +251,15 @@ main(int argc, char *argv[])
 
 #ifdef HAVE_FDATASYNC
 	/* write, fdatasync */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	write(tmpfile, strout, 8192);
-	fdatasync(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		write(tmpfile, strout, 8192);
+		fdatasync(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\twrite, fdatasync       ");
@@ -220,19 +270,22 @@ main(int argc, char *argv[])
 	printf("\n");
 
 	/* write, fsync, close */
-	if ((tmpfile = open("/var/tmp/test_fsync.out", O_RDWR)) == -1)
+	if ((tmpfile = open(FSYNC_FILENAME, O_RDWR)) == -1)
 		die("can't open /var/tmp/test_fsync.out");
 	gettimeofday(&start_t, NULL);
-	write(tmpfile, strout, 8192);
-	write(tmpfile, strout, 8192);
-	fsync(tmpfile);
+	for (i = 0; i < loops; i++)
+	{
+		write(tmpfile, strout, 8192);
+		write(tmpfile, strout, 8192);
+		fsync(tmpfile);
+	}
 	gettimeofday(&elapse_t, NULL);
 	close(tmpfile);
 	printf("\twrite, fsync,          ");
 	print_elapse(start_t, elapse_t);
 	printf("\n");
 
-	unlink("/var/tmp/test_fsync.out");
+	unlink(FSYNC_FILENAME);
 
 	return 0;
 }
@@ -246,7 +299,7 @@ print_elapse(struct timeval start_t, struct timeval elapse_t)
 		elapse_t.tv_usec += 1000000;
 	}
 
-	printf("%ld.%06ld", (long) (elapse_t.tv_sec - start_t.tv_sec),
+	printf("%3ld.%06ld", (long) (elapse_t.tv_sec - start_t.tv_sec),
 		   (long) (elapse_t.tv_usec - start_t.tv_usec));
 }
 
-- 
GitLab