summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2021-05-05 23:03:01 +0300
committerNikita Malyavin <nikitamalyavin@gmail.com>2021-05-05 23:03:01 +0300
commit509e4990af4d99e9d3c790eabe1c1705ae910b55 (patch)
tree02d4ca9409711baef3ec163adc402f2c380df7c8 /mysys
parent0cc811c633d1fe5290b10fa49fad0a4b889383fa (diff)
parent4f143a88bcb36e94e9edba8a3c5b4a350dcd9bf9 (diff)
downloadmariadb-git-509e4990af4d99e9d3c790eabe1c1705ae910b55.tar.gz
Merge branch bb-10.3-release into bb-10.4-release
Diffstat (limited to 'mysys')
-rw-r--r--mysys/my_delete.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/mysys/my_delete.c b/mysys/my_delete.c
index a0210558dfd..face960c1eb 100644
--- a/mysys/my_delete.c
+++ b/mysys/my_delete.c
@@ -56,6 +56,7 @@ int my_delete(const char *name, myf MyFlags)
#if defined (_WIN32)
+
/*
Delete file.
@@ -63,15 +64,14 @@ int my_delete(const char *name, myf MyFlags)
where another program (or thread in the current program) has the the same file
open.
- We're using 2 tricks to prevent the errors.
+ We're using several tricks to prevent the errors, such as
+
+ - Windows 10 "posix semantics" delete
- 1. A usual Win32's DeleteFile() can with ERROR_SHARED_VIOLATION,
- because the file is opened in another application (often, antivirus or backup)
-
- We avoid the error by using CreateFile() with FILE_FLAG_DELETE_ON_CLOSE, instead
+ - Avoid the error by using CreateFile() with FILE_FLAG_DELETE_ON_CLOSE, instead
of DeleteFile()
- 2. If file which is deleted (delete on close) but has not entirely gone,
+ - If file which is deleted (delete on close) but has not entirely gone,
because it is still opened by some app, an attempt to trcreate file with the
same name would result in yet another error. The workaround here is renaming
a file to unique name.
@@ -114,6 +114,27 @@ static int my_win_unlink(const char *name)
DBUG_RETURN(0);
}
+ /*
+ Try Windows 10 method, delete with "posix semantics" (file is not visible, and creating
+ a file with the same name won't fail, even if it the fiile was open)
+ */
+ struct
+ {
+ DWORD _Flags;
+ } disp={0x3};
+ /* 0x3 = FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS */
+
+ handle= CreateFile(name, DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ BOOL ok= SetFileInformationByHandle(handle,
+ (FILE_INFO_BY_HANDLE_CLASS) 21, &disp, sizeof(disp));
+ CloseHandle(handle);
+ if (ok)
+ DBUG_RETURN(0);
+ }
+
handle= CreateFile(name, DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (handle != INVALID_HANDLE_VALUE)
{