InnoDB Plugin
1.0
|
#include "univ.i"
#include "ut0byte.h"
#include "ut0lst.h"
#include "sync0sync.h"
#include "sync0rw.h"
#include "log0log.ic"
Go to the source code of this file.
Data Structures | |
struct | log_group_t |
struct | log_t |
Macros | |
#define | LSN_MAX IB_UINT64_MAX |
#define | LSN_PF UINT64PF |
#define | LOG_MAX_N_GROUPS 32 |
#define | LOG_FLUSH 7652559 |
#define | LOG_CHECKPOINT 78656949 |
#define | LOG_RECOVER 98887331 |
#define | LOG_START_LSN ((lsn_t) (16 * OS_FILE_LOG_BLOCK_SIZE)) |
#define | LOG_BUFFER_SIZE (srv_log_buffer_size * UNIV_PAGE_SIZE) |
#define | LOG_ARCHIVE_BUF_SIZE (srv_log_buffer_size * UNIV_PAGE_SIZE / 4) |
#define | LOG_BLOCK_HDR_NO |
#define | LOG_BLOCK_FLUSH_BIT_MASK 0x80000000UL |
#define | LOG_BLOCK_HDR_DATA_LEN |
#define | LOG_BLOCK_FIRST_REC_GROUP |
#define | LOG_BLOCK_CHECKPOINT_NO |
#define | LOG_BLOCK_HDR_SIZE |
#define | LOG_BLOCK_CHECKSUM |
#define | LOG_BLOCK_TRL_SIZE 4 /* trailer size in bytes */ |
#define | LOG_CHECKPOINT_NO 0 |
#define | LOG_CHECKPOINT_LSN 8 |
#define | LOG_CHECKPOINT_OFFSET_LOW32 16 |
#define | LOG_CHECKPOINT_LOG_BUF_SIZE 20 |
#define | LOG_CHECKPOINT_ARCHIVED_LSN 24 |
#define | LOG_CHECKPOINT_GROUP_ARRAY 32 |
#define | LOG_CHECKPOINT_ARCHIVED_FILE_NO 0 |
#define | LOG_CHECKPOINT_ARCHIVED_OFFSET 4 |
#define | LOG_CHECKPOINT_ARRAY_END |
#define | LOG_CHECKPOINT_CHECKSUM_1 LOG_CHECKPOINT_ARRAY_END |
#define | LOG_CHECKPOINT_CHECKSUM_2 (4 + LOG_CHECKPOINT_ARRAY_END) |
#define | LOG_CHECKPOINT_OFFSET_HIGH32 (16 + LOG_CHECKPOINT_ARRAY_END) |
#define | LOG_CHECKPOINT_SIZE (20 + LOG_CHECKPOINT_ARRAY_END) |
#define | LOG_GROUP_ID 0 /* log group number */ |
#define | LOG_FILE_START_LSN |
#define | LOG_FILE_NO |
#define | LOG_FILE_WAS_CREATED_BY_HOT_BACKUP 16 |
#define | LOG_FILE_ARCH_COMPLETED OS_FILE_LOG_BLOCK_SIZE |
#define | LOG_FILE_END_LSN (OS_FILE_LOG_BLOCK_SIZE + 4) |
#define | LOG_CHECKPOINT_1 OS_FILE_LOG_BLOCK_SIZE |
#define | LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE) |
#define | LOG_FILE_HDR_SIZE (4 * OS_FILE_LOG_BLOCK_SIZE) |
#define | LOG_GROUP_OK 301 |
#define | LOG_GROUP_CORRUPTED 302 |
#define | log_flush_order_mutex_own() mutex_own(&log_sys->log_flush_order_mutex) |
#define | log_flush_order_mutex_enter() |
#define | log_flush_order_mutex_exit() |
#define | LOG_NO_WAIT 91 |
#define | LOG_WAIT_ONE_GROUP 92 |
#define | LOG_WAIT_ALL_GROUPS 93 |
Typedefs | |
typedef ib_uint64_t | lsn_t |
Functions | |
UNIV_INTERN ulint | log_calc_where_lsn_is (ib_int64_t *log_file_offset, ib_uint64_t first_header_lsn, ib_uint64_t lsn, ulint n_log_files, ib_int64_t log_file_size) |
UNIV_INLINE lsn_t | log_reserve_and_write_fast (const void *str, ulint len, lsn_t *start_lsn) |
UNIV_INLINE void | log_release (void) |
UNIV_INLINE void | log_free_check (void) |
UNIV_INTERN lsn_t | log_reserve_and_open (ulint len) |
UNIV_INTERN void | log_write_low (byte *str, ulint str_len) |
UNIV_INTERN lsn_t | log_close (void) |
UNIV_INLINE lsn_t | log_get_lsn (void) |
UNIV_INLINE lsn_t | log_get_capacity (void) |
UNIV_INLINE lsn_t | log_get_max_modified_age_async (void) |
UNIV_INTERN void | log_init (void) |
UNIV_INTERN void | log_group_init (ulint id, ulint n_files, lsn_t file_size, ulint space_id, ulint archive_space_id) |
UNIV_INTERN void | log_io_complete (log_group_t *group) |
UNIV_INTERN void | log_write_up_to (lsn_t lsn, ulint wait, ibool flush_to_disk) |
UNIV_INTERN void | log_buffer_flush_to_disk (void) |
UNIV_INTERN void | log_buffer_sync_in_background (ibool flush) |
UNIV_INTERN ibool | log_checkpoint (ibool sync, ibool write_always) |
UNIV_INTERN void | log_make_checkpoint_at (lsn_t lsn, ibool write_always) |
UNIV_INTERN void | logs_empty_and_mark_files_at_shutdown (void) |
UNIV_INTERN void | log_group_read_checkpoint_info (log_group_t *group, ulint field) |
UNIV_INTERN void | log_checkpoint_get_nth_group_info (const byte *buf, ulint n, ulint *file_no, ulint *offset) |
UNIV_INTERN void | log_groups_write_checkpoint_info (void) |
UNIV_INTERN ibool | log_archive_do (ibool sync, ulint *n_bytes) |
UNIV_INTERN ulint | log_archive_stop (void) |
UNIV_INTERN ulint | log_archive_start (void) |
UNIV_INTERN ulint | log_archive_noarchivelog (void) |
UNIV_INTERN ulint | log_archive_archivelog (void) |
UNIV_INTERN void | log_archived_file_name_gen (char *buf, ulint id, ulint file_no) |
UNIV_INTERN void | log_check_margins (void) |
UNIV_INTERN void | log_group_read_log_seg (ulint type, byte *buf, log_group_t *group, lsn_t start_lsn, lsn_t end_lsn) |
UNIV_INTERN void | log_group_write_buf (log_group_t *group, byte *buf, ulint len, lsn_t start_lsn, ulint new_data_offset) |
UNIV_INTERN void | log_group_set_fields (log_group_t *group, lsn_t lsn) |
UNIV_INTERN lsn_t | log_group_get_capacity (const log_group_t *group) |
UNIV_INLINE ibool | log_block_get_flush_bit (const byte *log_block) |
UNIV_INLINE ulint | log_block_get_hdr_no (const byte *log_block) |
UNIV_INLINE ulint | log_block_get_data_len (const byte *log_block) |
UNIV_INLINE void | log_block_set_data_len (byte *log_block, ulint len) |
UNIV_INLINE ulint | log_block_calc_checksum (const byte *block) |
UNIV_INLINE ulint | log_block_get_checksum (const byte *log_block) |
UNIV_INLINE void | log_block_set_checksum (byte *log_block, ulint checksum) |
UNIV_INLINE ulint | log_block_get_first_rec_group (const byte *log_block) |
UNIV_INLINE void | log_block_set_first_rec_group (byte *log_block, ulint offset) |
UNIV_INLINE ulint | log_block_get_checkpoint_no (const byte *log_block) |
UNIV_INLINE void | log_block_init (byte *log_block, lsn_t lsn) |
UNIV_INLINE void | log_block_init_in_old_format (byte *log_block, lsn_t lsn) |
UNIV_INLINE ulint | log_block_convert_lsn_to_no (lsn_t lsn) |
UNIV_INTERN void | log_print (FILE *file) |
UNIV_INTERN ibool | log_peek_lsn (lsn_t *lsn) |
UNIV_INTERN void | log_refresh_stats (void) |
UNIV_INTERN void | log_group_close_all (void) |
UNIV_INTERN void | log_shutdown (void) |
UNIV_INTERN void | log_mem_free (void) |
Variables | |
ibool | log_do_write |
ibool | log_debug_writes |
log_t * | log_sys |
Database log
Created 12/9/1995 Heikki Tuuri
#define LOG_BLOCK_CHECKPOINT_NO |
#define LOG_BLOCK_CHECKSUM |
#define LOG_BLOCK_FIRST_REC_GROUP |
#define LOG_BLOCK_HDR_DATA_LEN |
#define LOG_BLOCK_HDR_NO |
#define LOG_BLOCK_HDR_SIZE |
#define LOG_CHECKPOINT_ARRAY_END |
#define LOG_FILE_NO |
#define LOG_FILE_START_LSN |
#define log_flush_order_mutex_enter | ( | ) |
Acquire the flush order mutex.
#define log_flush_order_mutex_exit | ( | ) |
Release the flush order mutex.
#define log_flush_order_mutex_own | ( | ) | mutex_own(&log_sys->log_flush_order_mutex) |
Test if flush order mutex is owned.
#define LOG_MAX_N_GROUPS 32 |
Maximum number of log groups in log_group_t::checkpoint_buf
#define LOG_NO_WAIT 91 |
Wait modes for log_write_up_to
UNIV_INTERN ulint log_archive_archivelog | ( | void | ) |
Start archiving the log so that a gap may occur in the archived log files.
Starts an archiving operation.
sync | in: TRUE if synchronous operation is desired |
UNIV_INTERN ulint log_archive_noarchivelog | ( | void | ) |
Stop archiving the log so that a gap may occur in the archived log files.
UNIV_INTERN ulint log_archive_start | ( | void | ) |
Starts again archiving which has been stopped.
UNIV_INTERN ulint log_archive_stop | ( | void | ) |
Writes the log contents to the archive up to the lsn when this function was called, and stops the archiving. When archiving is started again, the archived log file numbers start from a number one higher, so that the archiving will not write again to the archived log files which exist when this function returns.
UNIV_INTERN void log_archived_file_name_gen | ( | char * | buf, |
ulint | id, | ||
ulint | file_no | ||
) |
Generates an archived log file name. in: file number
buf | in: buffer where to write |
id | in: group id |
UNIV_INLINE ulint log_block_calc_checksum | ( | const byte * | block | ) |
Calculates the checksum for a log block.
Calculates the checksum for a log block.
block | in: log block |
UNIV_INLINE ulint log_block_convert_lsn_to_no | ( | lsn_t | lsn | ) |
Converts a lsn to a log block number.
Converts a lsn to a log block number.
lsn | in: lsn of a byte within the block |
UNIV_INLINE ulint log_block_get_checkpoint_no | ( | const byte * | log_block | ) |
Gets a log block checkpoint number field (4 lowest bytes).
Gets a log block checkpoint number field (4 lowest bytes).
log_block | in: log block |
UNIV_INLINE ulint log_block_get_checksum | ( | const byte * | log_block | ) |
Gets a log block checksum field value.
Gets a log block checksum field value.
log_block | in: log block |
UNIV_INLINE ulint log_block_get_data_len | ( | const byte * | log_block | ) |
Gets a log block data length.
Gets a log block data length.
log_block | in: log block |
UNIV_INLINE ulint log_block_get_first_rec_group | ( | const byte * | log_block | ) |
Gets a log block first mtr log record group offset.
Gets a log block first mtr log record group offset.
log_block | in: log block |
UNIV_INLINE ibool log_block_get_flush_bit | ( | const byte * | log_block | ) |
Gets a log block flush bit.
Gets a log block flush bit.
log_block | in: log block |
UNIV_INLINE ulint log_block_get_hdr_no | ( | const byte * | log_block | ) |
Gets a log block number stored in the header.
Gets a log block number stored in the header.
log_block | in: log block |
UNIV_INLINE void log_block_init | ( | byte * | log_block, |
lsn_t | lsn | ||
) |
Initializes a log block in the log buffer. in: lsn within the log block
Initializes a log block in the log buffer.
log_block | in: pointer to the log buffer |
lsn | in: lsn within the log block |
UNIV_INLINE void log_block_init_in_old_format | ( | byte * | log_block, |
lsn_t | lsn | ||
) |
Initializes a log block in the log buffer in the old, < 3.23.52 format, where there was no checksum yet. in: lsn within the log block
Initializes a log block in the log buffer in the old format, where there was no checksum yet.
log_block | in: pointer to the log buffer |
lsn | in: lsn within the log block |
UNIV_INLINE void log_block_set_checksum | ( | byte * | log_block, |
ulint | checksum | ||
) |
Sets a log block checksum field value. in: checksum
Sets a log block checksum field value.
log_block | in/out: log block |
checksum | in: checksum |
UNIV_INLINE void log_block_set_data_len | ( | byte * | log_block, |
ulint | len | ||
) |
Sets the log block data length. in: data length
Sets the log block data length.
log_block | in/out: log block |
len | in: data length |
UNIV_INLINE void log_block_set_first_rec_group | ( | byte * | log_block, |
ulint | offset | ||
) |
Sets the log block first mtr log record group offset. in: offset, 0 if none
Sets the log block first mtr log record group offset.
log_block | in/out: log block |
offset | in: offset, 0 if none |
UNIV_INTERN void log_buffer_flush_to_disk | ( | void | ) |
Does a syncronous flush of the log buffer to disk.
UNIV_INTERN void log_buffer_sync_in_background | ( | ibool | flush | ) |
This functions writes the log buffer to the log file and if 'flush' is set it forces a flush of the log file as well. This is meant to be called from background master thread only as it does not wait for the write (+ possible flush) to finish.
UNIV_INTERN ulint log_calc_where_lsn_is | ( | ib_int64_t * | log_file_offset, |
ib_uint64_t | first_header_lsn, | ||
ib_uint64_t | lsn, | ||
ulint | n_log_files, | ||
ib_int64_t | log_file_size | ||
) |
Calculates where in log files we find a specified lsn.
log_file_offset | out: offset in that file (including the header) |
first_header_lsn | in: first log file start lsn |
lsn | in: lsn whose position to determine |
n_log_files | in: total number of log files |
UNIV_INTERN void log_check_margins | ( | void | ) |
Checks that there is enough free space in the log to start a new query step. Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this function may only be called if the calling thread owns no synchronization objects!
Makes a checkpoint. Note that this function does not flush dirty blocks from the buffer pool: it only checks what is lsn of the oldest modification in the pool, and writes information about the lsn in log files. Use log_make_checkpoint_at to flush also the pool.
sync | in: TRUE if synchronous operation is desired |
UNIV_INTERN void log_checkpoint_get_nth_group_info | ( | const byte * | buf, |
ulint | n, | ||
ulint * | file_no, | ||
ulint * | offset | ||
) |
Gets info from a checkpoint about a log group. out: archived file offset
buf | in: buffer containing checkpoint info |
n | in: nth slot |
file_no | out: archived file number |
UNIV_INTERN lsn_t log_close | ( | void | ) |
Closes the log.
UNIV_INLINE void log_free_check | ( | void | ) |
Checks if there is need for a log buffer flush or a new checkpoint, and does this if yes. Any database operation should call this when it has modified more than about 4 pages. NOTE that this function may only be called when the OS thread owns no synchronization objects except the dictionary mutex.
UNIV_INLINE lsn_t log_get_lsn | ( | void | ) |
Gets the current lsn.
UNIV_INTERN void log_group_close_all | ( | void | ) |
Closes all log groups.
UNIV_INTERN lsn_t log_group_get_capacity | ( | const log_group_t * | group | ) |
Calculates the data capacity of a log group, when the log file headers are not included.
UNIV_INTERN void log_group_init | ( | ulint | id, |
ulint | n_files, | ||
lsn_t | file_size, | ||
ulint | space_id, | ||
ulint | archive_space_id | ||
) |
Inits a log group to the log system. in: space id of the file space which contains some archived log files for this group; currently, only for the first log group this is used
id | in: group id |
n_files | in: number of log files |
file_size | in: log file size in bytes |
space_id | in: space id of the file space which contains the log files of this group |
UNIV_INTERN void log_group_read_checkpoint_info | ( | log_group_t * | group, |
ulint | field | ||
) |
Reads a checkpoint info from a log group header to log_sys->checkpoint_buf. in: LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2
group | in: log group |
UNIV_INTERN void log_group_read_log_seg | ( | ulint | type, |
byte * | buf, | ||
log_group_t * | group, | ||
lsn_t | start_lsn, | ||
lsn_t | end_lsn | ||
) |
Reads a specified log segment to a buffer. in: read area end
type | in: LOG_ARCHIVE or LOG_RECOVER |
buf | in: buffer where to read |
group | in: log group |
start_lsn | in: read area start |
UNIV_INTERN void log_group_set_fields | ( | log_group_t * | group, |
lsn_t | lsn | ||
) |
Sets the field values in group to correspond to a given lsn. For this function to work, the values must already be correctly initialized to correspond to some lsn, for instance, a checkpoint lsn. in: lsn for which the values should be set
group | in/out: group |
UNIV_INTERN void log_group_write_buf | ( | log_group_t * | group, |
byte * | buf, | ||
ulint | len, | ||
lsn_t | start_lsn, | ||
ulint | new_data_offset | ||
) |
Writes a buffer to a log file group. in: start offset of new data in buf: this parameter is used to decide if we have to write a new log file header
group | in: log group |
buf | in: buffer |
len | in: buffer len; must be divisible by OS_FILE_LOG_BLOCK_SIZE |
start_lsn | in: start lsn of the buffer; must be divisible by OS_FILE_LOG_BLOCK_SIZE |
UNIV_INTERN void log_groups_write_checkpoint_info | ( | void | ) |
Writes checkpoint info to groups.
UNIV_INTERN void log_init | ( | void | ) |
Initializes the log.
UNIV_INTERN void log_io_complete | ( | log_group_t * | group | ) |
Completes an i/o to a log file. in: log group
UNIV_INTERN void log_make_checkpoint_at | ( | lsn_t | lsn, |
ibool | write_always | ||
) |
Makes a checkpoint at a given lsn or later. in: the function normally checks if the new checkpoint would have a greater lsn than the previous one: if not, then no physical write is done; by setting this parameter TRUE, a physical write will always be made to log files
lsn | in: make a checkpoint at this or a later lsn, if LSN_MAX, makes a checkpoint at the latest lsn |
UNIV_INTERN void log_mem_free | ( | void | ) |
Free the log system data structures.
UNIV_INTERN ibool log_peek_lsn | ( | lsn_t * | lsn | ) |
Peeks the current lsn.
UNIV_INTERN void log_print | ( | FILE * | file | ) |
Prints info of the log. in: file where to print
UNIV_INTERN void log_refresh_stats | ( | void | ) |
Refreshes the statistics used to print per-second averages.
UNIV_INLINE void log_release | ( | void | ) |
Releases the log mutex.
UNIV_INTERN lsn_t log_reserve_and_open | ( | ulint | len | ) |
Opens the log for log_write_low. The log must be closed with log_close and released with log_release.
UNIV_INLINE lsn_t log_reserve_and_write_fast | ( | const void * | str, |
ulint | len, | ||
lsn_t * | start_lsn | ||
) |
Writes to the log the string given. The log must be released with log_release.
Writes to the log the string given. The log must be released with log_release.
str | in: string |
len | in: string length |
start_lsn | out: start lsn of the log record |
UNIV_INTERN void log_shutdown | ( | void | ) |
Shutdown the log system but do not release all the memory.
UNIV_INTERN void log_write_low | ( | byte * | str, |
ulint | str_len | ||
) |
Writes to the log the string given. It is assumed that the caller holds the log mutex. in: string length
str | in: string |
UNIV_INTERN void log_write_up_to | ( | lsn_t | lsn, |
ulint | wait, | ||
ibool | flush_to_disk | ||
) |
This function is called, e.g., when a transaction wants to commit. It checks that the log has been written to the log file up to the last log entry written by the transaction. If there is a flush running, it waits and checks if the flush flushed enough. If not, starts a new flush. in: TRUE if we want the written log also to be flushed to disk
lsn | in: log sequence number up to which the log should be written, LSN_MAX if not specified |
wait | in: LOG_NO_WAIT, LOG_WAIT_ONE_GROUP, or LOG_WAIT_ALL_GROUPS |
UNIV_INTERN void logs_empty_and_mark_files_at_shutdown | ( | void | ) |
Makes a checkpoint at the latest lsn and writes it to first page of each data file in the database, so that we know that the file spaces contain all modifications up to that lsn. This can only be called at database shutdown. This function also writes all log in log files to the log archive.
ibool log_debug_writes |
Flag: enable debug output when writing to the log?
ibool log_do_write |
Flag: write to log file?