summaryrefslogtreecommitdiff
blob: 66ba7e3a82cfbefbb8d3b76f8053783fbcfd300d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
From 2c2bd8c1556b081fccd0fc3e010dc3ea2c38fffb Mon Sep 17 00:00:00 2001
From: Sergei Golubchik <serg@mariadb.org>
Date: Wed, 15 Mar 2017 11:46:54 +0100
Subject: [PATCH] MDEV-12261 build failure without P_S

restore mysql_file_delete_with_symlink() but let it use
new my_handler_delete_with_symlink() mysys helper.
---
 include/my_sys.h                 |  3 +--
 include/mysql/psi/mysql_file.h   | 44 ++++++++++++++++++++++++++++++++++++++++
 mysys/my_symlink2.c              | 14 ++++++-------
 sql/handler.cc                   |  2 +-
 sql/sql_db.cc                    |  6 +++---
 sql/table.cc                     |  2 +-
 storage/maria/ma_delete_table.c  |  8 ++++----
 storage/myisam/mi_delete_table.c |  8 ++++----
 8 files changed, 64 insertions(+), 23 deletions(-)

diff --git a/include/my_sys.h b/include/my_sys.h
index 4e129cc..5b0a114 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -597,8 +597,7 @@ extern File my_create_with_symlink(const char *linkname, const char *filename,
 				   myf MyFlags);
 extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
 extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
-extern int my_handler_delete_with_symlink(PSI_file_key key, const char *name,
-                                          const char *ext, myf sync_dir);
+extern int my_handler_delete_with_symlink(const char *filename, myf sync_dir);
 
 extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags);
 extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset,
diff --git a/include/mysql/psi/mysql_file.h b/include/mysql/psi/mysql_file.h
index aca66bd..df94603 100644
--- a/include/mysql/psi/mysql_file.h
+++ b/include/mysql/psi/mysql_file.h
@@ -442,6 +442,20 @@
 #endif
 
 /**
+  @def mysql_file_delete_with_symlink(K, P1, P2, P3)
+  Instrumented delete with symbolic link.
+  @c mysql_file_delete_with_symlink is a replacement
+  for @c my_handler_delete_with_symlink.
+*/
+#ifdef HAVE_PSI_FILE_INTERFACE
+  #define mysql_file_delete_with_symlink(K, P1, P2, P3) \
+  inline_mysql_file_delete_with_symlink(K, __FILE__, __LINE__, P1, P2, P3)
+#else
+  #define mysql_file_delete_with_symlink(K, P1, P2, P3) \
+  inline_mysql_file_delete_with_symlink(P1, P2, P3)
+#endif
+
+/**
   @def mysql_file_rename_with_symlink(K, P1, P2, P3)
   Instrumented rename with symbolic link.
   @c mysql_file_rename_with_symlink is a replacement
@@ -1294,6 +1308,7 @@ inline_mysql_file_rename(
   return result;
 }
 
+
 static inline File
 inline_mysql_file_create_with_symlink(
 #ifdef HAVE_PSI_FILE_INTERFACE
@@ -1325,6 +1340,35 @@ inline_mysql_file_create_with_symlink(
 
 
 static inline int
+inline_mysql_file_delete_with_symlink(
+#ifdef HAVE_PSI_FILE_INTERFACE
+  PSI_file_key key, const char *src_file, uint src_line,
+#endif
+  const char *name, const char *ext, myf flags)
+{
+  int result;
+  char fullname[FN_REFLEN];
+  fn_format(fullname, name, "", ext, MY_UNPACK_FILENAME | MY_APPEND_EXT);
+#ifdef HAVE_PSI_FILE_INTERFACE
+  struct PSI_file_locker *locker;
+  PSI_file_locker_state state;
+  locker= PSI_FILE_CALL(get_thread_file_name_locker)
+    (&state, key, PSI_FILE_DELETE, fullname, &locker);
+  if (likely(locker != NULL))
+  {
+    PSI_FILE_CALL(start_file_close_wait)(locker, src_file, src_line);
+    result= my_handler_delete_with_symlink(fullname, flags);
+    PSI_FILE_CALL(end_file_close_wait)(locker, result);
+    return result;
+  }
+#endif
+
+  result= my_handler_delete_with_symlink(fullname, flags);
+  return result;
+}
+
+
+static inline int
 inline_mysql_file_rename_with_symlink(
 #ifdef HAVE_PSI_FILE_INTERFACE
   PSI_file_key key, const char *src_file, uint src_line,
diff --git a/mysys/my_symlink2.c b/mysys/my_symlink2.c
index defcb59..c851468 100644
--- a/mysys/my_symlink2.c
+++ b/mysys/my_symlink2.c
@@ -170,22 +170,20 @@ int my_rename_with_symlink(const char *from, const char *to, myf MyFlags)
   in this case both the symlink and the symlinked file are deleted,
   but only if the symlinked file is not in the datadir.
 */
