1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-25 20:23:07 +03:00

Support direct I/O on macOS.

Macs don't understand O_DIRECT, but they can disable caching with a
separate fcntl() call.  Extend the file opening functions in fd.c to
handle this for us if the caller passes in PG_O_DIRECT.

For now, this affects only WAL data and even then only if you set:

  max_wal_senders=0
  wal_level=minimal

This is not expected to be very useful on its own, but later proposed
patches will make greater use of direct I/O, and it'll be useful for
testing if developers on Macs can see the effects.

Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/CA%2BhUKG%2BADiyyHe0cun2wfT%2BSVnFVqNYPxoO6J9zcZkVO7%2BNGig%40mail.gmail.com
This commit is contained in:
Thomas Munro
2021-07-19 08:52:00 +12:00
parent f157db8622
commit 2dbe890571
4 changed files with 83 additions and 19 deletions

View File

@@ -1057,10 +1057,46 @@ BasicOpenFilePerm(const char *fileName, int fileFlags, mode_t fileMode)
int fd;
tryAgain:
#ifdef PG_O_DIRECT_USE_F_NOCACHE
/*
* The value we defined to stand in for O_DIRECT when simulating it with
* F_NOCACHE had better not collide with any of the standard flags.
*/
StaticAssertStmt((PG_O_DIRECT &
(O_APPEND |
O_CLOEXEC |
O_CREAT |
O_DSYNC |
O_RDWR |
O_RDONLY |
O_SYNC |
O_TRUNC |
O_WRONLY)) == 0,
"PG_O_DIRECT value collides with standard flag");
fd = open(fileName, fileFlags & ~PG_O_DIRECT, fileMode);
#else
fd = open(fileName, fileFlags, fileMode);
#endif
if (fd >= 0)
{
#ifdef PG_O_DIRECT_USE_F_NOCACHE
if (fileFlags & PG_O_DIRECT)
{
if (fcntl(fd, F_NOCACHE, 1) < 0)
{
int save_errno = errno;
close(fd);
errno = save_errno;
return -1;
}
}
#endif
return fd; /* success! */
}
if (errno == EMFILE || errno == ENFILE)
{