summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist/s_string.ok5
-rw-r--r--src/os_win/os_fs.c23
2 files changed, 13 insertions, 15 deletions
diff --git a/dist/s_string.ok b/dist/s_string.ok
index 39b6b163cd9..1f7f7d9fd3a 100644
--- a/dist/s_string.ok
+++ b/dist/s_string.ok
@@ -225,8 +225,10 @@ MEMALIGN
MERCHANTABILITY
METADATA
MONGODB
+MOVEFILE
MRXB
MRXBOPC
+MSDN
MSVC
MULTI
MULTIBLOCK
@@ -240,8 +242,7 @@ Metadata
Mewhort
Mitzenmacher
MongoDB
-MoveFile
-MoveFileW
+MoveFileExW
Multi
MultiByteToWideChar
Multithreaded
diff --git a/src/os_win/os_fs.c b/src/os_win/os_fs.c
index 2f76fff04a5..5cf47ea5763 100644
--- a/src/os_win/os_fs.c
+++ b/src/os_win/os_fs.c
@@ -87,22 +87,19 @@ __win_fs_rename(WT_FILE_SYSTEM *file_system,
WT_ERR(__wt_to_utf16_string(session, to, &to_wide));
/*
- * Check if file exists since Windows does not override the file if
- * it exists.
+ * We want an atomic rename, but that's not guaranteed by MoveFileExW
+ * (or by any MSDN API). Don't set the MOVEFILE_COPY_ALLOWED flag to
+ * prevent the system from falling back to a copy and delete process.
+ * Do set the MOVEFILE_WRITE_THROUGH flag so the window is as small
+ * as possible, just in case. WiredTiger renames are done in a single
+ * directory and we expect that to be an atomic metadata update on any
+ * modern filesystem.
*/
- if (GetFileAttributesW(to_wide->data) != INVALID_FILE_ATTRIBUTES)
- if (DeleteFileW(to_wide->data) == FALSE) {
- windows_error = __wt_getlasterror();
- __wt_errx(session,
- "%s: file-rename: DeleteFileW: %s",
- to, __wt_formatmessage(session, windows_error));
- WT_ERR(__wt_map_windows_error(windows_error));
- }
-
- if (MoveFileW(from_wide->data, to_wide->data) == FALSE) {
+ if (MoveFileExW(from_wide->data, to_wide->data,
+ MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH) == FALSE) {
windows_error = __wt_getlasterror();
__wt_errx(session,
- "%s to %s: file-rename: MoveFileW: %s",
+ "%s to %s: file-rename: MoveFileExW: %s",
from, to, __wt_formatmessage(session, windows_error));
WT_ERR(__wt_map_windows_error(windows_error));
}