1 | /* Copyright (C) 2007 MySQL AB & Sanja Belkin |
2 | |
3 | This program is free software; you can redistribute it and/or modify |
4 | it under the terms of the GNU General Public License as published by |
5 | the Free Software Foundation; version 2 of the License. |
6 | |
7 | This program is distributed in the hope that it will be useful, |
8 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
10 | GNU General Public License for more details. |
11 | |
12 | You should have received a copy of the GNU General Public License |
13 | along with this program; if not, write to the Free Software |
14 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ |
15 | |
16 | #ifndef _ma_loghandler_h |
17 | #define _ma_loghandler_h |
18 | |
19 | #define MB (1024UL*1024) |
20 | |
21 | /* transaction log default cache size (TODO: make it global variable) */ |
22 | #define TRANSLOG_PAGECACHE_SIZE (2*MB) |
23 | /* transaction log default file size */ |
24 | #define TRANSLOG_FILE_SIZE (1024U*MB) |
25 | /* minimum possible transaction log size */ |
26 | #define TRANSLOG_MIN_FILE_SIZE (8*MB) |
27 | /* transaction log default flags (TODO: make it global variable) */ |
28 | #define TRANSLOG_DEFAULT_FLAGS 0 |
29 | |
30 | /* |
31 | Transaction log flags. |
32 | |
33 | We allow all kind protections to be switched on together for people who |
34 | really unsure in their hardware/OS. |
35 | */ |
36 | #define TRANSLOG_PAGE_CRC 1U |
37 | #define TRANSLOG_SECTOR_PROTECTION (1U<<1) |
38 | #define TRANSLOG_RECORD_CRC (1U<<2) |
39 | #define TRANSLOG_FLAGS_NUM ((TRANSLOG_PAGE_CRC | TRANSLOG_SECTOR_PROTECTION | \ |
40 | TRANSLOG_RECORD_CRC) + 1) |
41 | |
42 | #define -1 |
43 | #define -2 |
44 | |
45 | /* |
46 | Page size in transaction log |
47 | It should be Power of 2 and multiple of DISK_DRIVE_SECTOR_SIZE |
48 | (DISK_DRIVE_SECTOR_SIZE * 2^N) |
49 | */ |
50 | #define TRANSLOG_PAGE_SIZE (8U*1024) |
51 | |
52 | #include "ma_loghandler_lsn.h" |
53 | #include "trnman_public.h" |
54 | |
55 | /* short transaction ID type */ |
56 | typedef uint16 SHORT_TRANSACTION_ID; |
57 | |
58 | struct st_maria_handler; |
59 | |
60 | /* Changing one of the "SIZE" below will break backward-compatibility! */ |
61 | /* Length of CRC at end of pages */ |
62 | #define ROW_EXTENT_PAGE_SIZE 5 |
63 | #define ROW_EXTENT_COUNT_SIZE 2 |
64 | /* Size of file id in logs */ |
65 | #define FILEID_STORE_SIZE 2 |
66 | /* Size of page reference in log */ |
67 | #define PAGE_STORE_SIZE ROW_EXTENT_PAGE_SIZE |
68 | /* Size of page ranges in log */ |
69 | #define ROW_EXTENT_COUNT_SIZE |
70 | #define DIRPOS_STORE_SIZE 1 |
71 | #define CLR_TYPE_STORE_SIZE 1 |
72 | /* If table has live checksum we store its changes in UNDOs */ |
73 | #define HA_CHECKSUM_STORE_SIZE 4 |
74 | #define KEY_NR_STORE_SIZE 1 |
75 | #define PAGE_LENGTH_STORE_SIZE 2 |
76 | |
77 | /* Store methods to match the above sizes */ |
78 | #define fileid_store(T,A) int2store(T,A) |
79 | #define page_store(T,A) int5store(T,((ulonglong)(A))) |
80 | #define dirpos_store(T,A) ((*(uchar*) (T)) = A) |
81 | #define (T,A) int2store(T,A) |
82 | #define clr_type_store(T,A) ((*(uchar*) (T)) = A) |
83 | #define key_nr_store(T, A) ((*(uchar*) (T)) = A) |
84 | #define ha_checksum_store(T,A) int4store(T,A) |
85 | #define fileid_korr(P) uint2korr(P) |
86 | #define page_korr(P) uint5korr(P) |
87 | #define dirpos_korr(P) (*(const uchar *) (P)) |
88 | #define (P) uint2korr(P) |
89 | #define clr_type_korr(P) (*(const uchar *) (P)) |
90 | #define key_nr_korr(P) (*(const uchar *) (P)) |
91 | #define ha_checksum_korr(P) uint4korr(P) |
92 | |
93 | /* |
94 | Length of disk drive sector size (we assume that writing it |
95 | to disk is an atomic operation) |
96 | */ |
97 | #define DISK_DRIVE_SECTOR_SIZE 512U |
98 | |
99 | /* position reserved in an array of parts of a log record */ |
100 | #define TRANSLOG_INTERNAL_PARTS 2 |
101 | |
102 | /* types of records in the transaction log */ |
103 | /* TODO: Set numbers for these when we have all entries figured out */ |
104 | |
105 | enum translog_record_type |
106 | { |
107 | LOGREC_RESERVED_FOR_CHUNKS23= 0, |
108 | LOGREC_REDO_INSERT_ROW_HEAD, |
109 | LOGREC_REDO_INSERT_ROW_TAIL, |
110 | LOGREC_REDO_NEW_ROW_HEAD, |
111 | LOGREC_REDO_NEW_ROW_TAIL, |
112 | LOGREC_REDO_INSERT_ROW_BLOBS, |
113 | LOGREC_REDO_PURGE_ROW_HEAD, |
114 | LOGREC_REDO_PURGE_ROW_TAIL, |
115 | LOGREC_REDO_FREE_BLOCKS, |
116 | LOGREC_REDO_FREE_HEAD_OR_TAIL, |
117 | LOGREC_REDO_DELETE_ROW, /* unused */ |
118 | LOGREC_REDO_UPDATE_ROW_HEAD, /* unused */ |
119 | LOGREC_REDO_INDEX, |
120 | LOGREC_REDO_INDEX_NEW_PAGE, |
121 | LOGREC_REDO_INDEX_FREE_PAGE, |
122 | LOGREC_REDO_UNDELETE_ROW, |
123 | LOGREC_CLR_END, |
124 | LOGREC_PURGE_END, |
125 | LOGREC_UNDO_ROW_INSERT, |
126 | LOGREC_UNDO_ROW_DELETE, |
127 | LOGREC_UNDO_ROW_UPDATE, |
128 | LOGREC_UNDO_KEY_INSERT, |
129 | LOGREC_UNDO_KEY_INSERT_WITH_ROOT, |
130 | LOGREC_UNDO_KEY_DELETE, |
131 | LOGREC_UNDO_KEY_DELETE_WITH_ROOT, |
132 | LOGREC_PREPARE, |
133 | LOGREC_PREPARE_WITH_UNDO_PURGE, |
134 | LOGREC_COMMIT, |
135 | LOGREC_COMMIT_WITH_UNDO_PURGE, |
136 | LOGREC_CHECKPOINT, |
137 | LOGREC_REDO_CREATE_TABLE, |
138 | LOGREC_REDO_RENAME_TABLE, |
139 | LOGREC_REDO_DROP_TABLE, |
140 | LOGREC_REDO_DELETE_ALL, |
141 | LOGREC_REDO_REPAIR_TABLE, |
142 | LOGREC_FILE_ID, |
143 | LOGREC_LONG_TRANSACTION_ID, |
144 | LOGREC_INCOMPLETE_LOG, |
145 | LOGREC_INCOMPLETE_GROUP, |
146 | LOGREC_UNDO_BULK_INSERT, |
147 | LOGREC_REDO_BITMAP_NEW_PAGE, |
148 | LOGREC_IMPORTED_TABLE, |
149 | LOGREC_DEBUG_INFO, |
150 | LOGREC_FIRST_FREE, |
151 | LOGREC_RESERVED_FUTURE_EXTENSION= 63 |
152 | }; |
153 | #define LOGREC_NUMBER_OF_TYPES 64 /* Maximum, can't be extended */ |
154 | |
155 | /* Type of operations in LOGREC_REDO_INDEX */ |
156 | |
157 | enum en_key_op |
158 | { |
159 | KEY_OP_NONE, /* Not used */ |
160 | KEY_OP_OFFSET, /* Set current position */ |
161 | KEY_OP_SHIFT, /* Shift up/or down at current position */ |
162 | KEY_OP_CHANGE, /* Change data at current position */ |
163 | KEY_OP_ADD_PREFIX, /* Insert data at start of page */ |
164 | KEY_OP_DEL_PREFIX, /* Delete data at start of page */ |
165 | KEY_OP_ADD_SUFFIX, /* Insert data at end of page */ |
166 | KEY_OP_DEL_SUFFIX, /* Delete data at end of page */ |
167 | KEY_OP_CHECK, /* For debugging; CRC of used part of page */ |
168 | KEY_OP_MULTI_COPY, /* List of memcpy()s with fixed-len sources in page */ |
169 | KEY_OP_SET_PAGEFLAG, /* Set pageflag from next byte */ |
170 | KEY_OP_COMPACT_PAGE, /* Compact key page */ |
171 | KEY_OP_MAX_PAGELENGTH, /* Set page to max page length */ |
172 | KEY_OP_DEBUG, /* Entry for storing what triggered redo_index */ |
173 | KEY_OP_DEBUG_2 /* Entry for pagelengths */ |
174 | }; |
175 | |
176 | enum en_key_debug |
177 | { |
178 | KEY_OP_DEBUG_RTREE_COMBINE, /* 0 */ |
179 | KEY_OP_DEBUG_RTREE_SPLIT, /* 1 */ |
180 | KEY_OP_DEBUG_RTREE_SET_KEY, /* 2 */ |
181 | KEY_OP_DEBUG_FATHER_CHANGED_1, /* 3 */ |
182 | KEY_OP_DEBUG_FATHER_CHANGED_2, /* 4 */ |
183 | KEY_OP_DEBUG_LOG_SPLIT, /* 5 */ |
184 | KEY_OP_DEBUG_LOG_ADD_1, /* 6 */ |
185 | KEY_OP_DEBUG_LOG_ADD_2, /* 7 */ |
186 | KEY_OP_DEBUG_LOG_ADD_3, /* 8 */ |
187 | KEY_OP_DEBUG_LOG_ADD_4, /* 9 */ |
188 | KEY_OP_DEBUG_LOG_PREFIX_1, /* 10 */ |
189 | KEY_OP_DEBUG_LOG_PREFIX_2, /* 11 */ |
190 | KEY_OP_DEBUG_LOG_PREFIX_3, /* 12 */ |
191 | KEY_OP_DEBUG_LOG_PREFIX_4, /* 13 */ |
192 | KEY_OP_DEBUG_LOG_PREFIX_5, /* 14 */ |
193 | KEY_OP_DEBUG_LOG_DEL_CHANGE_1, /* 15 */ |
194 | KEY_OP_DEBUG_LOG_DEL_CHANGE_2, /* 16 */ |
195 | KEY_OP_DEBUG_LOG_DEL_CHANGE_3, /* 17 */ |
196 | KEY_OP_DEBUG_LOG_DEL_CHANGE_RT, /* 18 */ |
197 | KEY_OP_DEBUG_LOG_DEL_PREFIX, /* 19 */ |
198 | KEY_OP_DEBUG_LOG_MIDDLE /* 20 */ |
199 | }; |
200 | |
201 | |
202 | enum translog_debug_info_type |
203 | { |
204 | LOGREC_DEBUG_INFO_QUERY |
205 | }; |
206 | |
207 | /* Size of log file; One log file is restricted to 4G */ |
208 | typedef uint32 translog_size_t; |
209 | |
210 | #define 1024U |
211 | |
212 | typedef struct st_translog_group_descriptor |
213 | { |
214 | TRANSLOG_ADDRESS addr; |
215 | uint8 num; |
216 | } TRANSLOG_GROUP; |
217 | |
218 | |
219 | typedef struct |
220 | { |
221 | /* LSN of the read record */ |
222 | LSN ; |
223 | /* array of groups descriptors, can be used only if groups_no > 0 */ |
224 | TRANSLOG_GROUP *; |
225 | /* short transaction ID or 0 if it has no sense for the record */ |
226 | SHORT_TRANSACTION_ID ; |
227 | /* |
228 | The Record length in buffer (including read header, but excluding |
229 | hidden part of record (type, short TrID, length) |
230 | */ |
231 | translog_size_t ; |
232 | /* |
233 | Buffer for write decoded header of the record (depend on the record |
234 | type) |
235 | */ |
236 | uchar [TRANSLOG_RECORD_HEADER_MAX_SIZE]; |
237 | /* number of groups listed in */ |
238 | uint ; |
239 | /* in multi-group number of chunk0 pages (valid only if groups_no > 0) */ |
240 | uint ; |
241 | /* type of the read record */ |
242 | enum translog_record_type ; |
243 | /* chunk 0 data address (valid only if groups_no > 0) */ |
244 | TRANSLOG_ADDRESS ; |
245 | /* |
246 | Real compressed LSN(s) size economy (<number of LSN(s)>*7 - <real_size>) |
247 | */ |
248 | int16 ; |
249 | /* short transaction ID or 0 if it has no sense for the record */ |
250 | uint16 ; |
251 | /* non read body data length in this first chunk */ |
252 | uint16 ; |
253 | /* chunk 0 data size (valid only if groups_no > 0) */ |
254 | uint16 ; |
255 | } ; |
256 | |
257 | |
258 | typedef struct st_translog_scanner_data |
259 | { |
260 | uchar buffer[TRANSLOG_PAGE_SIZE]; /* buffer for page content */ |
261 | TRANSLOG_ADDRESS page_addr; /* current page address */ |
262 | /* end of the log which we saw last time */ |
263 | TRANSLOG_ADDRESS horizon; |
264 | TRANSLOG_ADDRESS last_file_page; /* Last page on in this file */ |
265 | uchar *page; /* page content pointer */ |
266 | /* direct link on the current page or NULL if not supported/requested */ |
267 | PAGECACHE_BLOCK_LINK *direct_link; |
268 | /* offset of the chunk in the page */ |
269 | translog_size_t page_offset; |
270 | /* set horizon only once at init */ |
271 | my_bool fixed_horizon; |
272 | /* try to get direct link on the page if it is possible */ |
273 | my_bool use_direct_link; |
274 | } TRANSLOG_SCANNER_DATA; |
275 | |
276 | |
277 | typedef struct st_translog_reader_data |
278 | { |
279 | TRANSLOG_HEADER_BUFFER ; /* Header */ |
280 | TRANSLOG_SCANNER_DATA scanner; /* chunks scanner */ |
281 | translog_size_t body_offset; /* current chunk body offset */ |
282 | /* data offset from the record beginning */ |
283 | translog_size_t current_offset; |
284 | /* number of bytes read in header */ |
285 | uint16 ; |
286 | uint16 chunk_size; /* current chunk size */ |
287 | uint current_group; /* current group */ |
288 | uint current_chunk; /* current chunk in the group */ |
289 | my_bool eor; /* end of the record */ |
290 | } TRANSLOG_READER_DATA; |
291 | |
292 | C_MODE_START |
293 | |
294 | /* Records types for unittests */ |
295 | #define LOGREC_FIXED_RECORD_0LSN_EXAMPLE 1 |
296 | #define LOGREC_VARIABLE_RECORD_0LSN_EXAMPLE 2 |
297 | #define LOGREC_FIXED_RECORD_1LSN_EXAMPLE 3 |
298 | #define LOGREC_VARIABLE_RECORD_1LSN_EXAMPLE 4 |
299 | #define LOGREC_FIXED_RECORD_2LSN_EXAMPLE 5 |
300 | #define LOGREC_VARIABLE_RECORD_2LSN_EXAMPLE 6 |
301 | |
302 | extern void translog_example_table_init(); |
303 | extern void translog_table_init(); |
304 | #define translog_init(D,M,V,I,C,F,R) \ |
305 | translog_init_with_table(D,M,V,I,C,F,R,&translog_table_init,0) |
306 | extern my_bool translog_init_with_table(const char *directory, |
307 | uint32 log_file_max_size, |
308 | uint32 server_version, |
309 | uint32 server_id, |
310 | PAGECACHE *pagecache, |
311 | uint flags, |
312 | my_bool readonly, |
313 | void (*init_table_func)(), |
314 | my_bool no_error); |
315 | #ifndef DBUG_OFF |
316 | void check_translog_description_table(int num); |
317 | #endif |
318 | |
319 | extern my_bool |
320 | translog_write_record(LSN *lsn, enum translog_record_type type, TRN *trn, |
321 | MARIA_HA *tbl_info, |
322 | translog_size_t rec_len, uint part_no, |
323 | LEX_CUSTRING *parts_data, uchar *store_share_id, |
324 | void *hook_arg); |
325 | |
326 | extern void translog_destroy(); |
327 | |
328 | extern int (LSN lsn, TRANSLOG_HEADER_BUFFER *buff); |
329 | |
330 | extern void (TRANSLOG_HEADER_BUFFER *buff); |
331 | |
332 | extern translog_size_t translog_read_record(LSN lsn, |
333 | translog_size_t offset, |
334 | translog_size_t length, |
335 | uchar *buffer, |
336 | struct st_translog_reader_data |
337 | *data); |
338 | |
339 | extern my_bool translog_flush(TRANSLOG_ADDRESS lsn); |
340 | |
341 | extern my_bool translog_scanner_init(LSN lsn, |
342 | my_bool fixed_horizon, |
343 | struct st_translog_scanner_data *scanner, |
344 | my_bool use_direct_link); |
345 | extern void translog_destroy_scanner(TRANSLOG_SCANNER_DATA *scanner); |
346 | |
347 | extern int (TRANSLOG_SCANNER_DATA *scanner, |
348 | TRANSLOG_HEADER_BUFFER *buff); |
349 | extern LSN translog_get_file_max_lsn_stored(uint32 file); |
350 | extern my_bool translog_purge(TRANSLOG_ADDRESS low); |
351 | extern my_bool translog_is_file(uint file_no); |
352 | extern void translog_lock(); |
353 | extern void translog_unlock(); |
354 | extern void translog_lock_handler_assert_owner(); |
355 | extern TRANSLOG_ADDRESS translog_get_horizon(); |
356 | extern TRANSLOG_ADDRESS translog_get_horizon_no_lock(); |
357 | extern int translog_assign_id_to_share(struct st_maria_handler *tbl_info, |
358 | TRN *trn); |
359 | extern void translog_deassign_id_from_share(struct st_maria_share *share); |
360 | extern void |
361 | translog_assign_id_to_share_from_recovery(struct st_maria_share *share, |
362 | uint16 id); |
363 | extern my_bool translog_walk_filenames(const char *directory, |
364 | my_bool (*callback)(const char *, |
365 | const char *)); |
366 | extern void dump_page(uchar *buffer, File handler); |
367 | extern my_bool translog_log_debug_info(TRN *trn, |
368 | enum translog_debug_info_type type, |
369 | uchar *info, size_t length); |
370 | |
371 | enum enum_translog_status |
372 | { |
373 | TRANSLOG_UNINITED, /* no initialization done or error during initialization */ |
374 | TRANSLOG_OK, /* transaction log is functioning */ |
375 | TRANSLOG_READONLY, /* read only mode due to write errors */ |
376 | TRANSLOG_SHUTDOWN /* going to shutdown the loghandler */ |
377 | }; |
378 | extern enum enum_translog_status translog_status; |
379 | extern ulonglong translog_syncs; /* Number of sync()s */ |
380 | |
381 | void translog_soft_sync(my_bool mode); |
382 | void translog_hard_group_commit(my_bool mode); |
383 | int translog_soft_sync_start(void); |
384 | void translog_soft_sync_end(void); |
385 | void translog_sync(); |
386 | void translog_set_group_commit_interval(uint32 interval); |
387 | |
388 | /* |
389 | all the rest added because of recovery; should we make |
390 | ma_loghandler_for_recovery.h ? |
391 | */ |
392 | |
393 | /* |
394 | Information from transaction log file header |
395 | */ |
396 | |
397 | typedef struct st_loghandler_file_info |
398 | { |
399 | /* |
400 | LSN_IMPOSSIBLE for current file (not finished file). |
401 | Maximum LSN of the record which parts stored in the |
402 | file. |
403 | */ |
404 | LSN max_lsn; |
405 | ulonglong timestamp; /* Time stamp */ |
406 | ulong maria_version; /* Version of maria loghandler */ |
407 | ulong mysql_version; /* Version of mysql server */ |
408 | ulong server_id; /* Server ID */ |
409 | ulong page_size; /* Loghandler page size */ |
410 | ulong file_number; /* Number of the file (from the file header) */ |
411 | } LOGHANDLER_FILE_INFO; |
412 | |
413 | #define SHARE_ID_MAX 65535 /* array's size */ |
414 | |
415 | extern void translog_fill_overhead_table(); |
416 | extern void (LOGHANDLER_FILE_INFO *desc, |
417 | uchar *page_buff); |
418 | extern LSN translog_first_lsn_in_log(); |
419 | extern LSN translog_first_theoretical_lsn(); |
420 | extern LSN translog_next_LSN(TRANSLOG_ADDRESS addr, TRANSLOG_ADDRESS horizon); |
421 | extern my_bool translog_purge_at_flush(); |
422 | extern uint32 translog_get_first_file(TRANSLOG_ADDRESS horizon); |
423 | extern uint32 translog_get_first_needed_file(); |
424 | extern char *translog_filename_by_fileno(uint32 file_no, char *path); |
425 | extern void translog_set_file_size(uint32 size); |
426 | |
427 | /* record parts descriptor */ |
428 | struct st_translog_parts |
429 | { |
430 | /* full record length */ |
431 | translog_size_t record_length; |
432 | /* full record length with chunk headers */ |
433 | translog_size_t total_record_length; |
434 | /* current part index */ |
435 | uint current; |
436 | /* total number of elements in parts */ |
437 | uint elements; |
438 | /* array of parts */ |
439 | LEX_CUSTRING *parts; |
440 | }; |
441 | |
442 | typedef my_bool(*prewrite_rec_hook) (enum translog_record_type type, |
443 | TRN *trn, |
444 | struct st_maria_handler *tbl_info, |
445 | void *hook_arg); |
446 | |
447 | typedef my_bool(*inwrite_rec_hook) (enum translog_record_type type, |
448 | TRN *trn, |
449 | struct st_maria_handler *tbl_info, |
450 | LSN *lsn, void *hook_arg); |
451 | |
452 | typedef uint16(*read_rec_hook) (enum translog_record_type type, |
453 | uint16 read_length, uchar *read_buff, |
454 | uchar *decoded_buff); |
455 | |
456 | |
457 | /* record classes */ |
458 | enum record_class |
459 | { |
460 | LOGRECTYPE_NOT_ALLOWED, |
461 | LOGRECTYPE_VARIABLE_LENGTH, |
462 | LOGRECTYPE_PSEUDOFIXEDLENGTH, |
463 | LOGRECTYPE_FIXEDLENGTH |
464 | }; |
465 | |
466 | enum enum_record_in_group { |
467 | LOGREC_NOT_LAST_IN_GROUP= 0, LOGREC_LAST_IN_GROUP, LOGREC_IS_GROUP_ITSELF |
468 | }; |
469 | |
470 | /* |
471 | Descriptor of log record type |
472 | */ |
473 | typedef struct st_log_record_type_descriptor |
474 | { |
475 | /* internal class of the record */ |
476 | enum record_class rclass; |
477 | /* |
478 | length for fixed-size record, pseudo-fixed record |
479 | length with uncompressed LSNs |
480 | */ |
481 | uint16 fixed_length; |
482 | /* how much record body (belonged to headers too) read with headers */ |
483 | uint16 ; |
484 | /* HOOK for writing the record called before lock */ |
485 | prewrite_rec_hook prewrite_hook; |
486 | /* HOOK for writing the record called when LSN is known, inside lock */ |
487 | inwrite_rec_hook inwrite_hook; |
488 | /* HOOK for reading headers */ |
489 | read_rec_hook read_hook; |
490 | /* |
491 | For pseudo fixed records number of compressed LSNs followed by |
492 | system header |
493 | */ |
494 | int16 compressed_LSN; |
495 | /* the rest is for maria_read_log & Recovery */ |
496 | /** @brief for debug error messages or "maria_read_log" command-line tool */ |
497 | const char *name; |
498 | enum enum_record_in_group record_in_group; |
499 | /* a function to execute when we see the record during the REDO phase */ |
500 | int (*record_execute_in_redo_phase)(const TRANSLOG_HEADER_BUFFER *); |
501 | /* a function to execute when we see the record during the UNDO phase */ |
502 | int (*record_execute_in_undo_phase)(const TRANSLOG_HEADER_BUFFER *, TRN *); |
503 | } LOG_DESC; |
504 | |
505 | extern LOG_DESC log_record_type_descriptor[LOGREC_NUMBER_OF_TYPES]; |
506 | |
507 | typedef enum |
508 | { |
509 | TRANSLOG_GCOMMIT_NONE, |
510 | TRANSLOG_GCOMMIT_HARD, |
511 | TRANSLOG_GCOMMIT_SOFT |
512 | } enum_maria_group_commit; |
513 | extern ulong maria_group_commit; |
514 | extern ulong maria_group_commit_interval; |
515 | typedef enum |
516 | { |
517 | TRANSLOG_PURGE_IMMIDIATE, |
518 | TRANSLOG_PURGE_EXTERNAL, |
519 | TRANSLOG_PURGE_ONDEMAND |
520 | } enum_maria_translog_purge_type; |
521 | extern ulong log_purge_type; |
522 | extern ulong log_file_size; |
523 | |
524 | typedef enum |
525 | { |
526 | TRANSLOG_SYNC_DIR_NEVER, |
527 | TRANSLOG_SYNC_DIR_NEWFILE, |
528 | TRANSLOG_SYNC_DIR_ALWAYS |
529 | } enum_maria_sync_log_dir; |
530 | extern ulong sync_log_dir; |
531 | |
532 | C_MODE_END |
533 | #endif |
534 | |