Commit 3c9d4ea8 authored by Gleb Shchepa's avatar Gleb Shchepa

Fixed bug #17823: 'arc' directories inside database directories.

Server created "arc" directories inside database directories and
maintained there useless copies of .frm files.

Creation and renaming procedures of those copies as well as
creation of "arc" directories has been discontinued.
Removal procedure has been kept untouched to be able to
cleanup existent database directories by the DROP DATABASE
query. Also view renaming procedure has been updated to remove
these directories.


sql/parse_file.cc:
  Fixed bug #17823: 'arc' directories inside database directories.
  View/table creation and renaming procedures maintained
  backup copies of .frm files. Those copies are unused yet,
  so this feature was incomplete and unnecessary.
  
  1. Unwanted code has been hidden by FRM_ARCHIVE ifdefs
  (the FRM_ARCHIVE macro is not defined).
  
  2. Renaming procedure has been modified to remove obsolete
  "arc" directories.
sql/parse_file.h:
  Fixed bug #17823: 'arc' directories inside database directories.
  The "thd" parameter has been added to the rename_in_schema_file()
  function.
sql/sql_db.cc:
  Fixed bug #17823: 'arc' directories inside database directories.
  Scope of the mysql_rm_arc_files() function has been changed to
  global for use from the parse_file.cc file.
sql/sql_view.cc:
  Fixed bug #17823: 'arc' directories inside database directories.
  Added the "thd" argument to rename_in_schema_file() calls.