-int my_handler_delete_with_symlink(PSI_file_key key, const char *name,
-                                   const char *ext, myf sync_dir)
+int my_handler_delete_with_symlink(const char *filename, myf sync_dir)
 {
-  char orig[FN_REFLEN], real[FN_REFLEN];
+  char real[FN_REFLEN];
   int res= 0;
   DBUG_ENTER("my_handler_delete_with_symlink");
 
-  fn_format(orig, name, "", ext, MY_UNPACK_FILENAME | MY_APPEND_EXT);
-  if (my_is_symlink(orig))
+  if (my_is_symlink(filename))
   {
     /*
       Delete the symlinked file only if the symlink is not
       pointing into datadir.
     */
-    if (!(my_realpath(real, orig, MYF(0)) || mysys_test_invalid_symlink(real)))
-      res= mysql_file_delete(key, real, MYF(MY_NOSYMLINKS | sync_dir));
+    if (!(my_realpath(real, filename, MYF(0)) || mysys_test_invalid_symlink(real)))
+      res= my_delete(real, MYF(MY_NOSYMLINKS | sync_dir));
   }
-  DBUG_RETURN(mysql_file_delete(key, orig, MYF(sync_dir)) || res);
+  DBUG_RETURN(my_delete(filename, MYF(sync_dir)) || res);
 }
