PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pg_test_fsync.c File Reference
#include "postgres_fe.h"
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include "getopt_long.h"
#include "access/xlogdefs.h"
Include dependency graph for pg_test_fsync.c:

Go to the source code of this file.

Macros

#define FSYNC_FILENAME   "./pg_test_fsync.out"
 
#define XLOG_BLCKSZ_K   (XLOG_BLCKSZ / 1024)
 
#define LABEL_FORMAT   " %-30s"
 
#define NA_FORMAT   "%20s"
 
#define OPS_FORMAT   "%13.3f ops/sec %6.0f usecs/op"
 
#define USECS_SEC   1000000
 
#define START_TIMER
 
#define STOP_TIMER
 

Functions

static void handle_args (int argc, char *argv[])
 
static void prepare_buf (void)
 
static void test_open (void)
 
static void test_non_sync (void)
 
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 process_alarm (int sig)
 
static void signal_cleanup (int sig)
 
static void print_elapse (struct timeval start_t, struct timeval stop_t, int ops)
 
static void die (const char *str)
 
int main (int argc, char *argv[])
 

Variables

static const char * progname
 
static int secs_per_test = 5
 
static int needs_unlink = 0
 
static char full_buf [XLOG_SEG_SIZE]
 
static char * buf
 
static char * filename = FSYNC_FILENAME
 
static struct timeval start_t stop_t
 
static bool alarm_triggered = false
 

Macro Definition Documentation

#define FSYNC_FILENAME   "./pg_test_fsync.out"

Definition at line 23 of file pg_test_fsync.c.

#define LABEL_FORMAT   " %-30s"
#define NA_FORMAT   "%20s"

Definition at line 28 of file pg_test_fsync.c.

Referenced by test_open_sync(), and test_sync().

#define OPS_FORMAT   "%13.3f ops/sec %6.0f usecs/op"

Definition at line 29 of file pg_test_fsync.c.

Referenced by print_elapse().

#define START_TIMER
Value:
do { \
alarm_triggered = false; \
alarm(secs_per_test); \
gettimeofday(&start_t, NULL); \
} while (0)
int gettimeofday(struct timeval *tp, struct timezone *tzp)
Definition: gettimeofday.c:105
static int secs_per_test
Definition: pg_test_fsync.c:64
static bool alarm_triggered
Definition: pg_test_fsync.c:71
#define NULL
Definition: c.h:229

Definition at line 34 of file pg_test_fsync.c.

Referenced by test_file_descriptor_sync(), test_non_sync(), test_open_sync(), and test_sync().

#define STOP_TIMER
Value:
do { \
print_elapse(start_t, stop_t, ops); \
} while (0)
int gettimeofday(struct timeval *tp, struct timezone *tzp)
Definition: gettimeofday.c:105
static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops)
static struct timeval start_t stop_t
Definition: pg_test_fsync.c:69
#define NULL
Definition: c.h:229

Definition at line 55 of file pg_test_fsync.c.

Referenced by test_file_descriptor_sync(), test_non_sync(), test_open_sync(), and test_sync().

#define USECS_SEC   1000000

Definition at line 30 of file pg_test_fsync.c.

Referenced by print_elapse().

#define XLOG_BLCKSZ_K   (XLOG_BLCKSZ / 1024)

Definition at line 25 of file pg_test_fsync.c.

Referenced by test_non_sync(), and test_sync().

Function Documentation

static void die ( const char *  str)
static

Definition at line 601 of file pg_test_fsync.c.

References _, and strerror().

Referenced by test_file_descriptor_sync(), test_non_sync(), test_open(), test_open_sync(), and test_sync().

602 {
603  fprintf(stderr, _("%s: %s\n"), _(str), strerror(errno));
604  exit(1);
605 }
const char * strerror(int errnum)
Definition: strerror.c:19
#define _(x)
Definition: elog.c:84
static void handle_args ( int  argc,
char *  argv[] 
)
static

Definition at line 138 of file pg_test_fsync.c.

References _, filename, getopt_long(), NULL, optarg, optind, progname, required_argument, and secs_per_test.

Referenced by main().

139 {
140  static struct option long_options[] = {
141  {"filename", required_argument, NULL, 'f'},
142  {"secs-per-test", required_argument, NULL, 's'},
143  {NULL, 0, NULL, 0}
144  };
145 
146  int option; /* Command line option */
147  int optindex = 0; /* used by getopt_long */
148 
149  if (argc > 1)
150  {
151  if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
152  {
153  printf(_("Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"), progname);
154  exit(0);
155  }
156  if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
157  {
158  puts("pg_test_fsync (PostgreSQL) " PG_VERSION);
159  exit(0);
160  }
161  }
162 
163  while ((option = getopt_long(argc, argv, "f:s:",
164  long_options, &optindex)) != -1)
165  {
166  switch (option)
167  {
168  case 'f':
169  filename = strdup(optarg);
170  break;
171 
172  case 's':
173  secs_per_test = atoi(optarg);
174  break;
175 
176  default:
177  fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
178  progname);
179  exit(1);
180  break;
181  }
182  }
183 
184  if (argc > optind)
185  {
186  fprintf(stderr,
187  _("%s: too many command-line arguments (first is \"%s\")\n"),
188  progname, argv[optind]);
189  fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
190  progname);
191  exit(1);
192  }
193 
194  printf(_("%d seconds per test\n"), secs_per_test);
195 #if PG_O_DIRECT != 0
196  printf(_("O_DIRECT supported on this platform for open_datasync and open_sync.\n"));
197 #else
198  printf(_("Direct I/O is not supported on this platform.\n"));
199 #endif
200 }
static int secs_per_test
Definition: pg_test_fsync.c:64
static char * filename
Definition: pg_test_fsync.c:68
int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)
Definition: getopt_long.c:57
#define required_argument
Definition: getopt_long.h:25
int optind
Definition: getopt.c:51
static const char * progname
Definition: pg_test_fsync.c:62
#define NULL
Definition: c.h:229
char * optarg
Definition: getopt.c:53
#define _(x)
Definition: elog.c:84
int main ( int  argc,
char *  argv[] 
)