parent ce64a16b
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
#include <my_sys.h> #include <my_sys.h>
#include <my_dir.h> #include <my_dir.h>
/* from sql_db.cc */
extern long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path);
/* /*
write string with escaping write string with escaping
...@@ -265,8 +268,9 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, ...@@ -265,8 +268,9 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
// archive copies management
path[path_end]='\0'; path[path_end]='\0';
#ifdef FRM_ARCHIVE
// archive copies management: disabled unused feature (see bug #17823).
if (!access(path, F_OK)) if (!access(path, F_OK))
{ {
if (old_version != ULONGLONG_MAX && max_versions != 0) if (old_version != ULONGLONG_MAX && max_versions != 0)
...@@ -313,6 +317,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, ...@@ -313,6 +317,7 @@ sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
} }
} }
} }
#endif//FRM_ARCHIVE
{ {
// rename temporary file // rename temporary file
...@@ -337,6 +342,7 @@ err_w_file: ...@@ -337,6 +342,7 @@ err_w_file:
SYNOPSIS SYNOPSIS
rename_in_schema_file rename_in_schema_file
thd thread handler
schema name of given schema schema name of given schema
old_name original file name old_name original file name
new_name new file name new_name new file name
...@@ -348,7 +354,8 @@ err_w_file: ...@@ -348,7 +354,8 @@ err_w_file:
1 - Error (only if renaming of frm failed) 1 - Error (only if renaming of frm failed)
*/ */
my_bool rename_in_schema_file(const char *schema, const char *old_name, my_bool rename_in_schema_file(THD *thd,
const char *schema, const char *old_name,
const char *new_name, ulonglong revision, const char *new_name, ulonglong revision,
uint num_view_backups) uint num_view_backups)
{ {
...@@ -365,10 +372,11 @@ my_bool rename_in_schema_file(const char *schema, const char *old_name, ...@@ -365,10 +372,11 @@ my_bool rename_in_schema_file(const char *schema, const char *old_name,
if (my_rename(old_path, new_path, MYF(MY_WME))) if (my_rename(old_path, new_path, MYF(MY_WME)))
return 1; return 1;
/* check if arc_dir exists */ /* check if arc_dir exists: disabled unused feature (see bug #17823). */
strxnmov(arc_path, FN_REFLEN, mysql_data_home, "/", schema, "/arc", NullS); strxnmov(arc_path, FN_REFLEN, mysql_data_home, "/", schema, "/arc", NullS);
(void) unpack_filename(arc_path, arc_path); (void) unpack_filename(arc_path, arc_path);
#ifdef FRM_ARCHIVE
if (revision > 0 && !access(arc_path, F_OK)) if (revision > 0 && !access(arc_path, F_OK))
{ {
ulonglong limit= ((revision > num_view_backups) ? ulonglong limit= ((revision > num_view_backups) ?
...@@ -384,6 +392,16 @@ my_bool rename_in_schema_file(const char *schema, const char *old_name, ...@@ -384,6 +392,16 @@ my_bool rename_in_schema_file(const char *schema, const char *old_name,
my_rename(old_path, new_path, MYF(0)); my_rename(old_path, new_path, MYF(0));
} }
} }
#else//FRM_ARCHIVE
{ // remove obsolete 'arc' directory and files if any
MY_DIR *new_dirp;
if ((new_dirp = my_dir(arc_path, MYF(MY_DONT_SORT))))
{
DBUG_PRINT("my",("Archive subdir found: %s", arc_path));
(void) mysql_rm_arc_files(thd, new_dirp, arc_path);
}
}
#endif//FRM_ARCHIVE
return 0; return 0;
} }
......
...@@ -82,8 +82,9 @@ my_bool ...@@ -82,8 +82,9 @@ my_bool
sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name, sql_create_definition_file(const LEX_STRING *dir, const LEX_STRING *file_name,
const LEX_STRING *type, const LEX_STRING *type,
gptr base, File_option *parameters, uint versions); gptr base, File_option *parameters, uint versions);
my_bool rename_in_schema_file(const char *schema, const char *old_name, my_bool rename_in_schema_file(THD *thd,
const char *new_name, ulonglong revision, const char *schema, const char *old_name,
const char *new_name, ulonglong revision,
uint num_view_backups); uint num_view_backups);
class File_parser: public Sql_alloc class File_parser: public Sql_alloc
......
...@@ -35,7 +35,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, ...@@ -35,7 +35,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp,
const char *db, const char *path, uint level, const char *db, const char *path, uint level,
TABLE_LIST **dropped_tables); TABLE_LIST **dropped_tables);
static long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path); long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path);
static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error); static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error);
/* Database options hash */ /* Database options hash */
static HASH dboptions; static HASH dboptions;
...@@ -906,7 +906,11 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, ...@@ -906,7 +906,11 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
else if (file->name[0] == 'a' && file->name[1] == 'r' && else if (file->name[0] == 'a' && file->name[1] == 'r' &&
file->name[2] == 'c' && file->name[3] == '\0') file->name[2] == 'c' && file->name[3] == '\0')
{ {
/* .frm archive */ /* .frm archive:
Those archives are obsolete, but following code should
exist to remove existent "arc" directories.
See #ifdef FRM_ARCHIVE directives for obsolete code.
*/
char newpath[FN_REFLEN]; char newpath[FN_REFLEN];
MY_DIR *new_dirp; MY_DIR *new_dirp;
strxmov(newpath, org_path, "/", "arc", NullS); strxmov(newpath, org_path, "/", "arc", NullS);
...@@ -1061,9 +1065,13 @@ static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error) ...@@ -1061,9 +1065,13 @@ static my_bool rm_dir_w_symlink(const char *org_path, my_bool send_error)
RETURN RETURN
> 0 number of removed files > 0 number of removed files
-1 error -1 error
NOTE
A support of "arc" directories is obsolete, however this
function should exist to remove existent "arc" directories.
See #ifdef FRM_ARCHIVE directives for obsolete code.
*/ */
static long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path)
const char *org_path)
{ {
long deleted= 0; long deleted= 0;
ulong found_other_files= 0; ulong found_other_files= 0;
...@@ -1105,6 +1113,7 @@ static long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, ...@@ -1105,6 +1113,7 @@ static long mysql_rm_arc_files(THD *thd, MY_DIR *dirp,
{ {
goto err; goto err;
} }
deleted++;
} }
if (thd->killed) if (thd->killed)
goto err; goto err;
......
...@@ -1858,7 +1858,7 @@ mysql_rename_view(THD *thd, ...@@ -1858,7 +1858,7 @@ mysql_rename_view(THD *thd,
goto err; goto err;
/* rename view and it's backups */ /* rename view and it's backups */
if (rename_in_schema_file(view->db, view->table_name, new_name, if (rename_in_schema_file(thd, view->db, view->table_name, new_name,
view_def.revision - 1, num_view_backups)) view_def.revision - 1, num_view_backups))
goto err; goto err;
...@@ -1877,7 +1877,7 @@ mysql_rename_view(THD *thd, ...@@ -1877,7 +1877,7 @@ mysql_rename_view(THD *thd,
num_view_backups)) num_view_backups))
{ {
/* restore renamed view in case of error */ /* restore renamed view in case of error */
rename_in_schema_file(view->db, new_name, view->table_name, rename_in_schema_file(thd, view->db, new_name, view->table_name,
view_def.revision - 1, num_view_backups); view_def.revision - 1, num_view_backups);
goto err; goto err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment