mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Fixing BUG#17719 "Delete of binlog files fails on Windows"
and BUG#19208 "Test 'rpl000017' hangs on Windows". Both bugs are caused by attempting to delete an opened file and to create immediatedly a new one with the same name. On Windows it can be supported only on NT-platforms (by using FILE_SHARE_DELETE mode and with renaming the file before deletion). Because deleting not-closed files is not supported on all platforms (e.g. Win 98|ME) this is to be considered harmful and should be eliminated by a "code redesign". VC++Files/mysys/mysys.vcproj: To be sure that __NT__ is defined for Win configurations. Temporary, to be changed in more appropriate way. include/my_sys.h: Adding my_delete_allow_opened to be invoked to delete a (possibly) not closed file on Windows NT-platforms. mysys/my_delete.c: Adding nt_share_delete() function implementing a (possibly) not closed file deletion on Windows NT. sql/log.cc: MYSQL_LOG::reset_logs(): Deleting usually not closed binlog files.
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="../include,../zlib"
|
||||
PreprocessorDefinitions="_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;USE_SYMDIR"
|
||||
PreprocessorDefinitions="__NT__;_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;USE_SYMDIR"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile=".\debug/mysys.pch"
|
||||
AssemblerListingLocation=".\debug/"
|
||||
@@ -71,7 +71,7 @@
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="../include,../zlib"
|
||||
PreprocessorDefinitions="USE_SYMDIR;NDEBUG;DBUG_OFF;_WINDOWS"
|
||||
PreprocessorDefinitions="__NT__;USE_SYMDIR;NDEBUG;DBUG_OFF;_WINDOWS"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
@@ -121,7 +121,7 @@
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="../include,../zlib"
|
||||
PreprocessorDefinitions="DBUG_OFF;_WINDOWS;NDEBUG"
|
||||
PreprocessorDefinitions="__NT__;DBUG_OFF;_WINDOWS;NDEBUG"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
@@ -170,7 +170,7 @@
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="../include,../zlib"
|
||||
PreprocessorDefinitions="_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;USE_SYMDIR;USE_TLS"
|
||||
PreprocessorDefinitions="__NT__;_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;USE_SYMDIR;USE_TLS"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile=".\mysys___Win32_TLS_DEBUG/mysys.pch"
|
||||
AssemblerListingLocation=".\mysys___Win32_TLS_DEBUG/"
|
||||
@@ -219,7 +219,7 @@
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="../include,../zlib"
|
||||
PreprocessorDefinitions="DBUG_OFF;_WINDOWS;NDEBUG;USE_TLS"
|
||||
PreprocessorDefinitions="__NT__;DBUG_OFF;_WINDOWS;NDEBUG;USE_TLS"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
|
||||
@@ -541,6 +541,7 @@ typedef int (*Process_option_func)(void *ctx, const char *group_name,
|
||||
|
||||
#include <my_alloc.h>
|
||||
|
||||
|
||||
/* Prototypes for mysys and my_func functions */
|
||||
|
||||
extern int my_copy(const char *from,const char *to,myf MyFlags);
|
||||
@@ -613,6 +614,13 @@ extern File my_sopen(const char *path, int oflag, int shflag, int pmode);
|
||||
#endif
|
||||
extern int check_if_legal_filename(const char *path);
|
||||
|
||||
#if defined(__WIN__) && defined(__NT__)
|
||||
extern int nt_share_delete(const char *name,myf MyFlags);
|
||||
#define my_delete_allow_opened(fname,flags) nt_share_delete((fname),(flags))
|
||||
#else
|
||||
#define my_delete_allow_opened(fname,flags) my_delete((fname),(flags))
|
||||
#endif
|
||||
|
||||
#ifndef TERMINATE
|
||||
extern void TERMINATE(FILE *file);
|
||||
#endif
|
||||
|
||||
@@ -32,3 +32,54 @@ int my_delete(const char *name, myf MyFlags)
|
||||
}
|
||||
DBUG_RETURN(err);
|
||||
} /* my_delete */
|
||||
|
||||
#if defined(__WIN__) && defined(__NT__)
|
||||
/*
|
||||
Delete file which is possibly not closed.
|
||||
|
||||
This function is intended to be used exclusively as a temporal solution
|
||||
for Win NT in case when it is needed to delete a not closed file (note
|
||||
that the file must be opened everywhere with FILE_SHARE_DELETE mode).
|
||||
Deleting not-closed files can not be supported on Win 98|ME (and because
|
||||
of that is considered harmful).
|
||||
|
||||
The function deletes the file with its preliminary renaming. This is
|
||||
because when not-closed share-delete file is deleted it still lives on
|
||||
a disk until it will not be closed everwhere. This may conflict with an
|
||||
attempt to create a new file with the same name. The deleted file is
|
||||
renamed to <name>.<num>.deleted where <name> - the initial name of the
|
||||
file, <num> - a hexadecimal number chosen to make the temporal name to
|
||||
be unique.
|
||||
*/
|
||||
int nt_share_delete(const char *name, myf MyFlags)
|
||||
{
|
||||
char buf[MAX_PATH + 20];
|
||||
ulong cnt;
|
||||
DBUG_ENTER("nt_share_delete");
|
||||
DBUG_PRINT("my",("name %s MyFlags %d", name, MyFlags));
|
||||
|
||||
for (cnt= GetTickCount(); cnt; cnt--)
|
||||
{
|
||||
sprintf(buf, "%s.%08X.deleted", name, cnt);
|
||||
if (MoveFile(name, buf))
|
||||
break;
|
||||
|
||||
if ((errno= GetLastError()) == ERROR_ALREADY_EXISTS)
|
||||
continue;
|
||||
|
||||
DBUG_PRINT("warning", ("Failed to rename %s to %s, errno: %d",
|
||||
name, buf, errno));
|
||||
break;
|
||||
}
|
||||
|
||||
if (DeleteFile(buf))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
my_errno= GetLastError();
|
||||
if (MyFlags & (MY_FAE+MY_WME))
|
||||
my_error(EE_DELETE, MYF(ME_BELL + ME_WAITTANG + (MyFlags & ME_NOINPUT)),
|
||||
name, my_errno);
|
||||
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -959,14 +959,14 @@ bool MYSQL_LOG::reset_logs(THD* thd)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
my_delete(linfo.log_file_name, MYF(MY_WME));
|
||||
my_delete_allow_opened(linfo.log_file_name, MYF(MY_WME));
|
||||
if (find_next_log(&linfo, 0))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Start logging with a new file */
|
||||
close(LOG_CLOSE_INDEX);
|
||||
my_delete(index_file_name, MYF(MY_WME)); // Reset (open will update)
|
||||
my_delete_allow_opened(index_file_name, MYF(MY_WME)); // Reset (open will update)
|
||||
if (!thd->slave_thread)
|
||||
need_start_event=1;
|
||||
if (!open_index_file(index_file_name, 0))
|
||||
|
||||
Reference in New Issue
Block a user