Definition at line 98 of file pg_test_fsync.c.

References filename, get_progname(), handle_args(), PG_TEXTDOMAIN, pqsignal(), prepare_buf(), process_alarm(), progname, set_pglocale_pgservice(), SIGALRM, SIGHUP, signal_cleanup(), test_file_descriptor_sync(), test_non_sync(), test_open(), test_open_syncs(), test_sync(), and unlink().

99 {
100  set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync"));
101  progname = get_progname(argv[0]);
102 
103  handle_args(argc, argv);
104 
105  /* Prevent leaving behind the test file */
106  pqsignal(SIGINT, signal_cleanup);
107  pqsignal(SIGTERM, signal_cleanup);
108 #ifndef WIN32
110 #endif
111 #ifdef SIGHUP
112  /* Not defined on win32 */
114 #endif
115 
116  prepare_buf();
117 
118  test_open();
119 
120  /* Test using 1 XLOG_BLCKSZ write */
121  test_sync(1);
122 
123  /* Test using 2 XLOG_BLCKSZ writes */
124  test_sync(2);
125 
126  test_open_syncs();
127 
129 
130  test_non_sync();
131 
132  unlink(filename);
133 
134  return 0;
135 }
static void test_sync(int writes_per_op)
static char * filename
Definition: pg_test_fsync.c:68
const char * get_progname(const char *argv0)
Definition: path.c:453
static void test_open(void)
static void prepare_buf(void)
static const char * progname
Definition: pg_test_fsync.c:62
int unlink(const char *filename)
#define PG_TEXTDOMAIN(domain)
Definition: c.h:1012
static void test_open_syncs(void)
static void test_non_sync(void)
#define SIGHUP
Definition: win32.h:188
static void process_alarm(int sig)
pqsigfunc pqsignal(int signum, pqsigfunc handler)
Definition: signal.c:168
static void signal_cleanup(int sig)
void set_pglocale_pgservice(const char *argv0, const char *app)
Definition: exec.c:550
static void test_file_descriptor_sync(void)
#define SIGALRM
Definition: win32.h:194
static void handle_args(int argc, char *argv[])
static void prepare_buf ( void  )
static

Definition at line 203 of file pg_test_fsync.c.

References buf, full_buf, random(), and TYPEALIGN.

Referenced by main().

204 {
205  int ops;
206 
207  /* write random data into buffer */
208  for (ops = 0; ops < XLOG_SEG_SIZE; ops++)
209  full_buf[ops] = random();
210 
211  buf = (char *) TYPEALIGN(XLOG_BLCKSZ, full_buf);
212 }
static char full_buf[XLOG_SEG_SIZE]
Definition: pg_test_fsync.c:66
long random(void)
Definition: random.c:22
static char * buf
Definition: pg_test_fsync.c:66
#define TYPEALIGN(ALIGNVAL, LEN)
Definition: c.h:581
static void print_elapse ( struct timeval  start_t,
struct timeval  stop_t,
int  ops 
)
static

Definition at line 573 of file pg_test_fsync.c.

References OPS_FORMAT, and USECS_SEC.

574 {
575  double total_time = (stop_t.tv_sec - start_t.tv_sec) +
576  (stop_t.tv_usec - start_t.tv_usec) * 0.000001;
577  double per_second = ops / total_time;
578  double avg_op_time_us = (total_time / ops) * USECS_SEC;
579 
580  printf(OPS_FORMAT "\n", per_second, avg_op_time_us);
581 }
#define USECS_SEC
Definition: pg_test_fsync.c:30
static struct timeval start_t stop_t
Definition: pg_test_fsync.c:69
#define OPS_FORMAT
Definition: pg_test_fsync.c:29
static void process_alarm ( int  sig)
static

Definition at line 585 of file pg_test_fsync.c.

References alarm_triggered.

Referenced by main().

586 {
587  alarm_triggered = true;
588 }
static bool alarm_triggered
Definition: pg_test_fsync.c:71
static void signal_cleanup ( int  sig)
static

Definition at line 543 of file pg_test_fsync.c.

References filename, needs_unlink, and unlink().

Referenced by main().

