mirror of https://github.com/postgres/postgres
Windows 10 gained support for flushing NTFS files with fdatasync() semantics. The main advantage over open_datasync (in Windows API terms FILE_FLAG_WRITE_THROUGH) is that the latter does not flush SATA drive caches. The default setting is not changed, so users have to opt in to this. Discussion: https://postgr.es/m/CA%2BhUKGJZJVO%3DiX%2Beb-PXi2_XS9ZRqnn_4URh0NUQOwt6-_51xQ%40mail.gmail.compull/94/head
parent
b24b2be119
commit
9430fb407b
@ -0,0 +1,53 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* fdatasync.c |
||||
* Win32 fdatasync() replacement |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
||||
* |
||||
* src/port/fdatasync.c |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
#define UMDF_USING_NTSTATUS |
||||
|
||||
#ifdef FRONTEND |
||||
#include "postgres_fe.h" |
||||
#else |
||||
#include "postgres.h" |
||||
#endif |
||||
|
||||
#include "port/win32ntdll.h" |
||||
|
||||
int |
||||
fdatasync(int fd) |
||||
{ |
||||
IO_STATUS_BLOCK iosb; |
||||
NTSTATUS status; |
||||
HANDLE handle; |
||||
|
||||
handle = (HANDLE) _get_osfhandle(fd); |
||||
if (handle == INVALID_HANDLE_VALUE) |
||||
{ |
||||
errno = EBADF; |
||||
return -1; |
||||
} |
||||
|
||||
if (initialize_ntdll() < 0) |
||||
return -1; |
||||
|
||||
memset(&iosb, 0, sizeof(iosb)); |
||||
status = pg_NtFlushBuffersFileEx(handle, |
||||
FLUSH_FLAGS_FILE_DATA_SYNC_ONLY, |
||||
NULL, |
||||
0, |
||||
&iosb); |
||||
|
||||
if (NT_SUCCESS(status)) |
||||
return 0; |
||||
|
||||
_dosmaperr(pg_RtlNtStatusToDosError(status)); |
||||
return -1; |
||||
} |
Loading…
Reference in new issue