Re: Allowing WAL fsync to be done via O_SYNC
Bruce Momjian <pgman@candle.pha.pa.us>
From: Bruce Momjian <pgman@candle.pha.pa.us>
To: Bruce Momjian <pgman@candle.pha.pa.us>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Peter Eisentraut <peter_e@gmx.net>, pgsql-hackers@postgresql.org
Date: 2001-03-15T20:36:36Z
Lists: pgsql-hackers
> > I've been mentally working through the code, and see only one reason why > > it might be necessary to go with a compile-time choice: suppose we see > > that none of O_DSYNC, O_SYNC, O_FSYNC, [others] are defined? With the > > compile-time choice it's easy: #define USE_FSYNC_FOR_WAL, and sail on. > > If it's a GUC variable then we need a way to prevent the GUC option from > > becoming unset (which would disable the fsync() calls, leaving nothing > > to replace 'em). Doable, perhaps, but seems kind of ugly ... any > > thoughts about that? > > I don't think having something a run-time option is always a good idea. > Giving people too many choices is often confusing. > > I think we should just check at compile time, and choose O_* if we have > it, and if not, use fsync(). No one will ever do the proper timing > tests to know which is better except us. Also, it seems O_* should be > faster because you are fsync'ing the buffer you just wrote, so there is > no looking around for dirty buffers like fsync(). I later read Vadim's comment that fsync() of two blocks may be faster than two O_* writes, so I am now confused about the proper solution. However, I think we need to pick one and make it invisible to the user. Perhaps a compiler/config.h flag for testing would be a good solution. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026