544 {
545  /* Delete the file if it exists. Ignore errors */
546  if (needs_unlink)
547  unlink(filename);
548  /* Finish incomplete line on stdout */
549  puts("");
550  exit(signum);
551 }
static char * filename
Definition: pg_test_fsync.c:68
int unlink(const char *filename)
static int needs_unlink
Definition: pg_test_fsync.c:65
static void test_file_descriptor_sync ( void  )
static

Definition at line 449 of file pg_test_fsync.c.

References _, alarm_triggered, buf, close, die(), filename, fsync, LABEL_FORMAT, START_TIMER, STOP_TIMER, and write.

Referenced by main().

450 {
451  int tmpfile,
452  ops;
453 
454  /*
455  * Test whether fsync can sync data written on a different descriptor for
456  * the same file. This checks the efficiency of multi-process fsyncs
457  * against the same file. Possibly this should be done with writethrough
458  * on platforms which support it.
459  */
460  printf(_("\nTest if fsync on non-write file descriptor is honored:\n"));
461  printf(_("(If the times are similar, fsync() can sync data written on a different\n"
462  "descriptor.)\n"));
463 
464  /*
465  * first write, fsync and close, which is the normal behavior without
466  * multiple descriptors
467  */
468  printf(LABEL_FORMAT, "write, fsync, close");
469  fflush(stdout);
470 
471  START_TIMER;
472  for (ops = 0; alarm_triggered == false; ops++)
473  {
474  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
475  die("could not open output file");
476  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
477  die("write failed");
478  if (fsync(tmpfile) != 0)
479  die("fsync failed");
480  close(tmpfile);
481 
482  /*
483  * open and close the file again to be consistent with the following
484  * test
485  */
486  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
487  die("could not open output file");
488  close(tmpfile);
489  }
490  STOP_TIMER;
491 
492  /*
493  * Now open, write, close, open again and fsync This simulates processes
494  * fsyncing each other's writes.
495  */
496  printf(LABEL_FORMAT, "write, close, fsync");
497  fflush(stdout);
498 
499  START_TIMER;
500  for (ops = 0; alarm_triggered == false; ops++)
501  {
502  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
503  die("could not open output file");
504  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
505  die("write failed");
506  close(tmpfile);
507  /* reopen file */
508  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
509  die("could not open output file");
510  if (fsync(tmpfile) != 0)
511  die("fsync failed");
512  close(tmpfile);
513  }
514  STOP_TIMER;
515 }
static char * filename
Definition: pg_test_fsync.c:68
#define write(a, b, c)
Definition: win32.h:14
static void die(const char *str)
static bool alarm_triggered
Definition: pg_test_fsync.c:71
static char * buf
Definition: pg_test_fsync.c:66
#define fsync(fd)
Definition: win32.h:62
#define STOP_TIMER
Definition: pg_test_fsync.c:55
#define LABEL_FORMAT
Definition: pg_test_fsync.c:27
#define START_TIMER
Definition: pg_test_fsync.c:34
#define close(a)
Definition: win32.h:12
#define _(x)
Definition: elog.c:84
static void test_non_sync ( void  )
static

Definition at line 518 of file pg_test_fsync.c.

References _, alarm_triggered, buf, close, die(), filename, LABEL_FORMAT, START_TIMER, STOP_TIMER, write, and XLOG_BLCKSZ_K.

Referenced by main().

519 {
520  int tmpfile,
521  ops;
522 
523  /*
524  * Test a simple write without fsync
525  */
526  printf(_("\nNon-sync'ed %dkB writes:\n"), XLOG_BLCKSZ_K);
527  printf(LABEL_FORMAT, "write");
528  fflush(stdout);
529 
530  START_TIMER;
531  for (ops = 0; alarm_triggered == false; ops++)
532  {
533  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
534  die("could not open output file");
535  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
536  die("write failed");
537  close(tmpfile);
538  }
539  STOP_TIMER;
540 }
static char * filename
Definition: pg_test_fsync.c:68
#define write(a, b, c)
Definition: win32.h:14
static void die(const char *str)
static bool alarm_triggered
Definition: pg_test_fsync.c:71
static char * buf
Definition: pg_test_fsync.c:66
#define XLOG_BLCKSZ_K
Definition: pg_test_fsync.c:25
#define STOP_TIMER
Definition: pg_test_fsync.c:55
#define LABEL_FORMAT
Definition: pg_test_fsync.c:27
#define START_TIMER
Definition: pg_test_fsync.c:34
#define close(a)
Definition: win32.h:12
#define _(x)
Definition: elog.c:84
static void test_open ( void  )
static

Definition at line 215 of file pg_test_fsync.c.

References close, die(), filename, fsync, full_buf, needs_unlink, and write.

Referenced by main().

