mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Temporary commit of 10.0-merge
This commit is contained in:
parent
35bc8f9f43
commit
068c61978e
649 changed files with 90817 additions and 25330 deletions
|
|
@ -240,8 +240,8 @@ mlog_parse_nbytes(
|
|||
}
|
||||
|
||||
/********************************************************//**
|
||||
Writes 1 - 4 bytes to a file page buffered in the buffer pool.
|
||||
Writes the corresponding log record to the mini-transaction log. */
|
||||
Writes 1, 2 or 4 bytes to a file page. Writes the corresponding log
|
||||
record to the mini-transaction log if mtr is not NULL. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
mlog_write_ulint(
|
||||
|
|
@ -251,8 +251,6 @@ mlog_write_ulint(
|
|||
byte type, /*!< in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle */
|
||||
{
|
||||
byte* log_ptr;
|
||||
|
||||
switch (type) {
|
||||
case MLOG_1BYTE:
|
||||
mach_write_to_1(ptr, val);
|
||||
|
|
@ -267,27 +265,29 @@ mlog_write_ulint(
|
|||
ut_error;
|
||||
}
|
||||
|
||||
log_ptr = mlog_open(mtr, 11 + 2 + 5);
|
||||
if (mtr != 0) {
|
||||
byte* log_ptr = mlog_open(mtr, 11 + 2 + 5);
|
||||
|
||||
/* If no logging is requested, we may return now */
|
||||
if (log_ptr == NULL) {
|
||||
/* If no logging is requested, we may return now */
|
||||
|
||||
return;
|
||||
if (log_ptr != 0) {
|
||||
|
||||
log_ptr = mlog_write_initial_log_record_fast(
|
||||
ptr, type, log_ptr, mtr);
|
||||
|
||||
mach_write_to_2(log_ptr, page_offset(ptr));
|
||||
log_ptr += 2;
|
||||
|
||||
log_ptr += mach_write_compressed(log_ptr, val);
|
||||
|
||||
mlog_close(mtr, log_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
|
||||
|
||||
mach_write_to_2(log_ptr, page_offset(ptr));
|
||||
log_ptr += 2;
|
||||
|
||||
log_ptr += mach_write_compressed(log_ptr, val);
|
||||
|
||||
mlog_close(mtr, log_ptr);
|
||||
}
|
||||
|
||||
/********************************************************//**
|
||||
Writes 8 bytes to a file page buffered in the buffer pool.
|
||||
Writes the corresponding log record to the mini-transaction log. */
|
||||
Writes 8 bytes to a file page. Writes the corresponding log
|
||||
record to the mini-transaction log, only if mtr is not NULL */
|
||||
UNIV_INTERN
|
||||
void
|
||||
mlog_write_ull(
|
||||
|
|
@ -296,29 +296,25 @@ mlog_write_ull(
|
|||
ib_uint64_t val, /*!< in: value to write */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle */
|
||||
{
|
||||
byte* log_ptr;
|
||||
|
||||
ut_ad(ptr && mtr);
|
||||
|
||||
mach_write_to_8(ptr, val);
|
||||
|
||||
log_ptr = mlog_open(mtr, 11 + 2 + 9);
|
||||
if (mtr != 0) {
|
||||
byte* log_ptr = mlog_open(mtr, 11 + 2 + 9);
|
||||
|
||||
/* If no logging is requested, we may return now */
|
||||
if (log_ptr == NULL) {
|
||||
/* If no logging is requested, we may return now */
|
||||
if (log_ptr != 0) {
|
||||
|
||||
return;
|
||||
log_ptr = mlog_write_initial_log_record_fast(
|
||||
ptr, MLOG_8BYTES, log_ptr, mtr);
|
||||
|
||||
mach_write_to_2(log_ptr, page_offset(ptr));
|
||||
log_ptr += 2;
|
||||
|
||||
log_ptr += mach_ull_write_compressed(log_ptr, val);
|
||||
|
||||
mlog_close(mtr, log_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_8BYTES,
|
||||
log_ptr, mtr);
|
||||
|
||||
mach_write_to_2(log_ptr, page_offset(ptr));
|
||||
log_ptr += 2;
|
||||
|
||||
log_ptr += mach_ull_write_compressed(log_ptr, val);
|
||||
|
||||
mlog_close(mtr, log_ptr);
|
||||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
|
|
@ -439,12 +435,13 @@ UNIV_INTERN
|
|||
byte*
|
||||
mlog_open_and_write_index(
|
||||
/*======================*/
|
||||
mtr_t* mtr, /*!< in: mtr */
|
||||
const byte* rec, /*!< in: index record or page */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
byte type, /*!< in: log item type */
|
||||
ulint size) /*!< in: requested buffer size in bytes
|
||||
(if 0, calls mlog_close() and returns NULL) */
|
||||
mtr_t* mtr, /*!< in: mtr */
|
||||
const byte* rec, /*!< in: index record or page */
|
||||
const dict_index_t* index, /*!< in: record descriptor */
|
||||
byte type, /*!< in: log item type */
|
||||
ulint size) /*!< in: requested buffer size in bytes
|
||||
(if 0, calls mlog_close() and
|
||||
returns NULL) */
|
||||
{
|
||||
byte* log_ptr;
|
||||
const byte* log_start;
|
||||
|
|
|
|||
|
|
@ -142,9 +142,9 @@ mtr_memo_slot_note_modification(
|
|||
mtr_t* mtr, /*!< in: mtr */
|
||||
mtr_memo_slot_t* slot) /*!< in: memo slot */
|
||||
{
|
||||
ut_ad(mtr);
|
||||
ut_ad(mtr->magic_n == MTR_MAGIC_N);
|
||||
ut_ad(mtr->modifications);
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_ad(mtr->magic_n == MTR_MAGIC_N);
|
||||
|
||||
if (slot->object != NULL && slot->type == MTR_MEMO_PAGE_X_FIX) {
|
||||
buf_block_t* block = (buf_block_t*) slot->object;
|
||||
|
|
@ -170,7 +170,7 @@ mtr_memo_note_modifications(
|
|||
dyn_array_t* memo;
|
||||
ulint offset;
|
||||
|
||||
ut_ad(mtr);
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_ad(mtr->magic_n == MTR_MAGIC_N);
|
||||
ut_ad(mtr->state == MTR_COMMITTING); /* Currently only used in
|
||||
commit */
|
||||
|
|
@ -191,65 +191,14 @@ mtr_memo_note_modifications(
|
|||
}
|
||||
|
||||
/************************************************************//**
|
||||
Writes the contents of a mini-transaction log, if any, to the database log. */
|
||||
Append the dirty pages to the flush list. */
|
||||
static
|
||||
void
|
||||
mtr_log_reserve_and_write(
|
||||
/*======================*/
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
mtr_add_dirtied_pages_to_flush_list(
|
||||
/*================================*/
|
||||
mtr_t* mtr) /*!< in/out: mtr */
|
||||
{
|
||||
dyn_array_t* mlog;
|
||||
dyn_block_t* block;
|
||||
ulint data_size;
|
||||
byte* first_data;
|
||||
|
||||
ut_ad(mtr);
|
||||
|
||||
mlog = &(mtr->log);
|
||||
|
||||
first_data = dyn_block_get_data(mlog);
|
||||
|
||||
if (mtr->n_log_recs > 1) {
|
||||
mlog_catenate_ulint(mtr, MLOG_MULTI_REC_END, MLOG_1BYTE);
|
||||
} else {
|
||||
*first_data = (byte)((ulint)*first_data
|
||||
| MLOG_SINGLE_REC_FLAG);
|
||||
}
|
||||
|
||||
if (mlog->heap == NULL) {
|
||||
mtr->end_lsn = log_reserve_and_write_fast(
|
||||
first_data, dyn_block_get_used(mlog),
|
||||
&mtr->start_lsn);
|
||||
if (mtr->end_lsn) {
|
||||
|
||||
/* Success. We have the log mutex.
|
||||
Add pages to flush list and exit */
|
||||
goto func_exit;
|
||||
}
|
||||
}
|
||||
|
||||
data_size = dyn_array_get_data_size(mlog);
|
||||
|
||||
/* Open the database log for log_write_low */
|
||||
mtr->start_lsn = log_reserve_and_open(data_size);
|
||||
|
||||
if (mtr->log_mode == MTR_LOG_ALL) {
|
||||
|
||||
block = mlog;
|
||||
|
||||
while (block != NULL) {
|
||||
log_write_low(dyn_block_get_data(block),
|
||||
dyn_block_get_used(block));
|
||||
block = dyn_array_get_next_block(mlog, block);
|
||||
}
|
||||
} else {
|
||||
ut_ad(mtr->log_mode == MTR_LOG_NONE);
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
mtr->end_lsn = log_close();
|
||||
|
||||
func_exit:
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
/* No need to acquire log_flush_order_mutex if this mtr has
|
||||
not dirtied a clean page. log_flush_order_mutex is used to
|
||||
|
|
@ -273,6 +222,77 @@ func_exit:
|
|||
log_flush_order_mutex_exit();
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************//**
|
||||
Writes the contents of a mini-transaction log, if any, to the database log. */
|
||||
static
|
||||
void
|
||||
mtr_log_reserve_and_write(
|
||||
/*======================*/
|
||||
mtr_t* mtr) /*!< in/out: mtr */
|
||||
{
|
||||
dyn_array_t* mlog;
|
||||
ulint data_size;
|
||||
byte* first_data;
|
||||
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
mlog = &(mtr->log);
|
||||
|
||||
first_data = dyn_block_get_data(mlog);
|
||||
|
||||
if (mtr->n_log_recs > 1) {
|
||||
mlog_catenate_ulint(mtr, MLOG_MULTI_REC_END, MLOG_1BYTE);
|
||||
} else {
|
||||
*first_data = (byte)((ulint)*first_data
|
||||
| MLOG_SINGLE_REC_FLAG);
|
||||
}
|
||||
|
||||
if (mlog->heap == NULL) {
|
||||
ulint len;
|
||||
|
||||
len = mtr->log_mode != MTR_LOG_NO_REDO
|
||||
? dyn_block_get_used(mlog) : 0;
|
||||
|
||||
mtr->end_lsn = log_reserve_and_write_fast(
|
||||
first_data, len, &mtr->start_lsn);
|
||||
|
||||
if (mtr->end_lsn) {
|
||||
|
||||
/* Success. We have the log mutex.
|
||||
Add pages to flush list and exit */
|
||||
mtr_add_dirtied_pages_to_flush_list(mtr);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
data_size = dyn_array_get_data_size(mlog);
|
||||
|
||||
/* Open the database log for log_write_low */
|
||||
mtr->start_lsn = log_reserve_and_open(data_size);
|
||||
|
||||
if (mtr->log_mode == MTR_LOG_ALL) {
|
||||
|
||||
for (dyn_block_t* block = mlog;
|
||||
block != 0;
|
||||
block = dyn_array_get_next_block(mlog, block)) {
|
||||
|
||||
log_write_low(
|
||||
dyn_block_get_data(block),
|
||||
dyn_block_get_used(block));
|
||||
}
|
||||
|
||||
} else {
|
||||
ut_ad(mtr->log_mode == MTR_LOG_NONE
|
||||
|| mtr->log_mode == MTR_LOG_NO_REDO);
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
mtr->end_lsn = log_close();
|
||||
|
||||
mtr_add_dirtied_pages_to_flush_list(mtr);
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/***************************************************************//**
|
||||
|
|
@ -294,6 +314,7 @@ mtr_commit(
|
|||
ut_ad(!recv_no_log_write);
|
||||
|
||||
if (mtr->modifications && mtr->n_log_recs) {
|
||||
ut_ad(!srv_read_only_mode);
|
||||
mtr_log_reserve_and_write(mtr);
|
||||
}
|
||||
|
||||
|
|
@ -376,14 +397,8 @@ mtr_read_ulint(
|
|||
ut_ad(mtr->state == MTR_ACTIVE);
|
||||
ut_ad(mtr_memo_contains_page(mtr, ptr, MTR_MEMO_PAGE_S_FIX)
|
||||
|| mtr_memo_contains_page(mtr, ptr, MTR_MEMO_PAGE_X_FIX));
|
||||
if (type == MLOG_1BYTE) {
|
||||
return(mach_read_from_1(ptr));
|
||||
} else if (type == MLOG_2BYTES) {
|
||||
return(mach_read_from_2(ptr));
|
||||
} else {
|
||||
ut_ad(type == MLOG_4BYTES);
|
||||
return(mach_read_from_4(ptr));
|
||||
}
|
||||
|
||||
return(mach_read_ulint(ptr, type));
|
||||
}
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue