test_fsync made modular - Mailing list pgsql-hackers

From Bruce Momjian
Subject test_fsync made modular
Date
Msg-id 201101151943.p0FJhUL21351@momjian.us
Whole thread Raw
List pgsql-hackers
I have modified test_fsync to use modular C so there is less duplicate
code and it can be enhanced easier.  Applied patch attached, though the
diff is larger than the C file so you might want to just look at the C
file in git.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/tools/fsync/README b/src/tools/fsync/README
index a1c2ae4..5bf6f1f 100644
*** /tmp/pgdiff.20499/6PmS7d_README    Sat Jan 15 14:41:11 2011
--- src/tools/fsync/README    Sat Jan 15 14:20:47 2011
*************** test_fsync
*** 3,9 ****

  This program tests fsync.  The tests are described as part of the program output.

!     Usage:    test_fsync [-f filename] [loops]

  test_fsync is intended to give you a reasonable idea of what the fastest
  fsync_method is on your specific system, as well as supplying diagnostic
--- 3,9 ----

  This program tests fsync.  The tests are described as part of the program output.

!     Usage:    test_fsync [-f filename] [ops_per_test]

  test_fsync is intended to give you a reasonable idea of what the fastest
  fsync_method is on your specific system, as well as supplying diagnostic
*************** The output filename defaults to test_fsy
*** 16,20 ****
  test_fsync should be run in the same filesystem as your transaction log
  directory (pg_xlog).

! Loops default to 2000.  Increase this to get more accurate measurements.

--- 16,21 ----
  test_fsync should be run in the same filesystem as your transaction log
  directory (pg_xlog).

! Ops-per-test defaults to 2000.  Increase this to get more accurate
! measurements.

diff --git a/src/tools/fsync/test_fsync.c b/src/tools/fsync/test_fsync.c
index ebfd5fd..ce59afa 100644
*** /tmp/pgdiff.20499/aaqVod_test_fsync.c    Sat Jan 15 14:41:11 2011
--- src/tools/fsync/test_fsync.c    Sat Jan 15 14:36:45 2011
***************
*** 22,27 ****
--- 22,28 ----
  #include <unistd.h>
  #include <string.h>

+
  /*
   * put the temp files in the local directory
   * unless the user specifies otherwise
***************
*** 34,54 ****
  #define NA_FORMAT        LABEL_FORMAT "%18s"


! int            loops = 2000;

! void        die(char *str);
  void        print_elapse(struct timeval start_t, struct timeval stop_t);

  int
  main(int argc, char *argv[])
  {
!     struct timeval start_t, stop_t;
!     int            tmpfile, i;
!     char       *full_buf = (char *) malloc(XLOG_SEG_SIZE),
!                *buf, *filename = FSYNC_FILENAME;

      /*
!      * arguments: loops and filename (optional)
       */
      if (argc > 2 && strcmp(argv[1], "-f") == 0)
      {
--- 35,93 ----
  #define NA_FORMAT        LABEL_FORMAT "%18s"


! int            ops_per_test = 2000;
! char        full_buf[XLOG_SEG_SIZE], *buf, *filename = FSYNC_FILENAME;
! struct timeval start_t, stop_t;

!
! void        handle_args(int argc, char *argv[]);
! void        prepare_buf(void);
! void        test_open(void);
! void        test_non_sync(void);
! void        test_sync(int writes_per_op);
! void        test_open_syncs(void);
! void        test_file_descriptor_sync(void);
  void        print_elapse(struct timeval start_t, struct timeval stop_t);
+ void        die(char *str);
+

  int
  main(int argc, char *argv[])
  {
!     handle_args(argc, argv);
!
!     prepare_buf();
!
!     test_open();
!
!     test_non_sync();
!
!     /* Test using 1 8k write */
!     test_sync(1);
!
!     /* Test using 2 8k writes */
!     test_sync(2);
!
!     test_open_syncs();
!
!     test_file_descriptor_sync();
!
!     unlink(filename);
!
!     return 0;
! }

+ void
+ handle_args(int argc, char *argv[])
+ {
+     if (argc > 1 && strcmp(argv[1], "-h") == 0)
+     {
+         fprintf(stderr, "test_fsync [-f filename] [ops-per-test]\n");
+         exit(1);
+     }
+
      /*
!      * arguments: ops_per_test and filename (optional)
       */
      if (argc > 2 && strcmp(argv[1], "-f") == 0)
      {
*************** main(int argc, char *argv[])
*** 58,67 ****
      }

      if (argc > 1)
!         loops = atoi(argv[1]);

!     for (i = 0; i < XLOG_SEG_SIZE; i++)
!         full_buf[i] = random();

      /*
       * test if we can open the target file
--- 97,123 ----
      }

      if (argc > 1)
!         ops_per_test = atoi(argv[1]);

!     printf("Ops-per-test = %d\n\n", ops_per_test);
! }
!
! void
! prepare_buf(void)
! {
!     int            ops;
!
!     /* write random data into buffer */
!     for (ops = 0; ops < XLOG_SEG_SIZE; ops++)
!         full_buf[ops] = random();
!
!     buf = (char *) TYPEALIGN(ALIGNOF_XLOG_BUFFER, full_buf);
! }
!
! void
! test_open(void)
! {
!     int            tmpfile;

      /*
       * test if we can open the target file
*************** main(int argc, char *argv[])
*** 70,94 ****
          die("Cannot open output file.");
      if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE)
          die("write failed");
!     /*
!      * fsync now so that dirty buffers don't skew later tests
!      */
      if (fsync(tmpfile) != 0)
          die("fsync failed");
-     close(tmpfile);

!     buf = (char *) TYPEALIGN(ALIGNOF_XLOG_BUFFER, full_buf);

!     printf("Loops = %d\n\n", loops);

      /*
       * Test a simple write without fsync
       */
!     printf("Simple write:\n");
      printf(LABEL_FORMAT, "8k write");
      fflush(stdout);
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
--- 126,153 ----
          die("Cannot open output file.");
      if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE)
          die("write failed");
!
!     /* fsync now so that dirty buffers don't skew later tests */
      if (fsync(tmpfile) != 0)
          die("fsync failed");

!     close(tmpfile);
! }

