]>
Commit | Line | Data |
---|---|---|
b4e1fa2c AM |
1 | # name : innodb_overwrite_relay_log_info.patch |
2 | # introduced : 11 or before | |
3 | # maintainer : Yasufumi | |
4 | # | |
5 | #!!! notice !!! | |
6 | # Any small change to this file in the main branch | |
7 | # should be done or reviewed by the maintainer! | |
8 | diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc | |
9 | --- a/storage/innobase/handler/ha_innodb.cc 2010-12-03 15:37:45.516105468 +0900 | |
10 | +++ b/storage/innobase/handler/ha_innodb.cc 2010-12-03 15:38:20.318952987 +0900 | |
11 | @@ -42,6 +42,8 @@ | |
12 | #pragma implementation // gcc: Class implementation | |
13 | #endif | |
14 | ||
15 | +#define MYSQL_SERVER | |
16 | + | |
17 | #include <sql_table.h> // explain_filename, nz2, EXPLAIN_PARTITIONS_AS_COMMENT, | |
18 | // EXPLAIN_FILENAME_MAX_EXTRA_LENGTH | |
19 | ||
20 | @@ -52,6 +54,15 @@ | |
21 | #include <mysql/innodb_priv.h> | |
22 | #include <mysql/psi/psi.h> | |
23 | ||
24 | +#ifdef MYSQL_SERVER | |
25 | +#include <rpl_mi.h> | |
26 | +#include <slave.h> | |
27 | +// Defined in slave.cc | |
28 | +int init_intvar_from_file(int* var, IO_CACHE* f, int default_val); | |
29 | +int init_strvar_from_file(char *var, int max_size, IO_CACHE *f, | |
30 | + const char *default_val); | |
31 | +#endif /* MYSQL_SERVER */ | |
32 | + | |
33 | /** @file ha_innodb.cc */ | |
34 | ||
35 | /* Include necessary InnoDB headers */ | |
36 | @@ -91,6 +102,14 @@ | |
37 | #include "ha_innodb.h" | |
38 | #include "i_s.h" | |
39 | ||
40 | +#ifdef MYSQL_SERVER | |
41 | +// Defined in trx0sys.c | |
42 | +extern char trx_sys_mysql_master_log_name[]; | |
43 | +extern ib_int64_t trx_sys_mysql_master_log_pos; | |
44 | +extern char trx_sys_mysql_relay_log_name[]; | |
45 | +extern ib_int64_t trx_sys_mysql_relay_log_pos; | |
46 | +#endif /* MYSQL_SERVER */ | |
47 | + | |
48 | # ifndef MYSQL_PLUGIN_IMPORT | |
49 | # define MYSQL_PLUGIN_IMPORT /* nothing */ | |
50 | # endif /* MYSQL_PLUGIN_IMPORT */ | |
51 | @@ -163,6 +182,7 @@ | |
52 | static my_bool innobase_use_doublewrite = TRUE; | |
53 | static my_bool innobase_use_checksums = TRUE; | |
54 | static my_bool innobase_locks_unsafe_for_binlog = FALSE; | |
55 | +static my_bool innobase_overwrite_relay_log_info = FALSE; | |
56 | static my_bool innobase_rollback_on_timeout = FALSE; | |
57 | static my_bool innobase_create_status_file = FALSE; | |
58 | static my_bool innobase_stats_on_metadata = TRUE; | |
d8778560 | 59 | @@ -2202,6 +2222,89 @@ |
b4e1fa2c | 60 | } |
d8778560 | 61 | #endif /* DBUG_OFF */ |
b4e1fa2c AM |
62 | |
63 | +#ifndef MYSQL_SERVER | |
64 | + innodb_overwrite_relay_log_info = FALSE; | |
65 | +#endif | |
66 | + | |
67 | +#ifdef HAVE_REPLICATION | |
68 | +#ifdef MYSQL_SERVER | |
69 | + /* read master log position from relay-log.info if exists */ | |
70 | + char fname[FN_REFLEN+128]; | |
71 | + int pos; | |
72 | + int info_fd; | |
73 | + IO_CACHE info_file; | |
74 | + | |
75 | + fname[0] = '\0'; | |
76 | + | |
77 | + if(innobase_overwrite_relay_log_info) { | |
78 | + | |
79 | + fprintf(stderr, | |
80 | + "InnoDB: Warning: innodb_overwrite_relay_log_info is enabled." | |
d8778560 | 81 | + " Updates by other storage engines may not be synchronized.\n"); |
b4e1fa2c AM |
82 | + |
83 | + bzero((char*) &info_file, sizeof(info_file)); | |
84 | + fn_format(fname, relay_log_info_file, mysql_data_home, "", 4+32); | |
85 | + | |
86 | + int error=0; | |
87 | + | |
88 | + if (!access(fname,F_OK)) { | |
89 | + /* exist */ | |
90 | + if ((info_fd = my_open(fname, O_RDWR|O_BINARY, MYF(MY_WME))) < 0) { | |
91 | + error=1; | |
92 | + } else if (init_io_cache(&info_file, info_fd, IO_SIZE*2, | |
93 | + READ_CACHE, 0L, 0, MYF(MY_WME))) { | |
94 | + error=1; | |
95 | + } | |
96 | + | |
97 | + if (error) { | |
98 | +relay_info_error: | |
99 | + if (info_fd >= 0) | |
100 | + my_close(info_fd, MYF(0)); | |
101 | + fname[0] = '\0'; | |
102 | + goto skip_relay; | |
103 | + } | |
104 | + } else { | |
105 | + fname[0] = '\0'; | |
106 | + goto skip_relay; | |
107 | + } | |
108 | + | |
109 | + if (init_strvar_from_file(fname, sizeof(fname), &info_file, "") || /* dummy (it is relay-log) */ | |
110 | + init_intvar_from_file(&pos, &info_file, BIN_LOG_HEADER_SIZE)) { | |
111 | + end_io_cache(&info_file); | |
112 | + error=1; | |
113 | + goto relay_info_error; | |
114 | + } | |
115 | + | |
116 | + fprintf(stderr, | |
117 | + "InnoDB: relay-log.info is detected.\n" | |
118 | + "InnoDB: relay log: position %u, file name %s\n", | |
119 | + pos, fname); | |
120 | + | |
121 | + strncpy(trx_sys_mysql_relay_log_name, fname, TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN); | |
122 | + trx_sys_mysql_relay_log_pos = (ib_int64_t) pos; | |
123 | + | |
124 | + if (init_strvar_from_file(fname, sizeof(fname), &info_file, "") || | |
125 | + init_intvar_from_file(&pos, &info_file, 0)) { | |
126 | + end_io_cache(&info_file); | |
127 | + error=1; | |
128 | + goto relay_info_error; | |
129 | + } | |
130 | + | |
131 | + fprintf(stderr, | |
132 | + "InnoDB: master log: position %u, file name %s\n", | |
133 | + pos, fname); | |
134 | + | |
135 | + strncpy(trx_sys_mysql_master_log_name, fname, TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN); | |
136 | + trx_sys_mysql_master_log_pos = (ib_int64_t) pos; | |
137 | + | |
138 | + end_io_cache(&info_file); | |
139 | + if (info_fd >= 0) | |
140 | + my_close(info_fd, MYF(0)); | |
141 | + } | |
142 | +skip_relay: | |
143 | +#endif /* MYSQL_SERVER */ | |
144 | +#endif /* HAVE_REPLICATION */ | |
145 | + | |
146 | /* Check that values don't overflow on 32-bit systems. */ | |
147 | if (sizeof(ulint) == 4) { | |
148 | if (innobase_buffer_pool_size > UINT_MAX32) { | |
d8778560 | 149 | @@ -2500,6 +2603,76 @@ |
b4e1fa2c AM |
150 | goto mem_free_and_error; |
151 | } | |
152 | ||
153 | +#ifdef HAVE_REPLICATION | |
154 | +#ifdef MYSQL_SERVER | |
155 | + if(innobase_overwrite_relay_log_info) { | |
156 | + /* If InnoDB progressed from relay-log.info, overwrite it */ | |
157 | + if (fname[0] == '\0') { | |
158 | + fprintf(stderr, | |
d8778560 | 159 | + "InnoDB: Something is wrong with the file relay-info.log. InnoDB will not overwrite it.\n"); |
b4e1fa2c AM |
160 | + } else if (0 != strcmp(fname, trx_sys_mysql_master_log_name) |
161 | + || pos != trx_sys_mysql_master_log_pos) { | |
162 | + /* Overwrite relay-log.info */ | |
163 | + bzero((char*) &info_file, sizeof(info_file)); | |
164 | + fn_format(fname, relay_log_info_file, mysql_data_home, "", 4+32); | |
165 | + | |
166 | + int error = 0; | |
167 | + | |
168 | + if (!access(fname,F_OK)) { | |
169 | + /* exist */ | |
170 | + if ((info_fd = my_open(fname, O_RDWR|O_BINARY, MYF(MY_WME))) < 0) { | |
171 | + error = 1; | |
172 | + } else if (init_io_cache(&info_file, info_fd, IO_SIZE*2, | |
173 | + WRITE_CACHE, 0L, 0, MYF(MY_WME))) { | |
174 | + error = 1; | |
175 | + } | |
176 | + | |
177 | + if (error) { | |
178 | + if (info_fd >= 0) | |
179 | + my_close(info_fd, MYF(0)); | |
180 | + goto skip_overwrite; | |
181 | + } | |
182 | + } else { | |
183 | + error = 1; | |
184 | + goto skip_overwrite; | |
185 | + } | |
186 | + | |
187 | + char buff[FN_REFLEN*2+22*2+4], *pos; | |
188 | + | |
189 | + my_b_seek(&info_file, 0L); | |
190 | + pos=strmov(buff, trx_sys_mysql_relay_log_name); | |
191 | + *pos++='\n'; | |
192 | + pos=longlong2str(trx_sys_mysql_relay_log_pos, pos, 10); | |
193 | + *pos++='\n'; | |
194 | + pos=strmov(pos, trx_sys_mysql_master_log_name); | |
195 | + *pos++='\n'; | |
196 | + pos=longlong2str(trx_sys_mysql_master_log_pos, pos, 10); | |
197 | + *pos='\n'; | |
198 | + | |
199 | + if (my_b_write(&info_file, (uchar*) buff, (size_t) (pos-buff)+1)) | |
200 | + error = 1; | |
201 | + if (flush_io_cache(&info_file)) | |
202 | + error = 1; | |
203 | + | |
204 | + end_io_cache(&info_file); | |
205 | + if (info_fd >= 0) | |
206 | + my_close(info_fd, MYF(0)); | |
207 | +skip_overwrite: | |
208 | + if (error) { | |
209 | + fprintf(stderr, | |
d8778560 | 210 | + "InnoDB: ERROR: An error occurred while overwriting relay-log.info.\n"); |
b4e1fa2c AM |
211 | + } else { |
212 | + fprintf(stderr, | |
d8778560 | 213 | + "InnoDB: The file relay-log.info was successfully overwritten.\n"); |
b4e1fa2c AM |
214 | + } |
215 | + } else { | |
216 | + fprintf(stderr, | |
217 | + "InnoDB: InnoDB and relay-log.info are synchronized. InnoDB will not overwrite it.\n"); | |
218 | + } | |
219 | + } | |
220 | +#endif /* MYSQL_SERVER */ | |
221 | +#endif /* HAVE_REPLICATION */ | |
222 | + | |
223 | innobase_old_blocks_pct = buf_LRU_old_ratio_update( | |
224 | innobase_old_blocks_pct, TRUE); | |
225 | ||
d8778560 | 226 | @@ -2612,6 +2785,25 @@ |
b4e1fa2c AM |
227 | trx_t* trx) /*!< in: transaction handle */ |
228 | { | |
229 | if (trx_is_started(trx)) { | |
230 | +#ifdef HAVE_REPLICATION | |
231 | +#ifdef MYSQL_SERVER | |
232 | + THD *thd=current_thd; | |
233 | + | |
234 | + if (thd && thd->slave_thread) { | |
235 | + /* Update the replication position info inside InnoDB */ | |
236 | + trx->mysql_master_log_file_name | |
237 | + = active_mi->rli.group_master_log_name; | |
238 | + trx->mysql_master_log_pos | |
239 | + = ((ib_int64_t)active_mi->rli.group_master_log_pos + | |
240 | + ((ib_int64_t)active_mi->rli.future_event_relay_log_pos - | |
241 | + (ib_int64_t)active_mi->rli.group_relay_log_pos)); | |
242 | + trx->mysql_relay_log_file_name | |
243 | + = active_mi->rli.group_relay_log_name; | |
244 | + trx->mysql_relay_log_pos | |
245 | + = (ib_int64_t)active_mi->rli.future_event_relay_log_pos; | |
246 | + } | |
247 | +#endif /* MYSQL_SERVER */ | |
248 | +#endif /* HAVE_REPLICATION */ | |
249 | ||
250 | trx_commit_for_mysql(trx); | |
251 | } | |
d8778560 | 252 | @@ -10917,6 +11109,12 @@ |
b4e1fa2c AM |
253 | "The common part for InnoDB table spaces.", |
254 | NULL, NULL, NULL); | |
255 | ||
a9ee80b9 | 256 | +static MYSQL_SYSVAR_BOOL(recovery_update_relay_log, innobase_overwrite_relay_log_info, |
b4e1fa2c AM |
257 | + PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, |
258 | + "During InnoDB crash recovery on slave overwrite relay-log.info " | |
259 | + "to align master log file position if information in InnoDB and relay-log.info is different.", | |
260 | + NULL, NULL, FALSE); | |
261 | + | |
262 | static MYSQL_SYSVAR_BOOL(doublewrite, innobase_use_doublewrite, | |
263 | PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, | |
264 | "Enable InnoDB doublewrite buffer (enabled by default). " | |
d8778560 | 265 | @@ -11368,6 +11566,7 @@ |
b4e1fa2c AM |
266 | MYSQL_SYSVAR(old_blocks_pct), |
267 | MYSQL_SYSVAR(old_blocks_time), | |
268 | MYSQL_SYSVAR(open_files), | |
a9ee80b9 | 269 | + MYSQL_SYSVAR(recovery_update_relay_log), |
b4e1fa2c AM |
270 | MYSQL_SYSVAR(rollback_on_timeout), |
271 | MYSQL_SYSVAR(stats_on_metadata), | |
272 | MYSQL_SYSVAR(stats_sample_pages), | |
273 | diff -ruN a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h | |
274 | --- a/storage/innobase/include/trx0sys.h 2010-11-03 07:01:13.000000000 +0900 | |
275 | +++ b/storage/innobase/include/trx0sys.h 2010-12-03 15:38:20.321953297 +0900 | |
276 | @@ -52,6 +52,9 @@ | |
277 | extern ib_int64_t trx_sys_mysql_master_log_pos; | |
278 | /* @} */ | |
279 | ||
280 | +extern char trx_sys_mysql_relay_log_name[]; | |
281 | +extern ib_int64_t trx_sys_mysql_relay_log_pos; | |
282 | + | |
283 | /** If this MySQL server uses binary logging, after InnoDB has been inited | |
284 | and if it has done a crash recovery, we store the binlog file name and position | |
285 | here. */ | |
286 | @@ -293,7 +296,8 @@ | |
287 | void | |
288 | trx_sys_update_mysql_binlog_offset( | |
289 | /*===============================*/ | |
290 | - const char* file_name,/*!< in: MySQL log file name */ | |
291 | + trx_sysf_t* sys_header, | |
292 | + const char* file_name_in,/*!< in: MySQL log file name */ | |
293 | ib_int64_t offset, /*!< in: position in that log file */ | |
294 | ulint field, /*!< in: offset of the MySQL log info field in | |
295 | the trx sys header */ | |
296 | @@ -488,6 +492,7 @@ | |
297 | @see trx_sys_mysql_master_log_name | |
298 | @see trx_sys_mysql_bin_log_name */ | |
299 | #define TRX_SYS_MYSQL_LOG_NAME_LEN 512 | |
300 | +#define TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN 480 /* (500 - 12) is dead line. */ | |
301 | /** Contents of TRX_SYS_MYSQL_LOG_MAGIC_N_FLD */ | |
302 | #define TRX_SYS_MYSQL_LOG_MAGIC_N 873422344 | |
303 | ||
304 | @@ -497,6 +502,7 @@ | |
305 | /** The offset of the MySQL replication info in the trx system header; | |
306 | this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */ | |
307 | #define TRX_SYS_MYSQL_MASTER_LOG_INFO (UNIV_PAGE_SIZE - 2000) | |
308 | +#define TRX_SYS_MYSQL_RELAY_LOG_INFO (UNIV_PAGE_SIZE - 1500) | |
309 | ||
310 | /** The offset of the MySQL binlog offset info in the trx system header */ | |
311 | #define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 1000) | |
312 | diff -ruN a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h | |
313 | --- a/storage/innobase/include/trx0trx.h 2010-12-03 15:18:48.894955550 +0900 | |
314 | +++ b/storage/innobase/include/trx0trx.h 2010-12-03 15:38:20.323953416 +0900 | |
315 | @@ -569,6 +569,21 @@ | |
316 | ib_int64_t mysql_log_offset;/* if MySQL binlog is used, this field | |
317 | contains the end offset of the binlog | |
318 | entry */ | |
319 | + const char* mysql_master_log_file_name; | |
320 | + /* if the database server is a MySQL | |
321 | + replication slave, we have here the | |
322 | + master binlog name up to which | |
323 | + replication has processed; otherwise | |
324 | + this is a pointer to a null | |
325 | + character */ | |
326 | + ib_int64_t mysql_master_log_pos; | |
327 | + /* if the database server is a MySQL | |
328 | + replication slave, this is the | |
329 | + position in the log file up to which | |
330 | + replication has processed */ | |
331 | + const char* mysql_relay_log_file_name; | |
332 | + ib_int64_t mysql_relay_log_pos; | |
333 | + | |
334 | os_thread_id_t mysql_thread_id;/* id of the MySQL thread associated | |
335 | with this transaction object */ | |
336 | ulint mysql_process_no;/* since in Linux, 'top' reports | |
337 | diff -ruN a/storage/innobase/trx/trx0sys.c b/storage/innobase/trx/trx0sys.c | |
338 | --- a/storage/innobase/trx/trx0sys.c 2010-11-03 07:01:13.000000000 +0900 | |
339 | +++ b/storage/innobase/trx/trx0sys.c 2010-12-03 15:38:20.325956917 +0900 | |
340 | @@ -75,13 +75,16 @@ | |
341 | file name and position here. */ | |
342 | /* @{ */ | |
343 | /** Master binlog file name */ | |
344 | -UNIV_INTERN char trx_sys_mysql_master_log_name[TRX_SYS_MYSQL_LOG_NAME_LEN]; | |
345 | +UNIV_INTERN char trx_sys_mysql_master_log_name[TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN]; | |
346 | /** Master binlog file position. We have successfully got the updates | |
347 | up to this position. -1 means that no crash recovery was needed, or | |
348 | there was no master log position info inside InnoDB.*/ | |
349 | UNIV_INTERN ib_int64_t trx_sys_mysql_master_log_pos = -1; | |
350 | /* @} */ | |
351 | ||
352 | +UNIV_INTERN char trx_sys_mysql_relay_log_name[TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN]; | |
353 | +UNIV_INTERN ib_int64_t trx_sys_mysql_relay_log_pos = -1; | |
354 | + | |
355 | /** If this MySQL server uses binary logging, after InnoDB has been inited | |
356 | and if it has done a crash recovery, we store the binlog file name and position | |
357 | here. */ | |
358 | @@ -683,23 +686,25 @@ | |
359 | void | |
360 | trx_sys_update_mysql_binlog_offset( | |
361 | /*===============================*/ | |
362 | - const char* file_name,/*!< in: MySQL log file name */ | |
363 | + trx_sysf_t* sys_header, | |
364 | + const char* file_name_in,/*!< in: MySQL log file name */ | |
365 | ib_int64_t offset, /*!< in: position in that log file */ | |
366 | ulint field, /*!< in: offset of the MySQL log info field in | |
367 | the trx sys header */ | |
368 | mtr_t* mtr) /*!< in: mtr */ | |
369 | { | |
370 | - trx_sysf_t* sys_header; | |
371 | + const char* file_name; | |
372 | ||
373 | - if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) { | |
374 | + if (ut_strlen(file_name_in) >= TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN) { | |
375 | ||
376 | /* We cannot fit the name to the 512 bytes we have reserved */ | |
377 | + /* -> To store relay log file information, file_name must fit to the 480 bytes */ | |
378 | ||
379 | - return; | |
380 | + file_name = ""; | |
381 | + } else { | |
382 | + file_name = file_name_in; | |
383 | } | |
384 | ||
385 | - sys_header = trx_sysf_get(mtr); | |
386 | - | |
387 | if (mach_read_from_4(sys_header + field | |
388 | + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) | |
389 | != TRX_SYS_MYSQL_LOG_MAGIC_N) { | |
390 | @@ -821,13 +826,26 @@ | |
391 | + TRX_SYS_MYSQL_LOG_OFFSET_LOW), | |
392 | sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO | |
393 | + TRX_SYS_MYSQL_LOG_NAME); | |
394 | + | |
395 | + fprintf(stderr, | |
396 | + "InnoDB: and relay log file\n" | |
397 | + "InnoDB: position %lu %lu, file name %s\n", | |
398 | + (ulong) mach_read_from_4(sys_header | |
399 | + + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
400 | + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH), | |
401 | + (ulong) mach_read_from_4(sys_header | |
402 | + + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
403 | + + TRX_SYS_MYSQL_LOG_OFFSET_LOW), | |
404 | + sys_header + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
405 | + + TRX_SYS_MYSQL_LOG_NAME); | |
406 | + | |
407 | /* Copy the master log position info to global variables we can | |
408 | use in ha_innobase.cc to initialize glob_mi to right values */ | |
409 | ||
410 | ut_memcpy(trx_sys_mysql_master_log_name, | |
411 | sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO | |
412 | + TRX_SYS_MYSQL_LOG_NAME, | |
413 | - TRX_SYS_MYSQL_LOG_NAME_LEN); | |
414 | + TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN); | |
415 | ||
416 | trx_sys_mysql_master_log_pos | |
417 | = (((ib_int64_t) mach_read_from_4( | |
418 | @@ -836,6 +854,19 @@ | |
419 | + ((ib_int64_t) mach_read_from_4( | |
420 | sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO | |
421 | + TRX_SYS_MYSQL_LOG_OFFSET_LOW)); | |
422 | + | |
423 | + ut_memcpy(trx_sys_mysql_relay_log_name, | |
424 | + sys_header + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
425 | + + TRX_SYS_MYSQL_LOG_NAME, | |
426 | + TRX_SYS_MYSQL_MASTER_LOG_NAME_LEN); | |
427 | + | |
428 | + trx_sys_mysql_relay_log_pos | |
429 | + = (((ib_int64_t) mach_read_from_4( | |
430 | + sys_header + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
431 | + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) << 32) | |
432 | + + ((ib_int64_t) mach_read_from_4( | |
433 | + sys_header + TRX_SYS_MYSQL_RELAY_LOG_INFO | |
434 | + + TRX_SYS_MYSQL_LOG_OFFSET_LOW)); | |
435 | mtr_commit(&mtr); | |
436 | } | |
437 | ||
438 | diff -ruN a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c | |
439 | --- a/storage/innobase/trx/trx0trx.c 2010-12-03 15:37:45.549028990 +0900 | |
440 | +++ b/storage/innobase/trx/trx0trx.c 2010-12-03 15:38:20.328957217 +0900 | |
441 | @@ -135,6 +135,10 @@ | |
442 | ||
443 | trx->mysql_log_file_name = NULL; | |
444 | trx->mysql_log_offset = 0; | |
445 | + trx->mysql_master_log_file_name = ""; | |
446 | + trx->mysql_master_log_pos = 0; | |
447 | + trx->mysql_relay_log_file_name = ""; | |
448 | + trx->mysql_relay_log_pos = 0; | |
449 | ||
450 | mutex_create(trx_undo_mutex_key, &trx->undo_mutex, SYNC_TRX_UNDO); | |
451 | ||
452 | @@ -732,6 +736,7 @@ | |
453 | trx_rseg_t* rseg; | |
454 | trx_undo_t* undo; | |
455 | mtr_t mtr; | |
456 | + trx_sysf_t* sys_header = NULL; | |
457 | ||
458 | ut_ad(mutex_own(&kernel_mutex)); | |
459 | ||
460 | @@ -787,13 +792,35 @@ | |
461 | ||
462 | if (trx->mysql_log_file_name | |
463 | && trx->mysql_log_file_name[0] != '\0') { | |
464 | + if (!sys_header) { | |
465 | + sys_header = trx_sysf_get(&mtr); | |
466 | + } | |
467 | trx_sys_update_mysql_binlog_offset( | |
468 | + sys_header, | |
469 | trx->mysql_log_file_name, | |
470 | trx->mysql_log_offset, | |
471 | TRX_SYS_MYSQL_LOG_INFO, &mtr); | |
472 | trx->mysql_log_file_name = NULL; | |
473 | } | |
474 | ||
475 | + if (trx->mysql_master_log_file_name[0] != '\0') { | |
476 | + /* This database server is a MySQL replication slave */ | |
477 | + if (!sys_header) { | |
478 | + sys_header = trx_sysf_get(&mtr); | |
479 | + } | |
480 | + trx_sys_update_mysql_binlog_offset( | |
481 | + sys_header, | |
482 | + trx->mysql_relay_log_file_name, | |
483 | + trx->mysql_relay_log_pos, | |
484 | + TRX_SYS_MYSQL_RELAY_LOG_INFO, &mtr); | |
485 | + trx_sys_update_mysql_binlog_offset( | |
486 | + sys_header, | |
487 | + trx->mysql_master_log_file_name, | |
488 | + trx->mysql_master_log_pos, | |
489 | + TRX_SYS_MYSQL_MASTER_LOG_INFO, &mtr); | |
490 | + trx->mysql_master_log_file_name = ""; | |
491 | + } | |
492 | + | |
493 | /* The following call commits the mini-transaction, making the | |
494 | whole transaction committed in the file-based world, at this | |
495 | log sequence number. The transaction becomes 'durable' when |