216 {
217  int tmpfile;
218 
219  /*
220  * test if we can open the target file
221  */
222  if ((tmpfile = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1)
223  die("could not open output file");
224  needs_unlink = 1;
225  if (write(tmpfile, full_buf, XLOG_SEG_SIZE) != XLOG_SEG_SIZE)
226  die("write failed");
227 
228  /* fsync now so that dirty buffers don't skew later tests */
229  if (fsync(tmpfile) != 0)
230  die("fsync failed");
231 
232  close(tmpfile);
233 }
static char full_buf[XLOG_SEG_SIZE]
Definition: pg_test_fsync.c:66
static char * filename
Definition: pg_test_fsync.c:68
#define write(a, b, c)
Definition: win32.h:14
static void die(const char *str)
#define fsync(fd)
Definition: win32.h:62
static int needs_unlink
Definition: pg_test_fsync.c:65
#define close(a)
Definition: win32.h:12
static void test_open_sync ( const char *  msg,
int  writes_size 
)
static

Definition at line 414 of file pg_test_fsync.c.

References _, alarm_triggered, buf, close, die(), filename, LABEL_FORMAT, NA_FORMAT, PG_O_DIRECT, START_TIMER, STOP_TIMER, and write.

Referenced by test_open_syncs().

415 {
416 #ifdef OPEN_SYNC_FLAG
417  int tmpfile,
418  ops,
419  writes;
420 #endif
421 
422  printf(LABEL_FORMAT, msg);
423  fflush(stdout);
424 
425 #ifdef OPEN_SYNC_FLAG
426  if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
427  printf(NA_FORMAT, _("n/a*\n"));
428  else
429  {
430  START_TIMER;
431  for (ops = 0; alarm_triggered == false; ops++)
432  {
433  for (writes = 0; writes < 16 / writes_size; writes++)
434  if (write(tmpfile, buf, writes_size * 1024) !=
435  writes_size * 1024)
436  die("write failed");
437  if (lseek(tmpfile, 0, SEEK_SET) == -1)
438  die("seek failed");
439  }
440  STOP_TIMER;
441  close(tmpfile);
442  }
443 #else
444  printf(NA_FORMAT, _("n/a\n"));
445 #endif
446 }
#define PG_O_DIRECT
Definition: xlogdefs.h:65
static char * filename
Definition: pg_test_fsync.c:68
#define write(a, b, c)
Definition: win32.h:14
static void die(const char *str)
static bool alarm_triggered
Definition: pg_test_fsync.c:71
static char * buf
Definition: pg_test_fsync.c:66
#define NA_FORMAT
Definition: pg_test_fsync.c:28
#define STOP_TIMER
Definition: pg_test_fsync.c:55
#define LABEL_FORMAT
Definition: pg_test_fsync.c:27
#define START_TIMER
Definition: pg_test_fsync.c:34
#define close(a)
Definition: win32.h:12
#define _(x)
Definition: elog.c:84
static void test_open_syncs ( void  )
static

Definition at line 397 of file pg_test_fsync.c.

References _, and test_open_sync().

Referenced by main().

398 {
399  printf(_("\nCompare open_sync with different write sizes:\n"));
400  printf(_("(This is designed to compare the cost of writing 16kB in different write\n"
401  "open_sync sizes.)\n"));
402 
403  test_open_sync(_(" 1 * 16kB open_sync write"), 16);
404  test_open_sync(_(" 2 * 8kB open_sync writes"), 8);
405  test_open_sync(_(" 4 * 4kB open_sync writes"), 4);
406  test_open_sync(_(" 8 * 2kB open_sync writes"), 2);
407  test_open_sync(_("16 * 1kB open_sync writes"), 1);
408 }
#define _(x)
Definition: elog.c:84
static void test_open_sync(const char *msg, int writes_size)
static void test_sync ( int  writes_per_op)
static

Definition at line 236 of file pg_test_fsync.c.

References _, alarm_triggered, buf, close, die(), filename, fsync, LABEL_FORMAT, NA_FORMAT, O_DSYNC, pg_fsync_writethrough(), PG_O_DIRECT, START_TIMER, STOP_TIMER, write, and XLOG_BLCKSZ_K.

Referenced by main().

237 {
238  int tmpfile,
239  ops,
240  writes;
241  bool fs_warning = false;
242 
243  if (writes_per_op == 1)
244  printf(_("\nCompare file sync methods using one %dkB write:\n"), XLOG_BLCKSZ_K);
245  else
246  printf(_("\nCompare file sync methods using two %dkB writes:\n"), XLOG_BLCKSZ_K);
247  printf(_("(in wal_sync_method preference order, except fdatasync is Linux's default)\n"));
248 
249  /*
250  * Test open_datasync if available
251  */
252  printf(LABEL_FORMAT, "open_datasync");
253  fflush(stdout);
254 
255 #ifdef OPEN_DATASYNC_FLAG
256  if ((tmpfile = open(filename, O_RDWR | O_DSYNC | PG_O_DIRECT, 0)) == -1)
257  {
258  printf(NA_FORMAT, _("n/a*\n"));
259  fs_warning = true;
260  }
261  else
262  {
263  START_TIMER;
264  for (ops = 0; alarm_triggered == false; ops++)
265  {
266  for (writes = 0; writes < writes_per_op; writes++)
267  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
268  die("write failed");
269  if (lseek(tmpfile, 0, SEEK_SET) == -1)
270  die("seek failed");
271  }
272  STOP_TIMER;
273  close(tmpfile);
274  }
275 #else
276  printf(NA_FORMAT, _("n/a\n"));
277 #endif
278 
279 /*
280  * Test fdatasync if available
281  */
282  printf(LABEL_FORMAT, "fdatasync");
283  fflush(stdout);
284 
285 #ifdef HAVE_FDATASYNC
286  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
287  die("could not open output file");
288  START_TIMER;
289  for (ops = 0; alarm_triggered == false; ops++)
290  {
291  for (writes = 0; writes < writes_per_op; writes++)
292  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
293  die("write failed");
294  fdatasync(tmpfile);
295  if (lseek(tmpfile, 0, SEEK_SET) == -1)
296  die("seek failed");
297  }
298  STOP_TIMER;
299  close(tmpfile);
300 #else
301  printf(NA_FORMAT, _("n/a\n"));
302 #endif
303 
304 /*
305  * Test fsync
306  */
307  printf(LABEL_FORMAT, "fsync");
308  fflush(stdout);
309 
310  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
311  die("could not open output file");
312  START_TIMER;
313  for (ops = 0; alarm_triggered == false; ops++)
314  {
315  for (writes = 0; writes < writes_per_op; writes++)
316  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
317  die("write failed");
318  if (fsync(tmpfile) != 0)
319  die("fsync failed");
320  if (lseek(tmpfile, 0, SEEK_SET) == -1)
321  die("seek failed");
322  }
323  STOP_TIMER;
324  close(tmpfile);
325 
326 /*
327  * If fsync_writethrough is available, test as well
328  */
329  printf(LABEL_FORMAT, "fsync_writethrough");
330  fflush(stdout);
331 
332 #ifdef HAVE_FSYNC_WRITETHROUGH
333  if ((tmpfile = open(filename, O_RDWR, 0)) == -1)
334  die("could not open output file");
335  START_TIMER;
336  for (ops = 0; alarm_triggered == false; ops++)
337  {
338  for (writes = 0; writes < writes_per_op; writes++)
339  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
340  die("write failed");
341  if (pg_fsync_writethrough(tmpfile) != 0)
342  die("fsync failed");
343  if (lseek(tmpfile, 0, SEEK_SET) == -1)
344  die("seek failed");
345  }
346  STOP_TIMER;
347  close(tmpfile);
348 #else
349  printf(NA_FORMAT, _("n/a\n"));
350 #endif
351 
352 /*
353  * Test open_sync if available
354  */
355  printf(LABEL_FORMAT, "open_sync");
356  fflush(stdout);
357 
358 #ifdef OPEN_SYNC_FLAG
359  if ((tmpfile = open(filename, O_RDWR | OPEN_SYNC_FLAG | PG_O_DIRECT, 0)) == -1)
360  {
361  printf(NA_FORMAT, _("n/a*\n"));
362  fs_warning = true;
363  }
364  else
365  {
366  START_TIMER;
367  for (ops = 0; alarm_triggered == false; ops++)
368  {
369  for (writes = 0; writes < writes_per_op; writes++)
370  if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
371 
372  /*
373  * This can generate write failures if the filesystem has
374  * a large block size, e.g. 4k, and there is no support
375  * for O_DIRECT writes smaller than the file system block
376  * size, e.g. XFS.
377  */
378  die("write failed");
379  if (lseek(tmpfile, 0, SEEK_SET) == -1)
380  die("seek failed");
381  }
382  STOP_TIMER;
383  close(tmpfile);
384  }
385 #else
386  printf(NA_FORMAT, _("n/a\n"));
387 #endif
388 
389  if (fs_warning)
390  {
391  printf(_("* This file system and its mount options do not support direct\n"
392  " I/O, e.g. ext4 in journaled mode.\n"));
393  }
394 }
#define PG_O_DIRECT
Definition: xlogdefs.h:65
static char * filename
Definition: pg_test_fsync.c:68
#define write(a, b, c)
Definition: win32.h:14
int pg_fsync_writethrough(int fd)
Definition: fd.c:362
static void die(const char *str)
static bool alarm_triggered
Definition: pg_test_fsync.c:71
#define O_DSYNC
Definition: win32.h:270
static char * buf
Definition: pg_test_fsync.c:66
#define NA_FORMAT
Definition: pg_test_fsync.c:28
#define XLOG_BLCKSZ_K
Definition: pg_test_fsync.c:25
#define fsync(fd)
Definition: win32.h:62
#define STOP_TIMER
Definition: pg_test_fsync.c:55
#define LABEL_FORMAT
Definition: pg_test_fsync.c:27
#define START_TIMER
Definition: pg_test_fsync.c:34
#define close(a)
Definition: win32.h:12
#define _(x)
Definition: elog.c:84

Variable Documentation

bool alarm_triggered = false
static
char * buf
static

Definition at line 66 of file pg_test_fsync.c.

Referenced by _bt_clear_incomplete_split(), _bt_doinsert(), _bt_endpoint(), _bt_findinsertloc(), _bt_first(), _bt_get_endpoint(), _bt_getbuf(), _bt_getstackbuf(), _bt_is_page_halfdead(), _bt_killitems(), _bt_moveright(), _bt_relandgetbuf(), _bt_unlink_halfdead_page(), _bt_walk_left(), _conv(), _discoverArchiveFormat(), _EndBlob(), _hash_doinsert(), _hash_first(), _hash_getbucketbuf_from_hashkey(), _hash_getbuf(), _hash_getbuf_with_condlock_cleanup(), _hash_getbuf_with_strategy(), _hash_getinitbuf(), _hash_getnewbuf(), _hash_init(), _hash_next(), _hash_step(), _PG_init(), _PrintFileData(), _skipData(), _WriteBlobData(), abbroffset(), abstimeout(), abstimerecv(), abstimesend(), add_tablespace_footer(), aes_cbc_decrypt(), AlterSequence(), appendAggOrderBy(), appendConditions(), appendContextKeyword(), appendFunctionName(), appendGroupByClause(), appendOrderByClause(), array_dims(), array_recv(), array_send(), array_to_text_internal(), asyncQueueReadAllNotifications(), b64_decode(), b64_encode(), be_lo_export(), big5_to_euc_tw(), bit_recv(), boolrecv(), boolsend(), bootstrap_template1(), box_recv(), box_send(), bpcharrecv(), bqarr_in(), brin_getinsertbuffer(), brin_vacuum_scan(), brin_xlog_createidx(), brin_xlog_revmap_extend(), bringetbitmap(), brininsert(), brinsummarize(), BSD44_derived_dlsym(), btvacuumpage(), btvacuumscan(), buf_init(), BufferAlloc(), build_client_final_message(), build_client_first_message(), BuildIndexValueDescription(), bytearecv(), cache_single_time(), calc_s2k_iter_salted(), calc_s2k_salted(), calc_s2k_simple(), cash_out(), cash_recv(), cash_send(), cash_words(), charrecv(), charsend(), check_key_cksum(), check_strxfrm_bug(), check_TSCurrentConfig(), CheckForExternalTrigger(), CheckPointTwoPhase(), CheckSCRAMAuth(), checkXLogConsistency(), ChooseIndexColumnNames(), ChooseIndexNameAddition(), cidr_recv(), cidrecv(), cidsend(), circle_recv(), circle_send(), cluster_conn_opts(), compile_pltcl_function(), complex_recv(), complex_send(), ConditionalLockBuffer(), conninfo_parse(), conninfo_uri_decode(), conninfo_uri_parse_options(), constructConnStr(), ConvertTriggerToFK(), copy_file_range(), copy_heap_data(), copy_read_data(), copy_relation_data(), CopyGetInt16(), CopyGetInt32(), CopySendInt16(), CopySendInt32(), count_nondeletable_pages(), create_cursor(), createBackupLabel(), cstring_recv(), cstring_send(), cube_out(), date_out(), date_recv(), date_send(), date_test_fmt(), datum_to_json(), datum_to_jsonb(), dblink_close(), dblink_fdw_validator(), dblink_fetch(), dblink_open(), decrypt_read(), DeleteAllExportedSnapshotFiles(), deparse_expression_pretty(), deparseAggref(), deparseArrayExpr(), deparseArrayRef(), deparseBoolExpr(), deparseConst(), deparseDirectDeleteSql(), deparseDirectUpdateSql(), deparseDistinctExpr(), deparseExplicitTargetList(), deparseFromExpr(), deparseFromExprForRel(), deparseFuncExpr(), deparseLockingClause(), deparseNullTest(), deparseOpExpr(), deparseScalarArrayOpExpr(), deparseSelectSql(), deparseSelectStmtForRel(), deparseSortGroupClause(), deparseSubqueryTargetList(), describeAccessMethods(), describeAggregates(), describeFunctions(), describeOneTableDetails(), describeOneTSConfig(), describeOneTSParser(), describeOperators(), describePublications(), describeRoles(), describeSubscriptions(), describeTableDetails(), describeTablespaces(), describeTypes(), DispatchJobForTocEntry(), do_compile(), do_lo_list(), do_setval(), domain_recv(), dropRoles(), dsm_cleanup_for_mmap(), dump_lo_buf(), dumpBlobs(), dumpCreateDB(), dumpDatabaseConfig(), dumpDbRoleConfig(), dumpGroups(), dumpRoleMembership(), dumpRoles(), dumpTablespaces(), dumpTimestamp(), dumpUserConfig(), ean13_out(), ean2isn(), enum_recv(), enum_send(), escape_param_str(), escape_xml(), euc_tw_to_big5(), exec_command_password(), exec_describe_statement_message(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecEvalXmlExpr(), ExecQueryUsingCursor(), ExecuteSimpleCommands(), expand_fmt_string(), expand_grouping_sets(), ExplainPropertyFloat(), ExplainPropertyInteger(), ExplainPropertyLong(), exportFile(), ExportSnapshot(), file_fdw_validator(), fill_seq_with_data(), find_provider(), FindStreamingStart(), FinishPreparedTransaction(), flatten_reloptions(), flatten_set_variable_args(), float4_numeric(), float4recv(), float4send(), float8_numeric(), float8recv(), float8send(), flush_pipe_input(), fmtlong(), format_aggregate_signature(), format_operator_internal(), format_procedure_internal(), format_type_internal(), formatPGVersionNumber(), FreePageManagerDump(), FreeSpaceMapTruncateRel(), fsm_readbuf(), fsm_search(), fsm_set_and_search(), fsm_vacuum_page(), generate_operator_name(), generate_trgm_only(), generate_wildcard_trgm(), get_agg_expr(), get_basic_select_query(), get_coercion_expr(), get_collation_actual_version(), get_column_alias_list(), get_connect_string(), get_const_collation(), get_const_expr(), get_delete_query_def(), get_from_clause(), get_from_clause_coldeflist(), get_from_clause_item(), get_func_expr(), get_insert_query_def(), get_modifiers(), get_oper_expr(), get_prompt(), get_query_def(), get_raw_page_internal(), get_rule_expr(), get_rule_groupingset(), get_rule_orderby(), get_rule_sortgroupclause(), get_rule_windowclause(), get_rule_windowspec(), get_select_query_def(), get_setop_query(), get_special_variable(), get_sql_delete(), get_sql_insert(), get_sql_update(), get_sublink_expr(), get_tablefunc(), get_tablesample_def(), get_target_list(), get_tuple_of_interest(), get_update_query_def(), get_update_query_targetlist_def(), get_utility_query_def(), get_values_def(), get_variable(), get_wildcard_part(), get_windowfunc_expr(), get_with_clause(), getaddrinfo(), GetBufferFromRing(), GetRecordedFreeSpace(), ginCompressPostingList(), gistfixsplit(), handleCopyIn(), handleCopyOut(), hash_xlog_split_page(), hashbucketcleanup(), hashbulkdelete(), hashgettuple(), heap_lock_updated_tuple_rec(), hmac_finish(), hstore_recv(), hstore_send(), hstorePairs(), ignore_boolean_expression(), importFile(), inet_recv(), infile(), init_params(), InitBufferPool(), initialize_worker_spi(), InitLocalBuffers(), int2recv(), int2send(), int2vectorrecv(), int4recv(), int4send(), int8_avg_deserialize(), int8_avg_serialize(), int8out(), int8recv(), int8send(), interval_out(), interval_recv(), interval_send(), is_true_boolean_expression(), isn_out(), isRelDataFile(), json_recv(), json_send(), jsonb_agg_transfn(), jsonb_object_agg_transfn(), jsonb_recv(), jsonb_send(), KnownAssignedXidsDisplay(), lazy_scan_heap(), lazy_vacuum_heap(), lazy_vacuum_rel(), libpqrcv_get_conninfo(), line_recv(), line_send(), listAllDbs(), listCasts(), listCollations(), listConversions(), listDbRoleSettings(), listDefaultACLs(), listDomains(), listEventTriggers(), listExtensionContents(), listExtensions(), listForeignDataWrappers(), listForeignServers(), listForeignTables(), listLanguages(), listOneExtensionContents(), listPublications(), listSchemas(), listTables(), listTSConfigs(), listTSConfigsVerbose(), listTSDictionaries(), listTSParsers(), listTSParsersVerbose(), listTSTemplates(), listUserMappings(), lo_export(), lo_import_internal(), load_resultmap(), locale_date_order(), LockBuffer(), LogicalDecodingProcessRecord(), LogicalRepApplyLoop(), lquery_in(), lquery_out(), lseg_recv(), lseg_send(), ltree_crc32_sz(), ltree_in(), ltree_out(), macaddr8_recv(), macaddr8_send(), macaddr_recv(), macaddr_send(), main(), make_absolute_path(), make_ruledef(), makeAlterConfigCommand(), map_sql_identifier_to_xml_name(), map_sql_value_to_xml_value(), map_xml_name_to_sql_identifier(), mp_px_rand(), mxid_to_string(), namerecv(), namesend(), network_send(), next_field_expand(), next_token(), nextval_internal(), NotifyMyFrontEnd(), num_word(), numeric_abbrev_convert(), numeric_avg_deserialize(), numeric_avg_serialize(), numeric_deserialize(), numeric_poly_deserialize(), numeric_poly_serialize(), numeric_recv(), numeric_send(), numeric_serialize(), objectDescription(), oidrecv(), oidsend(), oidvectorrecv(), output(), overwrite(), pad_eme_pkcs1_v15(), parse_literal_data(), parse_phrase_operator(), parse_snapshot(), parse_tsquery(), parseAclItem(), parseServiceFile(), passwordFromFile(), path_recv(), path_send(), perform_base_backup(), permissionsList(), pg_armor(), pg_b64_decode(), pg_b64_encode(), pg_dearmor(), pg_gen_salt(), pg_gen_salt_rounds(), pg_get_constraintdef_worker(), pg_get_function_arguments(), pg_get_function_identity_arguments(), pg_get_function_result(), pg_get_functiondef(), pg_get_indexdef_worker(), pg_get_partkeydef_worker(), pg_get_ruledef_worker(), pg_get_statisticsobj_worker(), pg_get_triggerdef_worker(), pg_get_viewdef_worker(), pg_local_sendauth(), pg_lsn_mi(), pg_lsn_out(), pg_lsn_recv(), pg_lsn_send(), pg_prewarm(), pg_random_uuid(), pg_saslprep(), pg_sequence_last_value(), pg_size_pretty(), pgp_armor_decode(), pgp_encrypt(), pgp_extract_armor_headers(), pgp_key_id_w(), pgp_mpi_hash(), pgp_mpi_write(), pgrowlocks(), pgstat_btree_page(), pgstat_gist_page(), pgstat_hash_page(), pgstathashindex(), PGTYPESdate_to_asc(), PGTYPESinterval_to_asc(), PGTYPESnumeric_div(), PGTYPEStimestamp_to_asc(), pgwin32_recv(), pgwin32_select(), pgwin32_waitforsinglesocket(), pgxmlNodeSetToText(), pickout(), PLy_exception_set(), PLy_exception_set_plural(), point_recv(), point_send(), poly2path(), poly_recv(), poly_send(), postgres_fdw_validator(), postgresImportForeignSchema(), PostgresMain(), postgresql_fdw_validator(), PQoidStatus(), prefix_init(), prepare_buf(), PrescanPreparedTransactions(), print_wchar_str(), PrintBufferLeakWarning(), PrintQueryStatus(), printRemoteParam(), printRemotePlaceholder(), printsimple(), printsimple_startup(), printSubscripts(), printtup(), printtup_20(), printtup_internal_20(), process_file(), process_pipe_input(), processIndirection(), ProcessStartupPacket(), ProcessTwoPhaseBuffer(), ProcSleep(), prompt_for_password(), psql_get_variable(), puttzcode(), puttzcode64(), pwdfMatchesString(), px_debug(), px_find_combo(), qtext_load_file(), queryin(), quote_qualified_identifier(), range_bound_escape(), range_deparse(), range_parse_bound(), range_recv(), range_send(), read_binary_file(), read_file_contents(), read_text_file(), read_whole_file(), ReadBufferExtended(), ReadDataFromArchiveNone(), ReadStr(), readtup_alloc(), ReadTwoPhaseFile(), ReadyForQuery(), ReceiveCopyBegin(), record_in(), record_out(), record_recv(), record_send(), RecoverPreparedTransactions(), recv_password_packet(), regression_main(), RelationFindReplTupleByIndex(), RelationFindReplTupleSeq(), reltimeout(), reltimerecv(), reltimesend(), repairDependencyLoop(), replace_text_regexp(), report_invalid_encoding(), report_untranslatable_char(), ResetSequence(), restore(), restoreTwoPhaseData(), revmap_physical_extend(), rm_redo_error_callback(), run_crypt_des(), sanitize_char(), send_message_to_frontend(), send_message_to_server_log(), sendAuthRequest(), SendBackupHeader(), SendCopyBegin(), sendFile(), sendFileWithContent(), SendFunctionResult(), SendQuery(), SendRowDescriptionMessage(), SendTimeLineHistory(), SendXlogRecPtrResult(), sepgsql_audit_log(), serialize_deflist(), show_log_file_mode(), show_unix_socket_permissions(), ShowTransactionStateRec(), simple_prompt(), SortTocFromFile(), SPI_result_code_string(), SplitToVariants(), ssl_extension_info(), StandbyRecoverPreparedTransactions(), StandbyTransactionIdIsPrepared(), StartBackgroundWorker(), StartBufferIO(), StartLogicalReplication(), StartReplication(), StartupXLOG(), statapprox_heap(), stop_postmaster(), str_time(), StrategyGetBuffer(), strerror(), string2ean(), t_readline(), tar_write(), test_file_descriptor_sync(), test_non_sync(), test_open_sync(), test_sync(), textrecv(), textsend(), tidout(), tidrecv(), tidsend(), time_out(), time_recv(), time_send(), timeofday(), timestamp_out(), timestamp_recv(), timestamp_send(), timestamptz_out(), timestamptz_recv(), timestamptz_send(), timestamptz_to_str(), timetz_out(), timetz_recv(), timetz_send(), tintervalrecv(), tintervalsend(), to_hex32(), to_hex64(), TQSendRecordInfo(), truncate_identifier(), try_complete_step(), ts_stat_sql(), tsquery_rewrite_query(), tsqueryrecv(), tsquerysend(), tsvectorin(), tsvectorrecv(), tsvectorsend(), txid_snapshot_recv(), txid_snapshot_send(), typeStringToTypeName(), unaccent_lexize(), unknownrecv(), unknownsend(), unpack_sql_state(), uuid_generate_v1mc(), uuid_out(), vacuum_one_database(), vacuumlo(), varbit_recv(), varbit_send(), varcharrecv(), vm_readbuf(), void_send(), WaitForCommands(), WalReceiverMain(), write_auto_conf_file(), write_csvlog(), write_target_range(), xidrecv(), xidsend(), XLogDumpXLogRead(), XLogInitBufferForRedo(), XLogInsertRecord(), XLogRead(), XLogRecordPageWithFreeSpace(), XLOGShmemSize(), xml_out_internal(), xml_recv(), xml_send(), xmlcomment(), xmlconcat(), xmlpi(), xmlroot(), and yearistype().

char full_buf[XLOG_SEG_SIZE]
static

Definition at line 66 of file pg_test_fsync.c.

Referenced by prepare_buf(), and test_open().

int needs_unlink = 0
static

Definition at line 65 of file pg_test_fsync.c.

Referenced by signal_cleanup(), and test_open().

const char* progname
static

Definition at line 62 of file pg_test_fsync.c.

Referenced by handle_args(), and main().

int secs_per_test = 5
static

Definition at line 64 of file pg_test_fsync.c.

Referenced by handle_args().

struct timeval start_t stop_t
static

Definition at line 69 of file pg_test_fsync.c.