mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
80fe399fee
instead of stdout or fixed-size memory buffers innobase/btr/btr0btr.c: Output to stderr; quote table and index names innobase/btr/btr0cur.c: Output to stderr; quote table and index names innobase/btr/btr0sea.c: Output to stderr innobase/buf/buf0buf.c: Output to stderr; quote table and index names innobase/buf/buf0flu.c: Output to stderr innobase/buf/buf0lru.c: Output to stderr innobase/buf/buf0rea.c: Output to stderr innobase/data/data0data.c: Remove dtuple_validate() unless #ifdef UNIV_DEBUG Remove unnecessary sprintf() calls Output to stderr innobase/data/data0type.c: Output to stderr innobase/dict/dict0boot.c: Remove dummy call to printf() innobase/dict/dict0crea.c: Output diagnostic information to stream, not to memory innobase/dict/dict0dict.c: Output diagnostics to a file, not to a memory buffer innobase/dict/dict0load.c: Output to stderr; quote table and index names innobase/eval/eval0eval.c: Output to stderr innobase/fil/fil0fil.c: Output to stderr innobase/fsp/fsp0fsp.c: Output to stderr Avoid sprintf() innobase/fut/fut0lst.c: Output to stderr innobase/ha/ha0ha.c: Output to stream, not to memory buffer innobase/ibuf/ibuf0ibuf.c: Output to stderr Avoid sprintf() innobase/include/buf0buf.h: Output to stream, not to memory buffer innobase/include/buf0buf.ic: Use %p for displaying pointers innobase/include/data0data.h: Remove dtuple_sprintf() innobase/include/dict0dict.h: Output to stream, not to memory buffer innobase/include/ha0ha.h: Output to stream, not to memory buffer innobase/include/ibuf0ibuf.h: Output to stream, not to memory buffer innobase/include/lock0lock.h: Output to stream, not to memory buffer innobase/include/log0log.h: Output to stream, not to memory buffer innobase/include/mtr0log.ic: Output to stderr Display pointers with %p innobase/include/os0file.h: Output to stream, not to memory buffer innobase/include/rem0rec.h: Remove rec_sprintf() innobase/include/rem0rec.ic: Output to stderr innobase/include/row0sel.ic: Output to stderr innobase/include/row0upd.ic: Quote table and index names innobase/include/srv0srv.h: Remove srv_sprintf_innodb_monitor() innobase/include/sync0arr.h: Output to stream, not to memory buffer innobase/include/sync0sync.h: Output to stream, not to memory buffer innobase/include/trx0sys.h: Output to stderr innobase/include/trx0trx.h: Output to stream, not to memory buffer innobase/include/ut0ut.h: Remove ut_sprintf_buf() Add ut_print_name(), ut_print_namel() and ut_copy_file() innobase/lock/lock0lock.c: Output to stream, not to memory buffer innobase/log/log0log.c: Output to stderr innobase/log/log0recv.c: Output to stderr innobase/mem/mem0dbg.c: Output to stderr innobase/mtr/mtr0log.c: Display pointers with %p innobase/mtr/mtr0mtr.c: Output to stderr innobase/os/os0file.c: Output to stream, not to memory buffer innobase/os/os0proc.c: Output to stderr innobase/os/os0thread.c: Output to stderr innobase/page/page0cur.c: Output to stderr innobase/page/page0page.c: Avoid sprintf() Output to stderr instead of stdout innobase/pars/pars0opt.c: Output to stderr instead of stdout innobase/rem/rem0rec.c: Remove rec_sprintf() Output to stderr instead of stdout innobase/row/row0ins.c: Output diagnostics to stream instead of memory buffer innobase/row/row0mysql.c: Output to stderr instead of stdout Quote table and index names innobase/row/row0purge.c: Output to stderr instead of stdout innobase/row/row0row.c: Quote table and index names innobase/row/row0sel.c: Output to stderr instead of stdout Quote table and index names innobase/row/row0umod.c: Avoid sprintf() Quote table and index names innobase/row/row0undo.c: Output to stderr instead of stdout innobase/row/row0upd.c: Avoid sprintf() innobase/srv/srv0srv.c: Output to stderr instead of stdout innobase/srv/srv0start.c: Handle srv_monitor_file Make some global variables static innobase/sync/sync0arr.c: Output to stderr instead of stdout Output to stream instead of memory buffer innobase/sync/sync0rw.c: Output to stderr instead of stdout innobase/sync/sync0sync.c: Output to stderr instead of stdout Output to stream instead of memory buffer innobase/trx/trx0purge.c: Output to stderr instead of stdout innobase/trx/trx0rec.c: Quote index and table names Avoid sprintf() innobase/trx/trx0roll.c: Quote identifier names Output to stderr instead of stdout innobase/trx/trx0sys.c: Output to stderr instead of stdout innobase/trx/trx0trx.c: Output to stream instead of memory buffer innobase/trx/trx0undo.c: Output to stderr instead of stdout innobase/ut/ut0ut.c: Declare mysql_get_identifier_quote_char() Remove ut_sprintf_buf() Add ut_print_name() and ut_print_namel() Add ut_copy_file() sql/ha_innodb.cc: innobase_mysql_print_thd(): output to stream, not to memory buffer Add mysql_get_identifier_quote_char() Remove unused function innobase_print_error() Display pointers with %p Buffer InnoDB output via files, not via statically allocated memory
386 lines
8 KiB
C
386 lines
8 KiB
C
/******************************************************
|
|
Mini-transaction log routines
|
|
|
|
(c) 1995 Innobase Oy
|
|
|
|
Created 12/7/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "mtr0log.h"
|
|
|
|
#ifdef UNIV_NONINL
|
|
#include "mtr0log.ic"
|
|
#endif
|
|
|
|
#include "buf0buf.h"
|
|
#include "dict0boot.h"
|
|
#include "log0recv.h"
|
|
|
|
/************************************************************
|
|
Catenates n bytes to the mtr log. */
|
|
|
|
void
|
|
mlog_catenate_string(
|
|
/*=================*/
|
|
mtr_t* mtr, /* in: mtr */
|
|
byte* str, /* in: string to write */
|
|
ulint len) /* in: string length */
|
|
{
|
|
dyn_array_t* mlog;
|
|
|
|
if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
|
|
|
|
return;
|
|
}
|
|
|
|
mlog = &(mtr->log);
|
|
|
|
dyn_push_string(mlog, str, len);
|
|
}
|
|
|
|
/************************************************************
|
|
Writes the initial part of a log record consisting of one-byte item
|
|
type and four-byte space and page numbers. Also pushes info
|
|
to the mtr memo that a buffer page has been modified. */
|
|
|
|
void
|
|
mlog_write_initial_log_record(
|
|
/*==========================*/
|
|
byte* ptr, /* in: pointer to (inside) a buffer frame holding the
|
|
file page where modification is made */
|
|
byte type, /* in: log item type: MLOG_1BYTE, ... */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
byte* log_ptr;
|
|
|
|
ut_ad(type <= MLOG_BIGGEST_TYPE);
|
|
ut_ad(type > MLOG_8BYTES);
|
|
|
|
if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
|
|
fprintf(stderr,
|
|
"InnoDB: Error: trying to write to a stray memory location %p\n", ptr);
|
|
ut_error;
|
|
}
|
|
|
|
log_ptr = mlog_open(mtr, 11);
|
|
|
|
/* If no logging is requested, we may return now */
|
|
if (log_ptr == NULL) {
|
|
|
|
return;
|
|
}
|
|
|
|
log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
|
|
|
|
mlog_close(mtr, log_ptr);
|
|
}
|
|
|
|
/************************************************************
|
|
Parses an initial log record written by mlog_write_initial_log_record. */
|
|
|
|
byte*
|
|
mlog_parse_initial_log_record(
|
|
/*==========================*/
|
|
/* out: parsed record end, NULL if not a complete
|
|
record */
|
|
byte* ptr, /* in: buffer */
|
|
byte* end_ptr,/* in: buffer end */
|
|
byte* type, /* out: log record type: MLOG_1BYTE, ... */
|
|
ulint* space, /* out: space id */
|
|
ulint* page_no)/* out: page number */
|
|
{
|
|
if (end_ptr < ptr + 1) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
*type = (byte)((ulint)*ptr & ~MLOG_SINGLE_REC_FLAG);
|
|
ut_ad(*type <= MLOG_BIGGEST_TYPE);
|
|
|
|
ptr++;
|
|
|
|
if (end_ptr < ptr + 2) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
ptr = mach_parse_compressed(ptr, end_ptr, space);
|
|
|
|
if (ptr == NULL) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
ptr = mach_parse_compressed(ptr, end_ptr, page_no);
|
|
|
|
return(ptr);
|
|
}
|
|
|
|
/************************************************************
|
|
Parses a log record written by mlog_write_ulint or mlog_write_dulint. */
|
|
|
|
byte*
|
|
mlog_parse_nbytes(
|
|
/*==============*/
|
|
/* out: parsed record end, NULL if not a complete
|
|
record or a corrupt record */
|
|
ulint type, /* in: log record type: MLOG_1BYTE, ... */
|
|
byte* ptr, /* in: buffer */
|
|
byte* end_ptr,/* in: buffer end */
|
|
byte* page) /* in: page where to apply the log record, or NULL */
|
|
{
|
|
ulint offset;
|
|
ulint val;
|
|
dulint dval;
|
|
|
|
ut_a(type <= MLOG_8BYTES);
|
|
|
|
if (end_ptr < ptr + 2) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
offset = mach_read_from_2(ptr);
|
|
ptr += 2;
|
|
|
|
if (offset >= UNIV_PAGE_SIZE) {
|
|
recv_sys->found_corrupt_log = TRUE;
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
if (type == MLOG_8BYTES) {
|
|
ptr = mach_dulint_parse_compressed(ptr, end_ptr, &dval);
|
|
|
|
if (ptr == NULL) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
if (page) {
|
|
mach_write_to_8(page + offset, dval);
|
|
}
|
|
|
|
return(ptr);
|
|
}
|
|
|
|
ptr = mach_parse_compressed(ptr, end_ptr, &val);
|
|
|
|
if (ptr == NULL) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
if (type == MLOG_1BYTE) {
|
|
if (val > 0xFFUL) {
|
|
recv_sys->found_corrupt_log = TRUE;
|
|
|
|
return(NULL);
|
|
}
|
|
} else if (type == MLOG_2BYTES) {
|
|
if (val > 0xFFFFUL) {
|
|
recv_sys->found_corrupt_log = TRUE;
|
|
|
|
return(NULL);
|
|
}
|
|
} else {
|
|
if (type != MLOG_4BYTES) {
|
|
recv_sys->found_corrupt_log = TRUE;
|
|
|
|
return(NULL);
|
|
}
|
|
}
|
|
|
|
if (page) {
|
|
if (type == MLOG_1BYTE) {
|
|
mach_write_to_1(page + offset, val);
|
|
} else if (type == MLOG_2BYTES) {
|
|
mach_write_to_2(page + offset, val);
|
|
} else {
|
|
ut_a(type == MLOG_4BYTES);
|
|
mach_write_to_4(page + offset, val);
|
|
}
|
|
}
|
|
|
|
return(ptr);
|
|
}
|
|
|
|
/************************************************************
|
|
Writes 1 - 4 bytes to a file page buffered in the buffer pool.
|
|
Writes the corresponding log record to the mini-transaction log. */
|
|
|
|
void
|
|
mlog_write_ulint(
|
|
/*=============*/
|
|
byte* ptr, /* in: pointer where to write */
|
|
ulint val, /* in: value to write */
|
|
byte type, /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
byte* log_ptr;
|
|
|
|
if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
|
|
fprintf(stderr,
|
|
"InnoDB: Error: trying to write to a stray memory location %p\n", ptr);
|
|
ut_error;
|
|
}
|
|
|
|
if (type == MLOG_1BYTE) {
|
|
mach_write_to_1(ptr, val);
|
|
} else if (type == MLOG_2BYTES) {
|
|
mach_write_to_2(ptr, val);
|
|
} else {
|
|
ut_ad(type == MLOG_4BYTES);
|
|
mach_write_to_4(ptr, val);
|
|
}
|
|
|
|
log_ptr = mlog_open(mtr, 11 + 2 + 5);
|
|
|
|
/* If no logging is requested, we may return now */
|
|
if (log_ptr == NULL) {
|
|
|
|
return;
|
|
}
|
|
|
|
log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
|
|
|
|
mach_write_to_2(log_ptr, ptr - buf_frame_align(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. */
|
|
|
|
void
|
|
mlog_write_dulint(
|
|
/*==============*/
|
|
byte* ptr, /* in: pointer where to write */
|
|
dulint val, /* in: value to write */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
byte* log_ptr;
|
|
|
|
if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
|
|
fprintf(stderr,
|
|
"InnoDB: Error: trying to write to a stray memory location %p\n", ptr);
|
|
ut_error;
|
|
}
|
|
|
|
ut_ad(ptr && mtr);
|
|
|
|
mach_write_to_8(ptr, val);
|
|
|
|
log_ptr = mlog_open(mtr, 11 + 2 + 9);
|
|
|
|
/* If no logging is requested, we may return now */
|
|
if (log_ptr == NULL) {
|
|
|
|
return;
|
|
}
|
|
|
|
log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_8BYTES,
|
|
log_ptr, mtr);
|
|
|
|
mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
|
|
log_ptr += 2;
|
|
|
|
log_ptr += mach_dulint_write_compressed(log_ptr, val);
|
|
|
|
mlog_close(mtr, log_ptr);
|
|
}
|
|
|
|
/************************************************************
|
|
Writes a string to a file page buffered in the buffer pool. Writes the
|
|
corresponding log record to the mini-transaction log. */
|
|
|
|
void
|
|
mlog_write_string(
|
|
/*==============*/
|
|
byte* ptr, /* in: pointer where to write */
|
|
byte* str, /* in: string to write */
|
|
ulint len, /* in: string length */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
byte* log_ptr;
|
|
|
|
if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
|
|
fprintf(stderr,
|
|
"InnoDB: Error: trying to write to a stray memory location %p\n", ptr);
|
|
ut_error;
|
|
}
|
|
ut_ad(ptr && mtr);
|
|
ut_a(len < UNIV_PAGE_SIZE);
|
|
|
|
ut_memcpy(ptr, str, len);
|
|
|
|
log_ptr = mlog_open(mtr, 30);
|
|
|
|
/* If no logging is requested, we may return now */
|
|
if (log_ptr == NULL) {
|
|
|
|
return;
|
|
}
|
|
|
|
log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_WRITE_STRING,
|
|
log_ptr, mtr);
|
|
mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
|
|
log_ptr += 2;
|
|
|
|
mach_write_to_2(log_ptr, len);
|
|
log_ptr += 2;
|
|
|
|
mlog_close(mtr, log_ptr);
|
|
|
|
mlog_catenate_string(mtr, str, len);
|
|
}
|
|
|
|
/************************************************************
|
|
Parses a log record written by mlog_write_string. */
|
|
|
|
byte*
|
|
mlog_parse_string(
|
|
/*==============*/
|
|
/* out: parsed record end, NULL if not a complete
|
|
record */
|
|
byte* ptr, /* in: buffer */
|
|
byte* end_ptr,/* in: buffer end */
|
|
byte* page) /* in: page where to apply the log record, or NULL */
|
|
{
|
|
ulint offset;
|
|
ulint len;
|
|
|
|
if (end_ptr < ptr + 4) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
offset = mach_read_from_2(ptr);
|
|
ptr += 2;
|
|
|
|
if (offset >= UNIV_PAGE_SIZE) {
|
|
recv_sys->found_corrupt_log = TRUE;
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
len = mach_read_from_2(ptr);
|
|
ptr += 2;
|
|
|
|
ut_a(len + offset < UNIV_PAGE_SIZE);
|
|
|
|
if (end_ptr < ptr + len) {
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
if (page) {
|
|
ut_memcpy(page + offset, ptr, len);
|
|
}
|
|
|
|
return(ptr + len);
|
|
}
|