! void
! test_non_sync(void)
! {
!     int            tmpfile, ops;

      /*
       * Test a simple write without fsync
       */
!     printf("Simple non-sync'ed write:\n");
      printf(LABEL_FORMAT, "8k write");
      fflush(stdout);
+
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
*************** main(int argc, char *argv[])
*** 98,122 ****
      }
      gettimeofday(&stop_t, NULL);
      print_elapse(start_t, stop_t);

!     /*
!      * Test all fsync methods using single 8k writes
!      */
!     printf("\nCompare file sync methods using one write:\n");

      /*
       * Test open_datasync if available
       */
  #ifdef OPEN_DATASYNC_FLAG
!     printf(LABEL_FORMAT, "open_datasync 8k write");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
      }
--- 157,193 ----
      }
      gettimeofday(&stop_t, NULL);
      print_elapse(start_t, stop_t);
+ }

! void
! test_sync(int writes_per_op)
! {
!     int            tmpfile, ops, writes;
!
!     if (writes_per_op == 1)
!         printf("\nCompare file sync methods using one write:\n");
!     else
!         printf("\nCompare file sync methods using two writes:\n");
!     printf("(in wal_sync_method preference order)\n");

      /*
       * Test open_datasync if available
       */
  #ifdef OPEN_DATASYNC_FLAG
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "open_datasync 8k write");
!     else
!          printf(LABEL_FORMAT, "2 open_datasync 8k writes");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
!         for (writes = 0; writes < writes_per_op; writes++)
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
      }
*************** main(int argc, char *argv[])
*** 128,144 ****
       * If O_DIRECT is enabled, test that with open_datasync
       */
  #if PG_O_DIRECT != 0
