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:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user