diff --git a/sql/handler.cc b/sql/handler.cc
index 7fa8afd..fc70ed5 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -3850,7 +3850,7 @@ int handler::delete_table(const char *name)
 
   for (const char **ext=bas_ext(); *ext ; ext++)
   {
-    if (my_handler_delete_with_symlink(key_file_misc, name, *ext, 0))
+    if (mysql_file_delete_with_symlink(key_file_misc, name, *ext, 0))
     {
       if (my_errno != ENOENT)
       {
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 3f43a33..6c8c384 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -815,7 +815,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
      if there exists a table with the name 'db', so let's just do it
      separately. We know this file exists and needs to be deleted anyway.
   */
-  if (my_handler_delete_with_symlink(key_file_misc, path, "", MYF(0)) &&
+  if (mysql_file_delete_with_symlink(key_file_misc, path, "", MYF(0)) &&
       my_errno != ENOENT)
   {
     my_error(EE_DELETE, MYF(0), path, my_errno);
@@ -1119,7 +1119,7 @@ static bool find_db_tables_and_rm_known_files(THD *thd, MY_DIR *dirp,
         We ignore ENOENT error in order to skip files that was deleted
         by concurrently running statement like REPAIR TABLE ...
       */
-      if (my_handler_delete_with_symlink(key_file_misc, filePath, "", MYF(0)) &&
+      if (mysql_file_delete_with_symlink(key_file_misc, filePath, "", MYF(0)) &&
           my_errno != ENOENT)
       {
         my_error(EE_DELETE, MYF(0), filePath, my_errno);
@@ -1235,7 +1235,7 @@ long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path)
       continue;
     }
     strxmov(filePath, org_path, "/", file->name, NullS);
-    if (my_handler_delete_with_symlink(key_file_misc, filePath, "", MYF(MY_WME)))
+    if (mysql_file_delete_with_symlink(key_file_misc, filePath, "", MYF(MY_WME)))
     {
       goto err;
     }
diff --git a/sql/table.cc b/sql/table.cc
index 80d0e02..975d9d5 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -569,7 +569,7 @@ enum open_frm_error open_table_def(THD *thd, TABLE_SHARE *share, uint flags)
   {
     DBUG_ASSERT(flags & GTS_TABLE);
     DBUG_ASSERT(flags & GTS_USE_DISCOVERY);
-    my_handler_delete_with_symlink(key_file_frm, path, "", MYF(0));
+    mysql_file_delete_with_symlink(key_file_frm, path, "", MYF(0));
     file= -1;
   }
   else
diff --git a/storage/maria/ma_delete_table.c b/storage/maria/ma_delete_table.c
index a9ab8e5..186075d 100644
--- a/storage/maria/ma_delete_table.c
+++ b/storage/maria/ma_delete_table.c
@@ -86,13 +86,13 @@
 {
   DBUG_ENTER("maria_delete_table_files");
 
-  if (my_handler_delete_with_symlink(key_file_kfile, name, MARIA_NAME_IEXT, MYF(MY_WME | sync_dir)) ||
-      my_handler_delete_with_symlink(key_file_dfile, name, MARIA_NAME_DEXT, MYF(MY_WME | sync_dir)))
+  if (mysql_file_delete_with_symlink(key_file_kfile, name, MARIA_NAME_IEXT, MYF(MY_WME | sync_dir)) ||
+      mysql_file_delete_with_symlink(key_file_dfile, name, MARIA_NAME_DEXT, MYF(MY_WME | sync_dir)))
     DBUG_RETURN(my_errno);
 
   if (!temporary) {
-    my_handler_delete_with_symlink(key_file_dfile, name, ".TMD", MYF(0));
-    my_handler_delete_with_symlink(key_file_dfile, name, ".OLD", MYF(0));
+    mysql_file_delete_with_symlink(key_file_dfile, name, ".TMD", MYF(0));
+    mysql_file_delete_with_symlink(key_file_dfile, name, ".OLD", MYF(0));
   }
   DBUG_RETURN(0);
 }
diff --git a/storage/myisam/mi_delete_table.c b/storage/myisam/mi_delete_table.c
index 3422e6b..d766fb2 100644
--- a/storage/myisam/mi_delete_table.c
+++ b/storage/myisam/mi_delete_table.c
@@ -34,14 +34,14 @@ int mi_delete_table(const char *name)
   check_table_is_closed(name,"delete");
 #endif
 
-  if (my_handler_delete_with_symlink(mi_key_file_kfile, name, MI_NAME_IEXT, MYF(MY_WME)) ||
-      my_handler_delete_with_symlink(mi_key_file_dfile, name, MI_NAME_DEXT, MYF(MY_WME)))
+  if (mysql_file_delete_with_symlink(mi_key_file_kfile, name, MI_NAME_IEXT, MYF(MY_WME)) ||
+      mysql_file_delete_with_symlink(mi_key_file_dfile, name, MI_NAME_DEXT, MYF(MY_WME)))
     DBUG_RETURN(my_errno);
 
 
   // optionally present:
-  my_handler_delete_with_symlink(mi_key_file_dfile, name, ".OLD", MYF(0));
-  my_handler_delete_with_symlink(mi_key_file_dfile, name, ".TMD", MYF(0));
+  mysql_file_delete_with_symlink(mi_key_file_dfile, name, ".OLD", MYF(0));
+  mysql_file_delete_with_symlink(mi_key_file_dfile, name, ".TMD", MYF(0));
 
   DBUG_RETURN(0);
 }