trx0sys.c, trx0roll.c, srv0start.h:
Print trx rollback progress info in crash recovery innobase/include/srv0start.h: Print trx rollback progress info in crash recovery innobase/trx/trx0roll.c: Print trx rollback progress info in crash recovery innobase/trx/trx0sys.c: Print trx rollback progress info in crash recovery
This commit is contained in:
parent
b331fe928c
commit
5387425aeb
@ -81,6 +81,7 @@ innobase_shutdown_for_mysql(void);
|
|||||||
|
|
||||||
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
|
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
|
||||||
|
|
||||||
|
extern ibool srv_is_being_started;
|
||||||
extern ibool srv_startup_is_before_trx_rollback_phase;
|
extern ibool srv_startup_is_before_trx_rollback_phase;
|
||||||
extern ibool srv_is_being_shut_down;
|
extern ibool srv_is_being_shut_down;
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ Created 3/26/1996 Heikki Tuuri
|
|||||||
#include "que0que.h"
|
#include "que0que.h"
|
||||||
#include "usr0sess.h"
|
#include "usr0sess.h"
|
||||||
#include "srv0que.h"
|
#include "srv0que.h"
|
||||||
|
#include "srv0start.h"
|
||||||
#include "row0undo.h"
|
#include "row0undo.h"
|
||||||
#include "row0mysql.h"
|
#include "row0mysql.h"
|
||||||
#include "lock0lock.h"
|
#include "lock0lock.h"
|
||||||
@ -29,6 +30,12 @@ Created 3/26/1996 Heikki Tuuri
|
|||||||
/* This many pages must be undone before a truncate is tried within rollback */
|
/* This many pages must be undone before a truncate is tried within rollback */
|
||||||
#define TRX_ROLL_TRUNC_THRESHOLD 1
|
#define TRX_ROLL_TRUNC_THRESHOLD 1
|
||||||
|
|
||||||
|
/* In crash recovery we set this to the undo n:o of the current trx to be
|
||||||
|
rolled back. Then we can print how many % the rollback has progressed. */
|
||||||
|
ib_longlong trx_roll_max_undo_no;
|
||||||
|
/* Auxiliary variable which tells the previous progress % we printed */
|
||||||
|
ulint trx_roll_progress_printed_pct;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
Rollback a transaction used in MySQL. */
|
Rollback a transaction used in MySQL. */
|
||||||
|
|
||||||
@ -174,6 +181,8 @@ trx_rollback_or_clean_all_without_sess(void)
|
|||||||
roll_node_t* roll_node;
|
roll_node_t* roll_node;
|
||||||
trx_t* trx;
|
trx_t* trx;
|
||||||
dict_table_t* table;
|
dict_table_t* table;
|
||||||
|
ib_longlong rows_to_undo;
|
||||||
|
char* unit = (char*)"";
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
mutex_enter(&kernel_mutex);
|
mutex_enter(&kernel_mutex);
|
||||||
@ -219,8 +228,7 @@ loop:
|
|||||||
|
|
||||||
trx->sess = trx_dummy_sess;
|
trx->sess = trx_dummy_sess;
|
||||||
|
|
||||||
if (trx->conc_state == TRX_COMMITTED_IN_MEMORY) {
|
if (trx->conc_state == TRX_COMMITTED_IN_MEMORY) {
|
||||||
|
|
||||||
fprintf(stderr, "InnoDB: Cleaning up trx with id %lu %lu\n",
|
fprintf(stderr, "InnoDB: Cleaning up trx with id %lu %lu\n",
|
||||||
ut_dulint_get_high(trx->id),
|
ut_dulint_get_high(trx->id),
|
||||||
ut_dulint_get_low(trx->id));
|
ut_dulint_get_low(trx->id));
|
||||||
@ -248,9 +256,19 @@ loop:
|
|||||||
|
|
||||||
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
|
ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0));
|
||||||
|
|
||||||
fprintf(stderr, "InnoDB: Rolling back trx with id %lu %lu\n",
|
trx_roll_max_undo_no = ut_conv_dulint_to_longlong(trx->undo_no);
|
||||||
|
trx_roll_progress_printed_pct = 0;
|
||||||
|
rows_to_undo = trx_roll_max_undo_no;
|
||||||
|
if (rows_to_undo > 1000000000) {
|
||||||
|
rows_to_undo = rows_to_undo / 1000000;
|
||||||
|
unit = (char*)"M";
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"InnoDB: Rolling back trx with id %lu %lu, %lu%s rows to undo",
|
||||||
ut_dulint_get_high(trx->id),
|
ut_dulint_get_high(trx->id),
|
||||||
ut_dulint_get_low(trx->id));
|
ut_dulint_get_low(trx->id),
|
||||||
|
(ulint)rows_to_undo, unit);
|
||||||
mutex_exit(&kernel_mutex);
|
mutex_exit(&kernel_mutex);
|
||||||
|
|
||||||
if (trx->dict_operation) {
|
if (trx->dict_operation) {
|
||||||
@ -300,7 +318,7 @@ loop:
|
|||||||
row_mysql_unlock_data_dictionary(trx);
|
row_mysql_unlock_data_dictionary(trx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "InnoDB: Rolling back of trx id %lu %lu completed\n",
|
fprintf(stderr, "\nInnoDB: Rolling back of trx id %lu %lu completed\n",
|
||||||
ut_dulint_get_high(trx->id),
|
ut_dulint_get_high(trx->id),
|
||||||
ut_dulint_get_low(trx->id));
|
ut_dulint_get_low(trx->id));
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
@ -614,6 +632,7 @@ trx_roll_pop_top_rec_of_trx(
|
|||||||
dulint undo_no;
|
dulint undo_no;
|
||||||
ibool is_insert;
|
ibool is_insert;
|
||||||
trx_rseg_t* rseg;
|
trx_rseg_t* rseg;
|
||||||
|
ulint progress_pct;
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
|
||||||
rseg = trx->rseg;
|
rseg = trx->rseg;
|
||||||
@ -676,6 +695,26 @@ try_again:
|
|||||||
|
|
||||||
ut_ad(ut_dulint_cmp(ut_dulint_add(undo_no, 1), trx->undo_no) == 0);
|
ut_ad(ut_dulint_cmp(ut_dulint_add(undo_no, 1), trx->undo_no) == 0);
|
||||||
|
|
||||||
|
/* We print rollback progress info if we are in a crash recovery
|
||||||
|
and the transaction has at least 1000 row operations to undo */
|
||||||
|
|
||||||
|
if (srv_is_being_started && trx_roll_max_undo_no > 1000) {
|
||||||
|
progress_pct = 100 -
|
||||||
|
(ut_conv_dulint_to_longlong(undo_no) * 100)
|
||||||
|
/ trx_roll_max_undo_no;
|
||||||
|
if (progress_pct != trx_roll_progress_printed_pct) {
|
||||||
|
if (trx_roll_progress_printed_pct == 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"\nInnoDB: Progress in percents: %lu", progress_pct);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr,
|
||||||
|
" %lu", progress_pct);
|
||||||
|
}
|
||||||
|
fflush(stderr);
|
||||||
|
trx_roll_progress_printed_pct = progress_pct;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trx->undo_no = undo_no;
|
trx->undo_no = undo_no;
|
||||||
|
|
||||||
if (!trx_undo_arr_store_info(trx, undo_no)) {
|
if (!trx_undo_arr_store_info(trx, undo_no)) {
|
||||||
|
@ -699,6 +699,9 @@ trx_sys_init_at_db_start(void)
|
|||||||
/*==========================*/
|
/*==========================*/
|
||||||
{
|
{
|
||||||
trx_sysf_t* sys_header;
|
trx_sysf_t* sys_header;
|
||||||
|
ib_longlong rows_to_undo = 0;
|
||||||
|
char* unit = (char*)"";
|
||||||
|
trx_t* trx;
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
@ -734,9 +737,28 @@ trx_sys_init_at_db_start(void)
|
|||||||
trx_lists_init_at_db_start();
|
trx_lists_init_at_db_start();
|
||||||
|
|
||||||
if (UT_LIST_GET_LEN(trx_sys->trx_list) > 0) {
|
if (UT_LIST_GET_LEN(trx_sys->trx_list) > 0) {
|
||||||
|
trx = UT_LIST_GET_FIRST(trx_sys->trx_list);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
rows_to_undo +=
|
||||||
|
ut_conv_dulint_to_longlong(trx->undo_no);
|
||||||
|
trx = UT_LIST_GET_NEXT(trx_list, trx);
|
||||||
|
|
||||||
|
if (!trx) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows_to_undo > 1000000000) {
|
||||||
|
unit = (char*)"M";
|
||||||
|
rows_to_undo = rows_to_undo / 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"InnoDB: %lu transaction(s) which must be rolled back or cleaned up\n",
|
"InnoDB: %lu transaction(s) which must be rolled back or cleaned up\n"
|
||||||
UT_LIST_GET_LEN(trx_sys->trx_list));
|
"InnoDB: in total %lu%s row operations to undo\n",
|
||||||
|
UT_LIST_GET_LEN(trx_sys->trx_list),
|
||||||
|
(ulint)rows_to_undo, unit);
|
||||||
|
|
||||||
fprintf(stderr, "InnoDB: Trx id counter is %lu %lu\n",
|
fprintf(stderr, "InnoDB: Trx id counter is %lu %lu\n",
|
||||||
ut_dulint_get_high(trx_sys->max_trx_id),
|
ut_dulint_get_high(trx_sys->max_trx_id),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user