MySQL 8.4.2
Source Code Documentation
log0recv.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1997, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/log0recv.h
29 Recovery
30
31 Created 9/20/1997 Heikki Tuuri
32 *******************************************************/
33
34#ifndef log0recv_h
35#define log0recv_h
36
37#include "buf0types.h"
38#include "dict0types.h"
39#include "hash0hash.h"
40#include "log0sys.h"
41#include "mtr0types.h"
42
43/* OS_FILE_LOG_BLOCK_SIZE */
44#include "os0file.h"
45
46#include "ut0byte.h"
47#include "ut0new.h"
48
49#include <list>
50#include <unordered_map>
51#include <unordered_set>
52
53class MetadataRecover;
55
56#ifdef UNIV_HOTBACKUP
57
58struct recv_addr_t;
59
60/** list of tablespaces, that experienced an inplace DDL during a backup op */
61extern std::list<std::pair<space_id_t, lsn_t>> index_load_list;
62/** the last redo log flush len as seen by MEB */
63extern volatile lsn_t backup_redo_log_flushed_lsn;
64/** true when the redo log is being backed up */
65extern bool recv_is_making_a_backup;
66
67/** Scans the log segment and n_bytes_scanned is set to the length of valid
68log scanned.
69@param[in] buf buffer containing log data
70@param[in] buf_len data length in that buffer
71@param[in,out] scanned_lsn lsn of buffer start, we return scanned
72lsn
73@param[in,out] scanned_checkpoint_no 4 lowest bytes of the highest scanned
74@param[out] block_no highest block no in scanned buffer.
75checkpoint number so far
76@param[out] n_bytes_scanned how much we were able to scan, smaller
77than buf_len if log data ended here
78@param[out] has_encrypted_log set true, if buffer contains encrypted
79redo log, set false otherwise */
80void meb_scan_log_seg(byte *buf, size_t buf_len, lsn_t *scanned_lsn,
81 uint32_t *scanned_checkpoint_no, uint32_t *block_no,
82 size_t *n_bytes_scanned, bool *has_encrypted_log);
83
84/** Applies the hashed log records to the page, if the page lsn is less than the
85lsn of a log record. This can be called when a buffer page has just been
86read in, or also for a page already in the buffer pool.
87
88
89@param[in,out] block buffer block */
91
92/** Wrapper for recv_recover_page_func().
93Applies the hashed log records to the page, if the page lsn is less than the
94lsn of a log record. This can be called when a buffer page has just been
95read in, or also for a page already in the buffer pool.
96@param jri in: true if just read in (the i/o handler calls this for
97a freshly read page)
98@param block in,out: the buffer block
99*/
100static inline void recv_recover_page(bool jri [[maybe_unused]],
101 buf_block_t *block) {
103}
104
105/** Applies log records in the hash table to a backup. */
106void meb_apply_log_recs(void);
107
108/** Applies log records in the hash table to a backup using a callback
109functions.
110@param[in] apply_log_record_function function for apply
111@param[in] wait_till_done_function function for wait */
112void meb_apply_log_recs_via_callback(
113 void (*apply_log_record_function)(recv_addr_t *),
114 void (*wait_till_done_function)());
115
116/** Applies a log record in the hash table to a backup.
117@param[in] recv_addr chain of log records
118@param[in,out] block buffer block to apply the records to */
119void meb_apply_log_record(recv_addr_t *recv_addr, buf_block_t *block);
120
121/** Process a file name passed as an input
122@param[in] name absolute path of tablespace file
123@param[in] space_id the tablespace ID
124@retval true if able to process file successfully.
125@retval false if unable to process the file */
126void meb_fil_name_process(const char *name, space_id_t space_id);
127
128/** Scans log from a buffer and stores new log data to the parsing buffer.
129Parses and hashes the log records if new data found. Unless
130UNIV_HOTBACKUP is defined, this function will apply log records
131automatically when the hash table becomes full.
132@param[in] available_memory we let the hash table of recs
133to grow to this size, at the maximum
134@param[in] buf buffer containing a log
135segment or garbage
136@param[in] len buffer length
137@param[in] start_lsn buffer start lsn
138@param[out] group_scanned_lsn scanning succeeded up to this lsn
139@retval true if limit_lsn has been reached, or not able to scan any
140more in this log group
141@retval false otherwise */
142bool meb_scan_log_recs(size_t available_memory, const byte *buf, size_t len,
143 lsn_t start_lsn, lsn_t *group_scanned_lsn);
144
145/** Check the 4-byte checksum to the trailer checksum field of a log
146block.
147@param[in] block pointer to a log block
148@return whether the checksum matches */
149bool log_block_checksum_is_ok(const byte *block);
150#else /* UNIV_HOTBACKUP */
151
152/** Applies the hashed log records to the page, if the page lsn is less than the
153lsn of a log record. This can be called when a buffer page has just been
154read in, or also for a page already in the buffer pool.
155
156
157@param[in] just_read_in true if the IO handler calls this for a freshly
158 read page
159@param[in,out] block buffer block */
160void recv_recover_page_func(bool just_read_in, buf_block_t *block);
161
162/** Wrapper for recv_recover_page_func().
163Applies the hashed log records to the page, if the page lsn is less than the
164lsn of a log record. This can be called when a buffer page has just been
165read in, or also for a page already in the buffer pool.
166@param jri in: true if just read in (the i/o handler calls this for
167a freshly read page)
168@param[in,out] block buffer block */
169static inline void recv_recover_page(bool jri, buf_block_t *block) {
170 recv_recover_page_func(jri, block);
171}
172
173#endif /* UNIV_HOTBACKUP */
174
175/** Frees the recovery system. */
176void recv_sys_free();
177
178/** Reset the state of the recovery system variables. */
179void recv_sys_var_init();
180
181#ifdef UNIV_HOTBACKUP
182/** Get the number of bytes used by all the heaps
183@return number of bytes used */
184size_t meb_heap_used();
185#endif /* UNIV_HOTBACKUP */
186
187/** Returns true if recovery is currently running.
188@return recv_recovery_on */
189[[nodiscard]] static inline bool recv_recovery_is_on();
190
191/** Returns true if the page is brand new (the next log record is init_file_page
192or no records to apply).
193@param[in] block buffer block
194@return true if brand new */
196
197/** Start recovering from a redo log checkpoint.
198@see recv_recovery_from_checkpoint_finish
199@param[in,out] log redo log
200@param[in] flush_lsn lsn stored at offset FIL_PAGE_FILE_FLUSH_LSN
201 in the system tablespace header
202@return error code or DB_SUCCESS */
204 lsn_t flush_lsn);
205
206/** Determine if a redo log from a version before MySQL 8.0.30 is clean.
207@param[in,out] log redo log
208@return error code
209@retval DB_SUCCESS if the redo log is clean
210@retval DB_ERROR if the redo log is corrupted or dirty */
212
213/** Complete the recovery from the latest checkpoint.
214@param[in] aborting true if the server has to abort due to an error
215@return recovered persistent metadata or nullptr if aborting*/
217 bool aborting);
218
219/** Creates the recovery system. */
220void recv_sys_create();
221
222/** Release recovery system mutexes. */
223void recv_sys_close();
224
225/** Inits the recovery system for a recovery operation. */
226void recv_sys_init();
227
228/** Calculates the new value for lsn when more data is added to the log.
229@param[in] lsn Old LSN
230@param[in] len This many bytes of data is added, log block
231 headers not included
232@return LSN after data addition */
234
235/** Empties the hash table of stored log records, applying them to appropriate
236pages.
237@param[in,out] log redo log
238@param[in] allow_ibuf if true, ibuf operations are allowed during
239 the application; if false, no ibuf operations
240 are allowed, and after the application all
241 file pages are flushed to disk and invalidated
242 in buffer pool: this alternative means that
243 no new log records can be generated during
244 the application; the caller must in this case
245 own the log mutex */
246void recv_apply_hashed_log_recs(log_t &log, bool allow_ibuf);
247
248#if defined(UNIV_DEBUG) || defined(UNIV_HOTBACKUP)
249/** Return string name of the redo log record type.
250@param[in] type record log record enum
251@return string name of record log record */
252const char *get_mlog_string(mlog_id_t type);
253#endif /* UNIV_DEBUG || UNIV_HOTBACKUP */
254
255/** Block of log record data */
257 /** pointer to the next block or NULL. The log record data
258 is stored physically immediately after this struct, max amount
259 RECV_DATA_BLOCK_SIZE bytes of it */
260
262};
263
264/** Stored log record struct */
265struct recv_t {
267
268 /** Log record type */
270
271 /** Log record body length in bytes */
273
274 /** Chain of blocks containing the log record body */
276
277 /** Start lsn of the log segment written by the mtr which generated
278 this log record: NOTE that this is not necessarily the start lsn of
279 this log record */
281
282 /** End lsn of the log segment written by the mtr which generated
283 this log record: NOTE that this is not necessarily the end LSN of
284 this log record */
286
287 /** List node, list anchored in recv_addr_t */
289};
290
291/** States of recv_addr_t */
293
294 /** not yet processed */
296
297 /** page is being read */
299
300 /** log records are being applied on the page */
302
303 /** log records have been applied on the page */
305
306 /** log records have been discarded because the tablespace
307 does not exist */
310
311/** Hashed page file address struct */
314
315 /** recovery state of the page */
317
318 /** Space ID */
320
321 /** Page number */
323
324 /** List of log records for this page */
326};
327
328// Forward declaration
329namespace dblwr {
330namespace recv {
331class DBLWR;
332}
333} // namespace dblwr
334
335/** Class to parse persistent dynamic metadata redo log, store and
336merge them and apply them to in-memory table objects finally */
339 table_id_t, PersistentTableMetadata *, std::less<table_id_t>,
341
342 public:
343 /** Default constructor */
345
346 /** Destructor */
348
349 /** Parse a dynamic metadata redo log of a table and store
350 the metadata locally
351 @param[in] id table id
352 @param[in] version table dynamic metadata version
353 @param[in] ptr redo log start
354 @param[in] end end of redo log
355 @retval ptr to next redo log record, nullptr if this log record
356 was truncated */
357 const byte *parseMetadataLog(table_id_t id, uint64_t version, const byte *ptr,
358 const byte *end);
359
360 /** Store the collected persistent dynamic metadata to
361 mysql.innodb_dynamic_metadata */
362 void store();
363
364 /** If there is any metadata to be applied
365 @return true if any metadata to be applied, otherwise false */
366 bool empty() const { return m_tables.empty(); }
367
368 private:
369 /** Get the dynamic metadata of a specified table,
370 create a new one if not exist
371 @param[in] id table id
372 @return the metadata of the specified table */
374
375 private:
376 /** Map used to store and merge persistent dynamic metadata */
378};
379
380/** Recovery system data structure */
382 using Pages =
383 std::unordered_map<page_no_t, recv_addr_t *, std::hash<page_no_t>,
384 std::equal_to<page_no_t>>;
385
386 /** Every space has its own heap and pages that belong to it. */
387 struct Space {
388 /** Constructor
389 @param[in,out] heap Heap to use for the log records. */
390 explicit Space(mem_heap_t *heap) : m_heap(heap), m_pages() {}
391
392 /** Default constructor */
393 Space() : m_heap(), m_pages() {}
394
395 /** Memory heap of log records and file addresses */
397
398 /** Pages that need to be recovered */
400 };
401
402 using Missing_Ids = std::unordered_set<space_id_t>;
403
404 using Spaces = std::unordered_map<space_id_t, Space, std::hash<space_id_t>,
405 std::equal_to<space_id_t>>;
406
407 /* Recovery encryption information */
409 /** Tablespace ID */
411
412 /** LSN of REDO log encryption entry */
414
415 /** Encryption key */
416 byte *ptr;
417
418 /** Encryption IV */
419 byte *iv;
420 };
421
422 using Encryption_Keys = std::vector<Encryption_Key>;
423
424 /** Mini transaction log record. */
425 struct Mlog_record {
426 /* Space ID */
428 /* Page number */
430 /* Log type */
432 /* Log body */
433 const byte *body;
434 /* Record size */
435 size_t size;
436 };
437
438 using Mlog_records = std::vector<Mlog_record, ut::allocator<Mlog_record>>;
439
440 /** While scanning logs for multi-record mini-transaction (mtr), we have two
441 passes. In first pass, we check if all the logs of the mtr is present in
442 current recovery buffer or not. If yes, then in second pass we go through the
443 logs again the add to hash table for apply. To avoid parsing multiple times,
444 we save the parsed records in first pass and reuse them in second pass.
445
446 Parsing of redo log takes significant amount of time and this optimization of
447 avoiding second parse gave about 1.8x speed up on recovery scan time of 1G of
448 redo log from sysbench rw test.
449
450 There is currently no limit for maximum number of logs in an mtr. Practically,
451 from sysbench rw test recovery with 1G of redo log to recover from the record
452 count were spread from 3 - 1235 with majority between 600 - 700. So, it is
453 likely by saving 1k records we could avoid most of the re-parsing overhead.
454 Considering possible bigger number of records in other load and future changes
455 the limit for number of saved records is kept at 8k. The same value from the
456 contribution patch. The memory requirement 32 x 8k = 256k seems fine as one
457 time overhead for the entire instance. */
458 static constexpr size_t MAX_SAVED_MLOG_RECS = 8 * 1024;
459
460 /** Save mlog record information. Silently returns if cannot save. Works only
461 in single threaded recovery scanner.
462 @param[in] rec_num record number in multi record group
463 @param[in] space_id space ID for the log record
464 @param[in] page_no page number for the log record
465 @param[in] type log record type
466 @param[in] body pointer to log record body in recovery buffer
467 @param[in] len length of the log record */
468 void save_rec(size_t rec_num, space_id_t space_id, page_no_t page_no,
469 mlog_id_t type, const byte *body, size_t len) {
470 /* No more space to save log. */
471 if (rec_num >= MAX_SAVED_MLOG_RECS) {
472 return;
473 }
474
475 ut_ad(rec_num < saved_recs.size());
476
477 if (rec_num >= saved_recs.size()) {
478 return;
479 }
480
481 auto &saved_rec = saved_recs[rec_num];
482
483 saved_rec.space_id = space_id;
484 saved_rec.page_no = page_no;
485 saved_rec.type = type;
486 saved_rec.body = body;
487 saved_rec.size = len;
488 }
489
490 /** Return saved mlog record information, if there. Works only
491 in single threaded recovery scanner.
492 @param[in] rec_num record number in multi record group
493 @param[out] space_id space ID for the log record
494 @param[out] page_no page number for the log record
495 @param[out] type log record type
496 @param[out] body pointer to log record body in recovery buffer
497 @param[out] len length of the log record
498 @return true iff saved record data is found. */
499 bool get_saved_rec(size_t rec_num, space_id_t &space_id, page_no_t &page_no,
500 mlog_id_t &type, const byte *&body, size_t &len) {
501 if (rec_num >= MAX_SAVED_MLOG_RECS) {
502 return false;
503 }
504
505 ut_ad(rec_num < saved_recs.size());
506
507 if (rec_num >= saved_recs.size()) {
508 return false;
509 }
510
511 auto &saved_rec = saved_recs[rec_num];
512
513 space_id = saved_rec.space_id;
514 page_no = saved_rec.page_no;
515 type = saved_rec.type;
516 body = const_cast<byte *>(saved_rec.body);
517 len = saved_rec.size;
518
519 return true;
520 }
521
522#ifndef UNIV_HOTBACKUP
523
524 /*!< mutex protecting the fields apply_log_recs, n_addrs, and the
525 state field in each recv_addr struct */
526 ib_mutex_t mutex;
527
528 /** mutex coordinating flushing between recv_writer_thread and
529 the recovery thread. */
530 ib_mutex_t writer_mutex;
531
532 /** event to activate page cleaner threads */
534
535 /** event to signal that the page cleaner has finished the request */
537
538 /** type of the flush request. BUF_FLUSH_LRU: flush end of LRU,
539 keeping free blocks. BUF_FLUSH_LIST: flush all of blocks. */
541
542#else /* !UNIV_HOTBACKUP */
543 bool apply_file_operations;
544#endif /* !UNIV_HOTBACKUP */
545
546 /** This is true when log rec application to pages is allowed;
547 this flag tells the i/o-handler if it should do log record
548 application */
550
551 /** This is true when a log rec application batch is running */
553
554 /** Buffer for parsing log records */
555 byte *buf;
556
557 /** Size of the parsing buffer */
558 size_t buf_len;
559
560 /** Amount of data in buf */
562
563 /** This is the lsn from which we were able to start parsing
564 log records and adding them to the hash table; zero if a suitable
565 start point not found yet */
567
568 /** Checkpoint lsn that was used during recovery (read from file). */
570
571 /** Number of data bytes to ignore until we reach checkpoint_lsn. */
573
574 /** The log data has been scanned up to this lsn */
576
577 /** The log data has been scanned up to this epoch_no */
579
580 /** Start offset of non-parsed log records in buf */
582
583 /** The log records have been parsed up to this lsn */
585
586 /** The previous value of recovered_lsn - before we parsed the last mtr.
587 It is equal to recovered_lsn before we parsed any mtr. This is used to
588 find moments in which recovered_lsn moves to the next block in which case
589 we should update the last_block_first_rec_group (described below). */
591
592 /** Tracks what should be the proper value of first_rec_group field in the
593 header of the block to which recovered_lsn belongs. It might be also zero,
594 in which case it means we do not know. */
596
597 /** Set when finding a corrupt log block or record, or there
598 is a log parsing buffer overflow */
600
601 /** Set when an inconsistency with the file system contents
602 is detected during log scan or apply */
604
605 /** Data directory has been recognized as cloned data directory. */
607
608 /** Data directory has been recognized as data directory from MEB. */
610
611 /** Doublewrite buffer state before MEB recovery starts. We restore to this
612 state after MEB recovery completes and disable the doublewrite buffer during
613 MEB recovery. */
615
616 /** Hash table of pages, indexed by SpaceID. */
618
619 /** Number of not processed hashed file addresses in the hash table */
621
622 /** Doublewrite buffer pages, destroyed after recovery completes */
624
625 /** We store and merge all table persistent data here during
626 scanning redo logs */
628
629 /** Encryption Key information per tablespace ID */
631
632 /** Tablespace IDs that were ignored during redo log apply. */
634
635 /** Tablespace IDs that were explicitly deleted. */
637
638 /* Saved log records to avoid second round parsing log. */
640};
641
642/** The recovery system */
643extern recv_sys_t *recv_sys;
644
645/** true when applying redo log records during crash recovery; false
646otherwise. Note that this is false while a background thread is
647rolling back incomplete transactions. */
648extern volatile bool recv_recovery_on;
649
650/** If the following is true, the buffer pool file pages must be invalidated
651after recovery and no ibuf operations are allowed; this becomes true if
652the log record hash table becomes too full, and log records must be merged
653to file pages already before the recovery is finished: in this case no
654ibuf operations are allowed, as they could modify the pages read in the
655buffer pool before the pages have been recovered to the up-to-date state.
656
657true means that recovery is running and no operations on the log files
658are allowed yet: the variable name is misleading. */
659extern bool recv_no_ibuf_operations;
660
661/** true when recv_init_crash_recovery() has been called. */
662extern bool recv_needed_recovery;
663
664/** true if buf_page_is_corrupted() should check if the log sequence
665number (FIL_PAGE_LSN) is in the future. Initially false, and set by
666recv_recovery_from_checkpoint_start(). */
667extern bool recv_lsn_checks_on;
668
669/** Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many
670times! */
671constexpr uint32_t RECV_PARSING_BUF_SIZE = 2 * 1024 * 1024;
672
673/** Size of block reads when the log groups are scanned forward to do a
674roll-forward */
675#define RECV_SCAN_SIZE (4 * UNIV_PAGE_SIZE)
676
678
679/** A list of tablespaces for which (un)encryption process was not
680completed before crash. */
681extern std::list<space_id_t> recv_encr_ts_list;
682
683#include "log0recv.ic"
684
685#endif
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:47
uint32_t page_no_t
Page number.
Definition: api0api.h:45
The database buffer pool global types for the directory.
buf_flush_t
Flags for flush types.
Definition: buf0types.h:68
Definition: sql_list.h:467
Class to parse persistent dynamic metadata redo log, store and merge them and apply them to in-memory...
Definition: log0recv.h:337
MetadataRecover() 1=default
Default constructor.
const byte * parseMetadataLog(table_id_t id, uint64_t version, const byte *ptr, const byte *end)
Parse a dynamic metadata redo log of a table and store the metadata locally.
Definition: log0recv.cc:298
bool empty() const
If there is any metadata to be applied.
Definition: log0recv.h:366
void store()
Store the collected persistent dynamic metadata to mysql.innodb_dynamic_metadata.
Definition: log0recv.cc:691
PersistentTableMetadata * getMetadata(table_id_t id)
Get the dynamic metadata of a specified table, create a new one if not exist.
Definition: log0recv.cc:272
PersistentTables m_tables
Map used to store and merge persistent dynamic metadata.
Definition: log0recv.h:377
std::map< table_id_t, PersistentTableMetadata *, std::less< table_id_t >, ut::allocator< std::pair< const table_id_t, PersistentTableMetadata * > > > PersistentTables
Definition: log0recv.h:340
Persistent dynamic metadata for a table.
Definition: dict0mem.h:2756
Redo recovery configuration.
Definition: buf0dblwr.h:475
Allocator that allows std::* containers to manage their memory through ut::malloc* and ut::free libra...
Definition: ut0new.h:2181
dberr_t
Definition: db0err.h:39
Data dictionary global types.
ib_id_t table_id_t
Table or partition identifier (unique within an InnoDB instance).
Definition: dict0types.h:232
mysql_service_status_t recv(const char *tag, const unsigned char *data, size_t data_length) noexcept
Definition: gr_message_service_example.cc:39
The simple hash table utility.
bool recv_is_making_a_backup
true When the redo log is being backed up
Definition: log0recv.cc:177
static bool log_block_checksum_is_ok(const byte *block)
Check the 4-byte checksum to the trailer checksum field of a log block.
Definition: log0recv.cc:624
bool recv_no_ibuf_operations
If the following is true, the buffer pool file pages must be invalidated after recovery and no ibuf o...
Definition: log0recv.cc:174
MetadataRecover * recv_recovery_from_checkpoint_finish(bool aborting)
Complete the recovery from the latest checkpoint.
Definition: log0recv.cc:4046
void recv_sys_free()
Frees the recovery system.
Definition: log0recv.cc:776
void recv_sys_init()
Inits the recovery system for a recovery operation.
Definition: log0recv.cc:535
recv_addr_state
States of recv_addr_t.
Definition: log0recv.h:292
@ RECV_BEING_READ
page is being read
Definition: log0recv.h:298
@ RECV_DISCARDED
log records have been discarded because the tablespace does not exist
Definition: log0recv.h:308
@ RECV_BEING_PROCESSED
log records are being applied on the page
Definition: log0recv.h:301
@ RECV_NOT_PROCESSED
not yet processed
Definition: log0recv.h:295
@ RECV_PROCESSED
log records have been applied on the page
Definition: log0recv.h:304
lsn_t recv_calc_lsn_on_data_add(lsn_t lsn, os_offset_t len)
Calculates the new value for lsn when more data is added to the log.
Definition: log0recv.cc:242
void recv_sys_close()
Release recovery system mutexes.
Definition: log0recv.cc:421
constexpr uint32_t RECV_PARSING_BUF_SIZE
Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many times!
Definition: log0recv.h:671
dberr_t recv_verify_log_is_clean_pre_8_0_30(log_t &log)
Determine if a redo log from a version before MySQL 8.0.30 is clean.
Definition: log0recv.cc:823
size_t recv_n_frames_for_pages_per_pool_instance
This many blocks must be left in each Buffer Pool instance to be managed by the LRU when we scan the ...
Definition: log0recv.cc:200
void recv_sys_var_init()
Reset the state of the recovery system variables.
Definition: log0recv.cc:458
bool recv_page_is_brand_new(buf_block_t *block)
Returns true if the page is brand new (the next log record is init_file_page or no records to apply).
Definition: log0recv.cc:2513
void recv_apply_hashed_log_recs(log_t &log, bool allow_ibuf)
Empties the hash table of stored log records, applying them to appropriate pages.
Definition: log0recv.cc:1125
static void recv_recover_page(bool jri, buf_block_t *block)
Wrapper for recv_recover_page_func().
Definition: log0recv.h:169
const char * get_mlog_string(mlog_id_t type)
Return string name of the redo log record type.
Definition: log0recv.cc:4111
recv_sys_t * recv_sys
The recovery system.
Definition: log0recv.cc:100
bool recv_needed_recovery
true when recv_init_crash_recovery() has been called.
Definition: log0recv.cc:158
void recv_sys_create()
Creates the recovery system.
Definition: log0recv.cc:339
static bool recv_recovery_is_on()
Returns true if recovery is currently running.
volatile bool recv_recovery_on
true when applying redo log records during crash recovery; false otherwise.
Definition: log0recv.cc:105
bool recv_lsn_checks_on
true if buf_page_is_corrupted() should check if the log sequence number (FIL_PAGE_LSN) is in the futu...
Definition: log0recv.cc:163
void recv_recover_page_func(bool just_read_in, buf_block_t *block)
Applies the hashed log records to the page, if the page lsn is less than the lsn of a log record.
Definition: log0recv.cc:2554
dberr_t recv_recovery_from_checkpoint_start(log_t &log, lsn_t flush_lsn)
Start recovering from a redo log checkpoint.
Definition: log0recv.cc:3839
std::list< space_id_t > recv_encr_ts_list
A list of tablespaces for which (un)encryption process was not completed before crash.
Definition: log0recv.cc:90
Recovery.
Redo log - the log_sys.
uint64_t lsn_t
Type used for all log sequence number storage and arithmetic.
Definition: log0types.h:63
Mini-transaction buffer global types.
mlog_id_t
Definition: mtr0types.h:63
Definition: buf0block_hint.cc:30
Definition: buf0dblwr.cc:75
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2892
The interface to the operating system file io.
uint64_t os_offset_t
File offset in bytes.
Definition: os0file.h:87
required uint64 version
Definition: replication_group_member_actions.proto:41
required string type
Definition: replication_group_member_actions.proto:34
case opt name
Definition: sslopt-case.h:29
The buffer control block structure.
Definition: buf0buf.h:1747
Redo log - single data structure with state of the redo log system.
Definition: log0sys.h:77
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
InnoDB condition variable.
Definition: os0event.cc:63
Hashed page file address struct.
Definition: log0recv.h:312
page_no_t page_no
Page number.
Definition: log0recv.h:322
recv_addr_state state
recovery state of the page
Definition: log0recv.h:316
space_id_t space
Space ID.
Definition: log0recv.h:319
List rec_list
List of log records for this page.
Definition: log0recv.h:325
Block of log record data.
Definition: log0recv.h:256
recv_data_t * next
pointer to the next block or NULL.
Definition: log0recv.h:261
Definition: log0recv.h:408
byte * ptr
Encryption key.
Definition: log0recv.h:416
space_id_t space_id
Tablespace ID.
Definition: log0recv.h:410
byte * iv
Encryption IV.
Definition: log0recv.h:419
lsn_t lsn
LSN of REDO log encryption entry.
Definition: log0recv.h:413
Mini transaction log record.
Definition: log0recv.h:425
space_id_t space_id
Definition: log0recv.h:427
size_t size
Definition: log0recv.h:435
const byte * body
Definition: log0recv.h:433
page_no_t page_no
Definition: log0recv.h:429
mlog_id_t type
Definition: log0recv.h:431
Every space has its own heap and pages that belong to it.
Definition: log0recv.h:387
Pages m_pages
Pages that need to be recovered.
Definition: log0recv.h:399
mem_heap_t * m_heap
Memory heap of log records and file addresses.
Definition: log0recv.h:396
Space(mem_heap_t *heap)
Constructor.
Definition: log0recv.h:390
Space()
Default constructor.
Definition: log0recv.h:393
Recovery system data structure.
Definition: log0recv.h:381
std::vector< Encryption_Key > Encryption_Keys
Definition: log0recv.h:422
Missing_Ids deleted
Tablespace IDs that were explicitly deleted.
Definition: log0recv.h:636
ulint n_addrs
Number of not processed hashed file addresses in the hash table.
Definition: log0recv.h:620
ulint len
Amount of data in buf.
Definition: log0recv.h:561
bool found_corrupt_fs
Set when an inconsistency with the file system contents is detected during log scan or apply.
Definition: log0recv.h:603
ib_mutex_t mutex
Definition: log0recv.h:526
bool is_meb_db
Data directory has been recognized as data directory from MEB.
Definition: log0recv.h:609
lsn_t previous_recovered_lsn
The previous value of recovered_lsn - before we parsed the last mtr.
Definition: log0recv.h:590
ulint bytes_to_ignore_before_checkpoint
Number of data bytes to ignore until we reach checkpoint_lsn.
Definition: log0recv.h:572
os_event_t flush_end
event to signal that the page cleaner has finished the request
Definition: log0recv.h:536
void save_rec(size_t rec_num, space_id_t space_id, page_no_t page_no, mlog_id_t type, const byte *body, size_t len)
Save mlog record information.
Definition: log0recv.h:468
dblwr::recv::DBLWR * dblwr
Doublewrite buffer pages, destroyed after recovery completes.
Definition: log0recv.h:623
Spaces * spaces
Hash table of pages, indexed by SpaceID.
Definition: log0recv.h:617
lsn_t recovered_lsn
The log records have been parsed up to this lsn.
Definition: log0recv.h:584
bool apply_batch_on
This is true when a log rec application batch is running.
Definition: log0recv.h:552
std::vector< Mlog_record, ut::allocator< Mlog_record > > Mlog_records
Definition: log0recv.h:438
ulint recovered_offset
Start offset of non-parsed log records in buf.
Definition: log0recv.h:581
lsn_t last_block_first_mtr_boundary
Tracks what should be the proper value of first_rec_group field in the header of the block to which r...
Definition: log0recv.h:595
std::unordered_map< page_no_t, recv_addr_t *, std::hash< page_no_t >, std::equal_to< page_no_t > > Pages
Definition: log0recv.h:384
std::unordered_map< space_id_t, Space, std::hash< space_id_t >, std::equal_to< space_id_t > > Spaces
Definition: log0recv.h:405
ib_mutex_t writer_mutex
mutex coordinating flushing between recv_writer_thread and the recovery thread.
Definition: log0recv.h:530
bool get_saved_rec(size_t rec_num, space_id_t &space_id, page_no_t &page_no, mlog_id_t &type, const byte *&body, size_t &len)
Return saved mlog record information, if there.
Definition: log0recv.h:499
Mlog_records saved_recs
Definition: log0recv.h:639
bool is_cloned_db
Data directory has been recognized as cloned data directory.
Definition: log0recv.h:606
os_event_t flush_start
event to activate page cleaner threads
Definition: log0recv.h:533
Missing_Ids missing_ids
Tablespace IDs that were ignored during redo log apply.
Definition: log0recv.h:633
std::unordered_set< space_id_t > Missing_Ids
Definition: log0recv.h:402
lsn_t checkpoint_lsn
Checkpoint lsn that was used during recovery (read from file).
Definition: log0recv.h:569
uint32_t scanned_epoch_no
The log data has been scanned up to this epoch_no.
Definition: log0recv.h:578
size_t buf_len
Size of the parsing buffer.
Definition: log0recv.h:558
buf_flush_t flush_type
type of the flush request.
Definition: log0recv.h:540
Encryption_Keys * keys
Encryption Key information per tablespace ID.
Definition: log0recv.h:630
bool dblwr_state
Doublewrite buffer state before MEB recovery starts.
Definition: log0recv.h:614
bool found_corrupt_log
Set when finding a corrupt log block or record, or there is a log parsing buffer overflow.
Definition: log0recv.h:599
lsn_t parse_start_lsn
This is the lsn from which we were able to start parsing log records and adding them to the hash tabl...
Definition: log0recv.h:566
lsn_t scanned_lsn
The log data has been scanned up to this lsn.
Definition: log0recv.h:575
byte * buf
Buffer for parsing log records.
Definition: log0recv.h:555
bool apply_log_recs
This is true when log rec application to pages is allowed; this flag tells the i/o-handler if it shou...
Definition: log0recv.h:549
MetadataRecover * metadata_recover
We store and merge all table persistent data here during scanning redo logs.
Definition: log0recv.h:627
static constexpr size_t MAX_SAVED_MLOG_RECS
While scanning logs for multi-record mini-transaction (mtr), we have two passes.
Definition: log0recv.h:458
Stored log record struct.
Definition: log0recv.h:265
recv_data_t * data
Chain of blocks containing the log record body.
Definition: log0recv.h:275
lsn_t start_lsn
Start lsn of the log segment written by the mtr which generated this log record: NOTE that this is no...
Definition: log0recv.h:280
UT_LIST_NODE_T(recv_t) Node
Definition: log0recv.h:266
ulint len
Log record body length in bytes.
Definition: log0recv.h:272
lsn_t end_lsn
End lsn of the log segment written by the mtr which generated this log record: NOTE that this is not ...
Definition: log0recv.h:285
Node rec_list
List node, list anchored in recv_addr_t.
Definition: log0recv.h:288
mlog_id_t type
Log record type.
Definition: log0recv.h:269
typedef UT_LIST_BASE_NODE_T(rw_lock_t, list) rw_lock_list_t
#define UNIV_NOTHROW
Definition: univ.i:456
unsigned long int ulint
Definition: univ.i:406
Utilities for byte operations.
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:105
#define UT_LIST_NODE_T(t)
Macro used for legacy reasons.
Definition: ut0lst.h:64
Dynamic memory allocation routines and custom allocators specifically crafted to support memory instr...
static uint64_t lsn
Definition: xcom_base.cc:446