|
|
|
@ -85,13 +85,12 @@ typedef uint32 TimeLineID; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Because O_DIRECT bypasses the kernel buffers, and because we never |
|
|
|
|
* read those buffers except during crash recovery, it is a win to use |
|
|
|
|
* it in all cases where we sync on each write(). We could allow O_DIRECT |
|
|
|
|
* with fsync(), but because skipping the kernel buffer forces writes out |
|
|
|
|
* quickly, it seems best just to use it for O_SYNC. It is hard to imagine |
|
|
|
|
* how fsync() could be a win for O_DIRECT compared to O_SYNC and O_DIRECT. |
|
|
|
|
* Also, O_DIRECT is never enough to force data to the drives, it merely |
|
|
|
|
* tries to bypass the kernel cache, so we still need O_SYNC or fsync(). |
|
|
|
|
* read those buffers except during crash recovery or if wal_level != minimal, |
|
|
|
|
* it is a win to use it in all cases where we sync on each write(). We could |
|
|
|
|
* allow O_DIRECT with fsync(), but it is unclear if fsync() could process |
|
|
|
|
* writes not buffered in the kernel. Also, O_DIRECT is never enough to force |
|
|
|
|
* data to the drives, it merely tries to bypass the kernel cache, so we still |
|
|
|
|
* need O_SYNC/O_DSYNC. |
|
|
|
|
*/ |
|
|
|
|
#ifdef O_DIRECT |
|
|
|
|
#define PG_O_DIRECT O_DIRECT |
|
|
|
|