-     fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
          printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
      else
      {
!         printf(LABEL_FORMAT, "open_datasync 8k direct I/O write");
          gettimeofday(&start_t, NULL);
!         for (i = 0; i < loops; i++)
          {
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
              if (lseek(tmpfile, 0, SEEK_SET) == -1)
                  die("seek failed");
          }
--- 199,220 ----
       * If O_DIRECT is enabled, test that with open_datasync
       */
  #if PG_O_DIRECT != 0
      if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
          printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
      else
      {
!         if (writes_per_op == 1)
!             printf(LABEL_FORMAT, "open_datasync 8k direct I/O write");
!         else
!             printf(LABEL_FORMAT, "2 open_datasync 8k direct I/O writes");
!         fflush(stdout);
!
          gettimeofday(&start_t, NULL);
!         for (ops = 0; ops < ops_per_test; ops++)
          {
!             for (writes = 0; writes < writes_per_op; writes++)
!                 if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                     die("write failed");
              if (lseek(tmpfile, 0, SEEK_SET) == -1)
                  die("seek failed");
          }
*************** main(int argc, char *argv[])
*** 155,222 ****
  #endif

  /*
-  * Test open_sync if available
-  */
- #ifdef OPEN_SYNC_FLAG
-     printf(LABEL_FORMAT, "open_sync 8k write");
-     fflush(stdout);
-     if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
-         die("Cannot open output file.");
-     gettimeofday(&start_t, NULL);
-     for (i = 0; i < loops; i++)
-     {
-         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
-             die("write failed");
-         if (lseek(tmpfile, 0, SEEK_SET) == -1)
-             die("seek failed");
-     }
-     gettimeofday(&stop_t, NULL);
-     close(tmpfile);
-     print_elapse(start_t, stop_t);
-
-     /*
-      * If O_DIRECT is enabled, test that with open_sync
-      */
- #if PG_O_DIRECT != 0
-     printf(LABEL_FORMAT, "open_sync 8k direct I/O write");
-     fflush(stdout);
-     if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
-         printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
-     else
-     {
-         gettimeofday(&start_t, NULL);
-         for (i = 0; i < loops; i++)
-         {
-             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
-                 die("write failed");
-             if (lseek(tmpfile, 0, SEEK_SET) == -1)
-                 die("seek failed");
-         }
-         gettimeofday(&stop_t, NULL);
-         close(tmpfile);
-         print_elapse(start_t, stop_t);
-     }
- #else
-     printf(NA_FORMAT, "o_direct", "n/a\n");
- #endif
-
- #else
-     printf(NA_FORMAT, "open_sync", "n/a\n");
- #endif
-
- /*
   * Test fdatasync if available
   */
  #ifdef HAVE_FDATASYNC
!     printf(LABEL_FORMAT, "8k write, fdatasync");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
          fdatasync(tmpfile);
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
--- 231,253 ----
  #endif

  /*
   * Test fdatasync if available
   */
  #ifdef HAVE_FDATASYNC
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "8k write, fdatasync");
!     else
!         printf(LABEL_FORMAT, "8k write, 8k write, fdatasync");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
!         for (writes = 0; writes < writes_per_op; writes++)
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
          fdatasync(tmpfile);
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
*************** main(int argc, char *argv[])
*** 231,245 ****
  /*
   * Test fsync
   */
!     printf(LABEL_FORMAT, "8k write, fsync");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
          if (fsync(tmpfile) != 0)
              die("fsync failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
--- 262,281 ----
  /*
   * Test fsync
   */
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "8k write, fsync");
!     else
!         printf(LABEL_FORMAT, "8k write, 8k write, fsync");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
!         for (writes = 0; writes < writes_per_op; writes++)
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
          if (fsync(tmpfile) != 0)
              die("fsync failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
*************** main(int argc, char *argv[])
*** 253,267 ****
   * If fsync_writethrough is available, test as well
   */
  #ifdef HAVE_FSYNC_WRITETHROUGH
!     printf(LABEL_FORMAT, "8k write, fsync_writethrough");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
          if (fcntl(tmpfile, F_FULLFSYNC ) != 0)
              die("fsync failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
--- 289,308 ----
   * If fsync_writethrough is available, test as well
   */
  #ifdef HAVE_FSYNC_WRITETHROUGH
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "8k write, fsync_writethrough");
!     else
!         printf(LABEL_FORMAT, "8k write, 8k write, fsync_writethrough");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
!         for (writes = 0; writes < writes_per_op; writes++)
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
          if (fcntl(tmpfile, F_FULLFSYNC ) != 0)
              die("fsync failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
*************** main(int argc, char *argv[])
*** 274,373 ****
      printf(NA_FORMAT, "fsync_writethrough", "n/a\n");
  #endif

-     /*
-      * Compare some of the file sync methods with
-      * two 8k writes to see if timing is different
-      */
-     printf("\nCompare file sync methods using two writes:\n");
-
  /*
!  * Test open_datasync with and without o_direct
!  */
! #ifdef OPEN_DATASYNC_FLAG
!      printf(LABEL_FORMAT, "2 open_datasync 8k writes");
!     fflush(stdout);
!     if ((tmpfile = open(filename, O_RDWR | O_DSYNC, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
!     {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
!     }
!     gettimeofday(&stop_t, NULL);
!     close(tmpfile);
!     print_elapse(start_t, stop_t);
!
! #if PG_O_DIRECT != 0
!     printf(LABEL_FORMAT, "2 open_datasync direct I/O 8k writes");
!     fflush(stdout);
!     if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
!     {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
!     }
!     gettimeofday(&stop_t, NULL);
!     close(tmpfile);
!     print_elapse(start_t, stop_t);
! #else
!         printf(NA_FORMAT, "o_direct" "n/a\n");
! #endif
!
! #else
!     printf(NA_FORMAT, "open_datasync", "n/a\n");
! #endif
!
! /*
!  * Test open_sync with and without o_direct
   */
  #ifdef OPEN_SYNC_FLAG
!     printf(LABEL_FORMAT, "2 open_sync 8k writes");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
      }
      gettimeofday(&stop_t, NULL);
      close(tmpfile);
      print_elapse(start_t, stop_t);
!
  #if PG_O_DIRECT != 0
!     printf(LABEL_FORMAT, "2 open_sync direct I/O 8k writes");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
      }
-     gettimeofday(&stop_t, NULL);
-     close(tmpfile);
-     print_elapse(start_t, stop_t);
  #else
      printf(NA_FORMAT, "o_direct", "n/a\n");
  #endif
--- 315,372 ----
      printf(NA_FORMAT, "fsync_writethrough", "n/a\n");
  #endif

  /*
!  * Test open_sync if available
   */
  #ifdef OPEN_SYNC_FLAG
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "open_sync 8k write");
!     else
!         printf(LABEL_FORMAT, "2 open_sync 8k writes");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
!         for (writes = 0; writes < writes_per_op; writes++)
!             if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                 die("write failed");
          if (lseek(tmpfile, 0, SEEK_SET) == -1)
              die("seek failed");
      }
      gettimeofday(&stop_t, NULL);
      close(tmpfile);
      print_elapse(start_t, stop_t);
!
!     /*
!      * If O_DIRECT is enabled, test that with open_sync
!      */
  #if PG_O_DIRECT != 0
!     if (writes_per_op == 1)
!         printf(LABEL_FORMAT, "open_sync 8k direct I/O write");
!     else
!         printf(LABEL_FORMAT, "2 open_sync 8k direct I/O writes");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
!         printf(NA_FORMAT, "o_direct", "n/a on this filesystem\n");
!     else
      {
!         gettimeofday(&start_t, NULL);
!         for (ops = 0; ops < ops_per_test; ops++)
!         {
!             for (writes = 0; writes < writes_per_op; writes++)
!                 if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!                     die("write failed");
!             if (lseek(tmpfile, 0, SEEK_SET) == -1)
!                 die("seek failed");
!         }
!         gettimeofday(&stop_t, NULL);
!         close(tmpfile);
!         print_elapse(start_t, stop_t);
      }
  #else
      printf(NA_FORMAT, "o_direct", "n/a\n");
  #endif
*************** main(int argc, char *argv[])
*** 375,456 ****
  #else
      printf(NA_FORMAT, "open_sync", "n/a\n");
  #endif

! /*
!  *    Test fdatasync
!  */
! #ifdef HAVE_FDATASYNC
!     printf(LABEL_FORMAT, "8k write, 8k write, fdatasync");
!     fflush(stdout);
!     if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
!     {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         fdatasync(tmpfile);
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
!     }
!     gettimeofday(&stop_t, NULL);
!     close(tmpfile);
!     print_elapse(start_t, stop_t);
! #else
!     printf(NA_FORMAT, "fdatasync", "n/a\n");
! #endif
!
! /*
!  * Test basic fsync
!  */
!     printf(LABEL_FORMAT, "8k write, 8k write, fsync");
!     fflush(stdout);
!     if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
!     {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (fsync(tmpfile) != 0)
!             die("fsync failed");
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
!     }
!     gettimeofday(&stop_t, NULL);
!     close(tmpfile);
!     print_elapse(start_t, stop_t);
!
! /*
!  * Test fsync_writethrough if available
!  */
! #ifdef HAVE_FSYNC_WRITETHROUGH
!     printf(LABEL_FORMAT, "8k write, 8k write, fsync_writethrough");
!     fflush(stdout);
!     if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
!         die("Cannot open output file.");
!     gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
!     {
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
!             die("write failed");
!         if (fcntl(tmpfile, F_FULLFSYNC) != 0)
!             die("fsync failed");
!         if (lseek(tmpfile, 0, SEEK_SET) == -1)
!             die("seek failed");
!     }
!     gettimeofday(&stop_t, NULL);
!     close(tmpfile);
!     print_elapse(start_t, stop_t);
! #else
!     printf(NA_FORMAT, "fsync_writethrough", "n/a\n");
! #endif

      /*
       * Compare 1 to 2 writes
--- 374,385 ----
  #else
      printf(NA_FORMAT, "open_sync", "n/a\n");
  #endif
+ }

! void
! test_open_syncs(void)
! {
!     int            tmpfile, ops;

      /*
       * Compare 1 to 2 writes
*************** main(int argc, char *argv[])
*** 465,474 ****
  #ifdef OPEN_SYNC_FLAG
      printf(LABEL_FORMAT, "open_sync 16k write");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
          if (write(tmpfile, buf, WRITE_SIZE * 2) != WRITE_SIZE * 2)
              die("write failed");
--- 394,404 ----
  #ifdef OPEN_SYNC_FLAG
      printf(LABEL_FORMAT, "open_sync 16k write");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
          if (write(tmpfile, buf, WRITE_SIZE * 2) != WRITE_SIZE * 2)
              die("write failed");
*************** main(int argc, char *argv[])
*** 481,490 ****

      printf(LABEL_FORMAT, "2 open_sync 8k writes");
      fflush(stdout);
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
          if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
              die("write failed");
--- 411,421 ----

      printf(LABEL_FORMAT, "2 open_sync 8k writes");
      fflush(stdout);
+
      if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG, 0)) == -1)
          die("Cannot open output file.");
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
          if (write(tmpfile, buf, WRITE_SIZE) != WRITE_SIZE)
              die("write failed");
*************** main(int argc, char *argv[])
*** 499,504 ****
--- 430,441 ----
  #else
      printf(NA_FORMAT, "open_sync", "n/a\n");
  #endif
+ }
+
+ void
+ test_file_descriptor_sync(void)
+ {
+     int            tmpfile, ops;

      /*
       * Test whether fsync can sync data written on a different
*************** main(int argc, char *argv[])
*** 517,524 ****
       */
      printf(LABEL_FORMAT, "8k write, fsync, close");
      fflush(stdout);
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
--- 454,462 ----
       */
      printf(LABEL_FORMAT, "8k write, fsync, close");
      fflush(stdout);
+
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
*************** main(int argc, char *argv[])
*** 545,552 ****
       */
       printf(LABEL_FORMAT, "8k write, close, fsync");
       fflush(stdout);
      gettimeofday(&start_t, NULL);
!     for (i = 0; i < loops; i++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
--- 483,491 ----
       */
       printf(LABEL_FORMAT, "8k write, close, fsync");
       fflush(stdout);
+
      gettimeofday(&start_t, NULL);
!     for (ops = 0; ops < ops_per_test; ops++)
      {
          if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
              die("Cannot open output file.");
*************** main(int argc, char *argv[])
*** 563,575 ****
      gettimeofday(&stop_t, NULL);
      print_elapse(start_t, stop_t);

-     /*
-      * cleanup
-      */
-     free(full_buf);
-     unlink(filename);
-
-     return 0;
  }

  /*
--- 502,507 ----
*************** print_elapse(struct timeval start_t, str
*** 580,586 ****
  {
      double        total_time = (stop_t.tv_sec - start_t.tv_sec) +
      (stop_t.tv_usec - start_t.tv_usec) * 0.000001;
!     double        per_second = loops / total_time;

      printf("%9.3f ops/sec\n", per_second);
  }
--- 512,518 ----
  {
      double        total_time = (stop_t.tv_sec - start_t.tv_sec) +
      (stop_t.tv_usec - start_t.tv_usec) * 0.000001;
!     double        per_second = ops_per_test / total_time;

      printf("%9.3f ops/sec\n", per_second);
  }

pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: ALTER TYPE 0: Introduction; test cases
Next
From: Andrew Chernow
Date:
Subject: Re: Visual Studio 2010/Windows SDK 7.1 support