mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 11:31:51 +01:00
86b8525254
------------------------------------------------------------------------ r3607 | marko | 2008-12-30 22:33:31 +0200 (Tue, 30 Dec 2008) | 20 lines branches/zip: Remove the dependency on the MySQL HASH table implementation. Use the InnoDB hash table for keeping track of INNOBASE_SHARE objects. struct st_innobase_share: Make table_name const uchar*. Add the member table_name_hash. innobase_open_tables: Change the type from HASH to hash_table_t*. innobase_get_key(): Remove. innobase_fold_name(): New function, for computing the fold value for the InnoDB hash table. get_share(), free_share(): Use the InnoDB hash functions. innobase_end(): Free innobase_open_tables before shutting down InnoDB. Shutting down InnoDB will invalidate all memory allocated via InnoDB. rb://65 approved by Heikki Tuuri. This addresses Issue #104. ------------------------------------------------------------------------ r3608 | marko | 2008-12-30 22:45:04 +0200 (Tue, 30 Dec 2008) | 22 lines branches/zip: When setting the PAGE_LEVEL of a compressed B-tree page from or to 0, compress the page at the same time. This is necessary, because the column information stored on the compressed page will differ between leaf and non-leaf pages. Leaf pages are identified by PAGE_LEVEL=0. This bug was reported as Issue #150. Document the similarity between btr_page_create() and btr_page_empty(). Make the function signature of btr_page_empty() identical with btr_page_create(). (This will add the parameter "level".) btr_root_raise_and_insert(): Replace some code with a call to btr_page_empty(). btr_attach_half_pages(): Assert that the page level has already been set on both block and new_block. Do not set it again. btr_discard_only_page_on_level(): Document that this function is probably never called. Make it work on any height tree. (Tested on 2-high tree by disabling btr_lift_page_up().) rb://68 ------------------------------------------------------------------------ r3612 | marko | 2009-01-02 11:02:44 +0200 (Fri, 02 Jan 2009) | 14 lines branches/zip: Merge c2998 from branches/6.0, so that the same InnoDB Plugin source tree will work both under 5.1 and 6.0. Do not add the test case innodb_ctype_ldml.test, because it would not work under MySQL 5.1. Refuse to create tables whose columns contain collation IDs above 255. This removes an assertion failure that was introduced in WL#4164 (Two-byte collation IDs). create_table_def(): Do not fail an assertion if a column contains a charset-collation ID greater than 256. Instead, issue an error and refuse to create the table. The original change (branches/6.0 r2998) was rb://51 approved by Calvin Sun. ------------------------------------------------------------------------ r3613 | inaam | 2009-01-02 15:10:50 +0200 (Fri, 02 Jan 2009) | 6 lines branches/zip: Implement the parameter innodb_use_sys_malloc (false by default), for disabling InnoDB's internal memory allocator and using system malloc/free instead. rb://62 approved by Marko ------------------------------------------------------------------------ r3614 | marko | 2009-01-02 15:55:12 +0200 (Fri, 02 Jan 2009) | 1 line branches/zip: ChangeLog: Document r3608 and r3613. ------------------------------------------------------------------------ r3615 | marko | 2009-01-02 15:57:51 +0200 (Fri, 02 Jan 2009) | 1 line branches/zip: ChangeLog: Clarify the impact of r3608. ------------------------------------------------------------------------ r3616 | marko | 2009-01-03 00:23:30 +0200 (Sat, 03 Jan 2009) | 1 line branches/zip: srv_suspend_mysql_thread(): Add some clarifying comments. ------------------------------------------------------------------------ r3618 | marko | 2009-01-05 12:54:53 +0200 (Mon, 05 Jan 2009) | 15 lines branches/zip: Merge revisions 3598:3601 from branches/5.1: ------------------------------------------------------------------------ r3601 | marko | 2008-12-22 16:05:19 +0200 (Mon, 22 Dec 2008) | 9 lines branches/5.1: Make SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED a true replacement of SET GLOBAL INNODB_LOCKS_UNSAFE_FOR_BINLOG=1. This fixes an error that was introduced in r370, causing semi-consistent read not to not unlock rows in READ COMMITTED mode. (Bug #41671, Issue #146) rb://67 approved by Heikki Tuuri ------------------------------------------------------------------------ ------------------------------------------------------------------------ r3623 | vasil | 2009-01-06 09:56:32 +0200 (Tue, 06 Jan 2009) | 7 lines branches/zip: Add patch to fix the failing main.variables mysql-test. It started failing after the variable innodb_use_sys_malloc was added because it matches '%alloc%' and the test is badly written and expects that no new variables like that will ever be added. ------------------------------------------------------------------------ r3795 | marko | 2009-01-07 16:17:47 +0200 (Wed, 07 Jan 2009) | 7 lines branches/zip: row_merge_tuple_cmp(): Do not report a duplicate key value if any of the fields are NULL. While the tuples are equal in the sorting order, SQL NULL is defined to be logically inequal to anything else. (Bug #41904) rb://70 approved by Heikki Tuuri ------------------------------------------------------------------------ r3796 | marko | 2009-01-07 16:19:32 +0200 (Wed, 07 Jan 2009) | 1 line branches/zip: Add the tests that were forgotten from r3795. ------------------------------------------------------------------------ r3797 | marko | 2009-01-07 16:22:18 +0200 (Wed, 07 Jan 2009) | 22 lines branches/zip: Do not call trx_allocate_for_mysql() directly, but use helper functions that initialize some members of the transaction struct. (Bug #41680) innobase_trx_init(): New function: initialize some fields of a transaction struct from a MySQL THD object. innobase_trx_allocate(): New function: allocate and initialize a transaction struct. check_trx_exists(): Use the above two functions. ha_innobase::delete_table(), ha_innobase::rename_table(), ha_innobase::add_index(), ha_innobase::final_drop_index(): Use innobase_trx_allocate(). innobase_drop_database(): In the Windows plugin, initialize the trx_t specially, because the THD is not available. Otherwise, use innobase_trx_allocate(). rb://69 accepted by Heikki Tuuri ------------------------------------------------------------------------ r3798 | marko | 2009-01-07 16:42:42 +0200 (Wed, 07 Jan 2009) | 8 lines branches/zip: row_merge_drop_temp_indexes(): Do not lock the rows of SYS_INDEXES when looking for partially created indexes. Use the transaction isolation level READ UNCOMMITTED to avoid interfering with locks held by incomplete transactions that will be rolled back in a subsequent step in the recovery. (Issue #152) Approved by Heikki Tuuri ------------------------------------------------------------------------ r3852 | vasil | 2009-01-08 22:10:10 +0200 (Thu, 08 Jan 2009) | 4 lines branches/zip: Add ChangeLog entries for r3795 r3796 r3797 r3798. ------------------------------------------------------------------------ r3866 | marko | 2009-01-09 15:09:51 +0200 (Fri, 09 Jan 2009) | 2 lines branches/zip: buf_flush_try_page(): Move some common code from each switch case before the switch block. ------------------------------------------------------------------------ r3867 | marko | 2009-01-09 15:13:14 +0200 (Fri, 09 Jan 2009) | 2 lines branches/zip: buf_flush_try_page(): Introduce the variable is_compressed for caching the result of buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE. ------------------------------------------------------------------------ r3868 | marko | 2009-01-09 15:40:11 +0200 (Fri, 09 Jan 2009) | 4 lines branches/zip: buf_flush_insert_into_flush_list(), buf_flush_insert_sorted_into_flush_list(): Remove unused code. Change the parameter to buf_block_t* block and assert that block->state == BUF_BLOCK_FILE_PAGE. This is part of Issue #155. ------------------------------------------------------------------------ r3873 | marko | 2009-01-09 22:27:40 +0200 (Fri, 09 Jan 2009) | 17 lines branches/zip: Some non-functional changes related to Issue #155. buf_page_struct: Note that space and offset are also protected by buf_pool_mutex. They are only assigned to by buf_block_set_file_page(). Thus, it suffices for buf_flush_batch() to hold just buf_pool_mutex when checking these fields. buf_flush_try_page(): Rename "locked" to "is_s_latched", per Heikki's request. buf_flush_batch(): Move the common statement mutex_exit(block_mutex) from all if-else if-else branches before the if block. Remove the redundant test (buf_pool->init_flush[flush_type] == FALSE) that was apparently copied from buf_flush_write_complete(). buf_flush_write_block_low(): Note why it is safe not to hold buf_pool_mutex or block_mutex. Enumerate the assumptions in debug assertions. ------------------------------------------------------------------------ r3874 | marko | 2009-01-09 23:09:06 +0200 (Fri, 09 Jan 2009) | 4 lines branches/zip: Add comments related to Issue #155. buf_flush_try_page(): Note why it is safe to access bpage without holding buf_pool_mutex or block_mutex. ------------------------------------------------------------------------ r3875 | marko | 2009-01-09 23:15:12 +0200 (Fri, 09 Jan 2009) | 11 lines branches/zip: Non-functional change: Tighten debug assertions and remove dead code. buf_flush_ready_for_flush(), buf_flush_try_page(): Assert that flush_type is one of BUF_FLUSH_LRU or BUF_FLUSH_LIST. The flush_type comes from buf_flush_batch(), which already asserts this. The assertion holds for all calls in the source code. buf_flush_try_page(): Remove the dead case BUF_FLUSH_SINGLE_PAGE of switch (flush_type). ------------------------------------------------------------------------ r3879 | marko | 2009-01-12 12:46:44 +0200 (Mon, 12 Jan 2009) | 14 lines branches/zip: Simplify the flushing of dirty pages from the buffer pool. buf_flush_try_page(): Rename to buf_flush_page(), and change the return type to void. Replace the parameters space, offset with bpage, and remove the second page hash lookup. Note and assert that both buf_pool_mutex and block_mutex must now be held upon entering the function. They will still be released by this function. buf_flush_try_neighbors(): Replace buf_flush_try_page() with buf_flush_page(). Make the logic easier to follow by not negating the precondition of buf_flush_page(). rb://73 approved by Sunny Bains. This is related to Issue #157. ------------------------------------------------------------------------ r3880 | marko | 2009-01-12 13:24:37 +0200 (Mon, 12 Jan 2009) | 2 lines branches/zip: buf_flush_page(): Fix a comment that should have been fixed in r3879. Spotted by Sunny. ------------------------------------------------------------------------ r3881 | marko | 2009-01-12 14:25:22 +0200 (Mon, 12 Jan 2009) | 2 lines branches/zip: buf_page_get_newest_modification(): Use the block mutex instead of the buffer pool mutex. This is related to Issue #157. ------------------------------------------------------------------------ r3882 | marko | 2009-01-12 14:40:08 +0200 (Mon, 12 Jan 2009) | 3 lines branches/zip: struct mtr_struct: Remove the unused field magic_n unless UNIV_DEBUG is defined. mtr->magic_n is only assigned to and checked in UNIV_DEBUG builds. ------------------------------------------------------------------------ r3883 | marko | 2009-01-12 14:48:59 +0200 (Mon, 12 Jan 2009) | 1 line branches/zip: Non-functional change: Use ut_d when assigning to mtr->state. ------------------------------------------------------------------------ r3884 | marko | 2009-01-12 18:56:11 +0200 (Mon, 12 Jan 2009) | 16 lines branches/zip: Non-functional change: Add some debug assertions and comments. buf_page_t: Note that the LRU fields are protected by buf_pool_mutex only, not block->mutex or buf_pool_zip_mutex. buf_page_get_freed_page_clock(): Note that this is sometimes invoked without mutex protection. buf_pool_get_oldest_modification(): Note that the result may be out of date. buf_page_get_LRU_position(), buf_page_is_old(): Assert that the buffer pool mutex is being held. buf_page_release(): Assert that dirty blocks are in the flush list. ------------------------------------------------------------------------ r3896 | marko | 2009-01-13 09:30:26 +0200 (Tue, 13 Jan 2009) | 2 lines branches/zip: buf_flush_try_neighbors(): Fix a bug that was introduced in r3879 (rb://73). ------------------------------------------------------------------------ r3900 | marko | 2009-01-13 10:32:24 +0200 (Tue, 13 Jan 2009) | 1 line branches/zip: Fix some comments to say buf_pool_mutex. ------------------------------------------------------------------------ r3907 | marko | 2009-01-13 11:54:01 +0200 (Tue, 13 Jan 2009) | 3 lines branches/zip: row_merge_create_temporary_table(): On error, row_create_table_for_mysql() already frees new_table. Do not attempt to free it again. ------------------------------------------------------------------------ r3908 | marko | 2009-01-13 12:34:32 +0200 (Tue, 13 Jan 2009) | 1 line branches/zip: Enable HASH_ASSERT_OWNED independently of UNIV_SYNC_DEBUG. ------------------------------------------------------------------------ r3914 | marko | 2009-01-13 21:46:22 +0200 (Tue, 13 Jan 2009) | 37 lines branches/zip: In hash table lookups, assert that the traversed items satisfy some conditions when UNIV_DEBUG is defined. HASH_SEARCH(): New parameter: ASSERTION. All users will pass an appropriate ut_ad() or nothing. dict_table_add_to_columns(): Assert that the table being added to the data dictionary cache is not already being pointed to by the name_hash and id_hash tables. HASH_SEARCH_ALL(): New macro, for use in dict_table_add_to_columns(). dict_mem_table_free(): Set ut_d(table->cached = FALSE), so that we can check ut_ad(table->cached) when traversing the hash tables, as in HASH_SEARCH(name_hash, dict_sys->table_hash, ...) and HASH_SEARCH(id_hash, dict_sys->table_id_hash, ...). dict_table_get_low(), dict_table_get_on_id_low(): Assert ut_ad(!table || table->cached). fil_space_get_by_id(): Check ut_ad(space->magic_n == FIL_SPACE_MAGIC_N) in HASH_SEARCH(hash, fil_system->spaces, ...). fil_space_get_by_name(): Check ut_ad(space->magic_n == FIL_SPACE_MAGIC_N) in HASH_SEARCH(name_hash, fil_system->name_hash, ...). buf_buddy_block_free(): Check that the blocks are in valid state in HASH_SEARCH(hash, buf_pool->zip_hash, ...). buf_page_hash_get(): Check that the blocks are in valid state in HASH_SEARCH(hash, buf_pool->page_hash, ...). get_share(), free_share(): Check ut_ad(share->use_count > 0) in HASH_SEARCH(table_name_hash, innobase_open_tables, ...). This was posted as rb://75 for tracking down errors similar to Issue #153. ------------------------------------------------------------------------ r3931 | marko | 2009-01-14 16:06:22 +0200 (Wed, 14 Jan 2009) | 26 lines branches/zip: Merge revisions 3601:3930 from branches/5.1: ------------------------------------------------------------------------ r3911 | sunny | 2009-01-13 14:15:24 +0200 (Tue, 13 Jan 2009) | 13 lines branches/5.1: Fix Bug#38187 Error 153 when creating savepoints InnoDB previously treated savepoints as a stack e.g., SAVEPOINT a; SAVEPOINT b; SAVEPOINT c; SAVEPOINT b; <- This would delete b and c. This fix changes the behavior to: SAVEPOINT a; SAVEPOINT b; SAVEPOINT c; SAVEPOINT b; <- Does not delete savepoint c ------------------------------------------------------------------------ r3930 | marko | 2009-01-14 15:51:30 +0200 (Wed, 14 Jan 2009) | 4 lines branches/5.1: dict_load_table(): If dict_load_indexes() fails, invoke dict_table_remove_from_cache() instead of dict_mem_table_free(), so that the data dictionary will not point to freed data. (Bug #42075, Issue #153, rb://76 approved by Heikki Tuuri) ------------------------------------------------------------------------ ------------------------------------------------------------------------
364 lines
12 KiB
C
364 lines
12 KiB
C
/******************************************************
|
|
Mini-transaction buffer
|
|
|
|
(c) 1995 Innobase Oy
|
|
|
|
Created 11/26/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#ifndef mtr0mtr_h
|
|
#define mtr0mtr_h
|
|
|
|
#include "univ.i"
|
|
#include "mem0mem.h"
|
|
#include "dyn0dyn.h"
|
|
#include "buf0types.h"
|
|
#include "sync0rw.h"
|
|
#include "ut0byte.h"
|
|
#include "mtr0types.h"
|
|
#include "page0types.h"
|
|
|
|
/* Logging modes for a mini-transaction */
|
|
#define MTR_LOG_ALL 21 /* default mode: log all operations
|
|
modifying disk-based data */
|
|
#define MTR_LOG_NONE 22 /* log no operations */
|
|
/*#define MTR_LOG_SPACE 23 */ /* log only operations modifying
|
|
file space page allocation data
|
|
(operations in fsp0fsp.* ) */
|
|
#define MTR_LOG_SHORT_INSERTS 24 /* inserts are logged in a shorter
|
|
form */
|
|
|
|
/* Types for the mlock objects to store in the mtr memo; NOTE that the
|
|
first 3 values must be RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
|
|
#define MTR_MEMO_PAGE_S_FIX RW_S_LATCH
|
|
#define MTR_MEMO_PAGE_X_FIX RW_X_LATCH
|
|
#define MTR_MEMO_BUF_FIX RW_NO_LATCH
|
|
#define MTR_MEMO_MODIFY 54
|
|
#define MTR_MEMO_S_LOCK 55
|
|
#define MTR_MEMO_X_LOCK 56
|
|
|
|
/* Log item types: we have made them to be of the type 'byte'
|
|
for the compiler to warn if val and type parameters are switched
|
|
in a call to mlog_write_ulint. NOTE! For 1 - 8 bytes, the
|
|
flag value must give the length also! */
|
|
#define MLOG_SINGLE_REC_FLAG 128 /* if the mtr contains only
|
|
one log record for one page,
|
|
i.e., write_initial_log_record
|
|
has been called only once,
|
|
this flag is ORed to the type
|
|
of that first log record */
|
|
#define MLOG_1BYTE (1) /* one byte is written */
|
|
#define MLOG_2BYTES (2) /* 2 bytes ... */
|
|
#define MLOG_4BYTES (4) /* 4 bytes ... */
|
|
#define MLOG_8BYTES (8) /* 8 bytes ... */
|
|
#define MLOG_REC_INSERT ((byte)9) /* record insert */
|
|
#define MLOG_REC_CLUST_DELETE_MARK ((byte)10) /* mark clustered index record
|
|
deleted */
|
|
#define MLOG_REC_SEC_DELETE_MARK ((byte)11) /* mark secondary index record
|
|
deleted */
|
|
#define MLOG_REC_UPDATE_IN_PLACE ((byte)13) /* update of a record,
|
|
preserves record field sizes */
|
|
#define MLOG_REC_DELETE ((byte)14) /* delete a record from a
|
|
page */
|
|
#define MLOG_LIST_END_DELETE ((byte)15) /* delete record list end on
|
|
index page */
|
|
#define MLOG_LIST_START_DELETE ((byte)16) /* delete record list start on
|
|
index page */
|
|
#define MLOG_LIST_END_COPY_CREATED ((byte)17) /* copy record list end to a
|
|
new created index page */
|
|
#define MLOG_PAGE_REORGANIZE ((byte)18) /* reorganize an index page */
|
|
#define MLOG_PAGE_CREATE ((byte)19) /* create an index page */
|
|
#define MLOG_UNDO_INSERT ((byte)20) /* insert entry in an undo
|
|
log */
|
|
#define MLOG_UNDO_ERASE_END ((byte)21) /* erase an undo log
|
|
page end */
|
|
#define MLOG_UNDO_INIT ((byte)22) /* initialize a page in an
|
|
undo log */
|
|
#define MLOG_UNDO_HDR_DISCARD ((byte)23) /* discard an update undo log
|
|
header */
|
|
#define MLOG_UNDO_HDR_REUSE ((byte)24) /* reuse an insert undo log
|
|
header */
|
|
#define MLOG_UNDO_HDR_CREATE ((byte)25) /* create an undo log header */
|
|
#define MLOG_REC_MIN_MARK ((byte)26) /* mark an index record as the
|
|
predefined minimum record */
|
|
#define MLOG_IBUF_BITMAP_INIT ((byte)27) /* initialize an ibuf bitmap
|
|
page */
|
|
/*#define MLOG_FULL_PAGE ((byte)28) full contents of a page */
|
|
#define MLOG_INIT_FILE_PAGE ((byte)29) /* this means that a file page
|
|
is taken into use and the prior
|
|
contents of the page should be
|
|
ignored: in recovery we must
|
|
not trust the lsn values stored
|
|
to the file page */
|
|
#define MLOG_WRITE_STRING ((byte)30) /* write a string to a page */
|
|
#define MLOG_MULTI_REC_END ((byte)31) /* if a single mtr writes
|
|
log records for several pages,
|
|
this log record ends the
|
|
sequence of these records */
|
|
#define MLOG_DUMMY_RECORD ((byte)32) /* dummy log record used to
|
|
pad a log block full */
|
|
#define MLOG_FILE_CREATE ((byte)33) /* log record about an .ibd
|
|
file creation */
|
|
#define MLOG_FILE_RENAME ((byte)34) /* log record about an .ibd
|
|
file rename */
|
|
#define MLOG_FILE_DELETE ((byte)35) /* log record about an .ibd
|
|
file deletion */
|
|
#define MLOG_COMP_REC_MIN_MARK ((byte)36) /* mark a compact index record
|
|
as the predefined minimum
|
|
record */
|
|
#define MLOG_COMP_PAGE_CREATE ((byte)37) /* create a compact
|
|
index page */
|
|
#define MLOG_COMP_REC_INSERT ((byte)38) /* compact record insert */
|
|
#define MLOG_COMP_REC_CLUST_DELETE_MARK ((byte)39)
|
|
/* mark compact clustered index
|
|
record deleted */
|
|
#define MLOG_COMP_REC_SEC_DELETE_MARK ((byte)40)/* mark compact secondary index
|
|
record deleted; this log
|
|
record type is redundant, as
|
|
MLOG_REC_SEC_DELETE_MARK is
|
|
independent of the record
|
|
format. */
|
|
#define MLOG_COMP_REC_UPDATE_IN_PLACE ((byte)41)/* update of a compact record,
|
|
preserves record field sizes */
|
|
#define MLOG_COMP_REC_DELETE ((byte)42) /* delete a compact record
|
|
from a page */
|
|
#define MLOG_COMP_LIST_END_DELETE ((byte)43) /* delete compact record list
|
|
end on index page */
|
|
#define MLOG_COMP_LIST_START_DELETE ((byte)44) /* delete compact record list
|
|
start on index page */
|
|
#define MLOG_COMP_LIST_END_COPY_CREATED ((byte)45)
|
|
/* copy compact record list end
|
|
to a new created index page */
|
|
#define MLOG_COMP_PAGE_REORGANIZE ((byte)46) /* reorganize an index page */
|
|
#define MLOG_FILE_CREATE2 ((byte)47) /* log record about creating
|
|
an .ibd file, with format */
|
|
#define MLOG_ZIP_WRITE_NODE_PTR ((byte)48) /* write the node pointer of
|
|
a record on a compressed
|
|
non-leaf B-tree page */
|
|
#define MLOG_ZIP_WRITE_BLOB_PTR ((byte)49) /* write the BLOB pointer
|
|
of an externally stored column
|
|
on a compressed page */
|
|
#define MLOG_ZIP_WRITE_HEADER ((byte)50) /* write to compressed page
|
|
header */
|
|
#define MLOG_ZIP_PAGE_COMPRESS ((byte)51) /* compress an index page */
|
|
#define MLOG_BIGGEST_TYPE ((byte)51) /* biggest value (used in
|
|
asserts) */
|
|
|
|
/*******************************************************************
|
|
Starts a mini-transaction and creates a mini-transaction handle
|
|
and buffer in the memory buffer given by the caller. */
|
|
UNIV_INLINE
|
|
mtr_t*
|
|
mtr_start(
|
|
/*======*/
|
|
/* out: mtr buffer which also acts as
|
|
the mtr handle */
|
|
mtr_t* mtr); /* in: memory buffer for the mtr buffer */
|
|
/*******************************************************************
|
|
Commits a mini-transaction. */
|
|
UNIV_INTERN
|
|
void
|
|
mtr_commit(
|
|
/*=======*/
|
|
mtr_t* mtr); /* in: mini-transaction */
|
|
/**************************************************************
|
|
Sets and returns a savepoint in mtr. */
|
|
UNIV_INLINE
|
|
ulint
|
|
mtr_set_savepoint(
|
|
/*==============*/
|
|
/* out: savepoint */
|
|
mtr_t* mtr); /* in: mtr */
|
|
/**************************************************************
|
|
Releases the latches stored in an mtr memo down to a savepoint.
|
|
NOTE! The mtr must not have made changes to buffer pages after the
|
|
savepoint, as these can be handled only by mtr_commit. */
|
|
UNIV_INTERN
|
|
void
|
|
mtr_rollback_to_savepoint(
|
|
/*======================*/
|
|
mtr_t* mtr, /* in: mtr */
|
|
ulint savepoint); /* in: savepoint */
|
|
/**************************************************************
|
|
Releases the (index tree) s-latch stored in an mtr memo after a
|
|
savepoint. */
|
|
UNIV_INLINE
|
|
void
|
|
mtr_release_s_latch_at_savepoint(
|
|
/*=============================*/
|
|
mtr_t* mtr, /* in: mtr */
|
|
ulint savepoint, /* in: savepoint */
|
|
rw_lock_t* lock); /* in: latch to release */
|
|
/*******************************************************************
|
|
Gets the logging mode of a mini-transaction. */
|
|
UNIV_INLINE
|
|
ulint
|
|
mtr_get_log_mode(
|
|
/*=============*/
|
|
/* out: logging mode: MTR_LOG_NONE, ... */
|
|
mtr_t* mtr); /* in: mtr */
|
|
/*******************************************************************
|
|
Changes the logging mode of a mini-transaction. */
|
|
UNIV_INLINE
|
|
ulint
|
|
mtr_set_log_mode(
|
|
/*=============*/
|
|
/* out: old mode */
|
|
mtr_t* mtr, /* in: mtr */
|
|
ulint mode); /* in: logging mode: MTR_LOG_NONE, ... */
|
|
/************************************************************
|
|
Reads 1 - 4 bytes from a file page buffered in the buffer pool. */
|
|
UNIV_INTERN
|
|
ulint
|
|
mtr_read_ulint(
|
|
/*===========*/
|
|
/* out: value read */
|
|
const byte* ptr, /* in: pointer from where to read */
|
|
ulint type, /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
|
|
mtr_t* mtr); /* in: mini-transaction handle */
|
|
/************************************************************
|
|
Reads 8 bytes from a file page buffered in the buffer pool. */
|
|
UNIV_INTERN
|
|
dulint
|
|
mtr_read_dulint(
|
|
/*============*/
|
|
/* out: value read */
|
|
const byte* ptr, /* in: pointer from where to read */
|
|
mtr_t* mtr); /* in: mini-transaction handle */
|
|
/*************************************************************************
|
|
This macro locks an rw-lock in s-mode. */
|
|
#define mtr_s_lock(B, MTR) mtr_s_lock_func((B), __FILE__, __LINE__,\
|
|
(MTR))
|
|
/*************************************************************************
|
|
This macro locks an rw-lock in x-mode. */
|
|
#define mtr_x_lock(B, MTR) mtr_x_lock_func((B), __FILE__, __LINE__,\
|
|
(MTR))
|
|
/*************************************************************************
|
|
NOTE! Use the macro above!
|
|
Locks a lock in s-mode. */
|
|
UNIV_INLINE
|
|
void
|
|
mtr_s_lock_func(
|
|
/*============*/
|
|
rw_lock_t* lock, /* in: rw-lock */
|
|
const char* file, /* in: file name */
|
|
ulint line, /* in: line number */
|
|
mtr_t* mtr); /* in: mtr */
|
|
/*************************************************************************
|
|
NOTE! Use the macro above!
|
|
Locks a lock in x-mode. */
|
|
UNIV_INLINE
|
|
void
|
|
mtr_x_lock_func(
|
|
/*============*/
|
|
rw_lock_t* lock, /* in: rw-lock */
|
|
const char* file, /* in: file name */
|
|
ulint line, /* in: line number */
|
|
mtr_t* mtr); /* in: mtr */
|
|
|
|
/*******************************************************
|
|
Releases an object in the memo stack. */
|
|
UNIV_INTERN
|
|
void
|
|
mtr_memo_release(
|
|
/*=============*/
|
|
mtr_t* mtr, /* in: mtr */
|
|
void* object, /* in: object */
|
|
ulint type); /* in: object type: MTR_MEMO_S_LOCK, ... */
|
|
#ifdef UNIV_DEBUG
|
|
/**************************************************************
|
|
Checks if memo contains the given item. */
|
|
UNIV_INLINE
|
|
ibool
|
|
mtr_memo_contains(
|
|
/*==============*/
|
|
/* out: TRUE if contains */
|
|
mtr_t* mtr, /* in: mtr */
|
|
const void* object, /* in: object to search */
|
|
ulint type); /* in: type of object */
|
|
|
|
/**************************************************************
|
|
Checks if memo contains the given page. */
|
|
UNIV_INTERN
|
|
ibool
|
|
mtr_memo_contains_page(
|
|
/*===================*/
|
|
/* out: TRUE if contains */
|
|
mtr_t* mtr, /* in: mtr */
|
|
const byte* ptr, /* in: pointer to buffer frame */
|
|
ulint type); /* in: type of object */
|
|
/*************************************************************
|
|
Prints info of an mtr handle. */
|
|
UNIV_INTERN
|
|
void
|
|
mtr_print(
|
|
/*======*/
|
|
mtr_t* mtr); /* in: mtr */
|
|
#endif /* UNIV_DEBUG */
|
|
/*######################################################################*/
|
|
|
|
#define MTR_BUF_MEMO_SIZE 200 /* number of slots in memo */
|
|
|
|
/*******************************************************************
|
|
Returns the log object of a mini-transaction buffer. */
|
|
UNIV_INLINE
|
|
dyn_array_t*
|
|
mtr_get_log(
|
|
/*========*/
|
|
/* out: log */
|
|
mtr_t* mtr); /* in: mini-transaction */
|
|
/*******************************************************
|
|
Pushes an object to an mtr memo stack. */
|
|
UNIV_INLINE
|
|
void
|
|
mtr_memo_push(
|
|
/*==========*/
|
|
mtr_t* mtr, /* in: mtr */
|
|
void* object, /* in: object */
|
|
ulint type); /* in: object type: MTR_MEMO_S_LOCK, ... */
|
|
|
|
|
|
/* Type definition of a mini-transaction memo stack slot. */
|
|
typedef struct mtr_memo_slot_struct mtr_memo_slot_t;
|
|
struct mtr_memo_slot_struct{
|
|
ulint type; /* type of the stored object (MTR_MEMO_S_LOCK, ...) */
|
|
void* object; /* pointer to the object */
|
|
};
|
|
|
|
/* Mini-transaction handle and buffer */
|
|
struct mtr_struct{
|
|
#ifdef UNIV_DEBUG
|
|
ulint state; /* MTR_ACTIVE, MTR_COMMITTING, MTR_COMMITTED */
|
|
#endif
|
|
dyn_array_t memo; /* memo stack for locks etc. */
|
|
dyn_array_t log; /* mini-transaction log */
|
|
ibool modifications;
|
|
/* TRUE if the mtr made modifications to
|
|
buffer pool pages */
|
|
ulint n_log_recs;
|
|
/* count of how many page initial log records
|
|
have been written to the mtr log */
|
|
ulint log_mode; /* specifies which operations should be
|
|
logged; default value MTR_LOG_ALL */
|
|
ib_uint64_t start_lsn;/* start lsn of the possible log entry for
|
|
this mtr */
|
|
ib_uint64_t end_lsn;/* end lsn of the possible log entry for
|
|
this mtr */
|
|
#ifdef UNIV_DEBUG
|
|
ulint magic_n;
|
|
#endif /* UNIV_DEBUG */
|
|
};
|
|
|
|
#ifdef UNIV_DEBUG
|
|
# define MTR_MAGIC_N 54551
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
#define MTR_ACTIVE 12231
|
|
#define MTR_COMMITTING 56456
|
|
#define MTR_COMMITTED 34676
|
|
|
|
#ifndef UNIV_NONINL
|
|
#include "mtr0mtr.ic"
|
|
#endif
|
|
|
|
#endif
|