Have program default to 1000 loops, and add file name and loop option.
authorBruce Momjian <bruce@momjian.us>
Thu, 18 Mar 2004 19:54:00 +0000 (19:54 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 18 Mar 2004 19:54:00 +0000 (19:54 +0000)
Make open/close loop testings the same.  Add descriptions for certain tests.

src/tools/fsync/README
src/tools/fsync/test_fsync.c

index 6da713afbf4721803b7fa0e5aa1a90e3dce4a187..570708ed5106a8accf0a4f02c730e2ad6454804d 100644 (file)
@@ -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.
index 1579eaaae0d10fa349cc886903c7b00b96d0a703..2a01c4ec11402c8bd47a055afa2c2fd436381a7b 100644 (file)
@@ -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));
 }