summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <jan@hundin.mysql.fi>2005-03-01 08:17:03 +0200
committerunknown <jan@hundin.mysql.fi>2005-03-01 08:17:03 +0200
commit27ec9f64c3607c62459afbf8bc14097699b2e811 (patch)
tree86f1e3f4fc1565ef7597f6d0135662c8af203012
parent0ebd63dea225081254e0d127822c421317dd56c6 (diff)
downloadmariadb-git-27ec9f64c3607c62459afbf8bc14097699b2e811.tar.gz
Fixed XA recovery for InnoDB. Note that XA recovery is still disabled
until it has been comprehensive tested. innobase/log/log0log.c: Added general documentation of InnoDB redo-logs. innobase/trx/trx0roll.c: Prepared transactions are not rolled back in a recovery if innobase_force_recovery = 0. But they are rolled back if innobase_force_recovery > 0. innobase/trx/trx0trx.c: Disable the XA code in InnoDB crash recovery until it has been comprehensive tested. SHOW INNODB STATUS now prints different output for prepared transactions. innobase/trx/trx0undo.c: Do not unnecessary write X/Open XA XID. XID is written in the prepare. Space for a XID should be reserved at this stage. sql/ha_innodb.cc: Remove error.
-rw-r--r--innobase/log/log0log.c26
-rw-r--r--innobase/trx/trx0roll.c12
-rw-r--r--innobase/trx/trx0trx.c28
-rw-r--r--innobase/trx/trx0undo.c14
-rw-r--r--sql/ha_innodb.cc3
5 files changed, 58 insertions, 25 deletions
diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c
index 1ab91b71e8f..5915146b466 100644
--- a/innobase/log/log0log.c
+++ b/innobase/log/log0log.c
@@ -24,6 +24,32 @@ Created 12/9/1995 Heikki Tuuri
#include "trx0sys.h"
#include "trx0trx.h"
+/*
+General philosophy of InnoDB redo-logs:
+
+1) Every change to a contents of a data page must be done
+through mtr, which in mtr_commit() writes log records
+to the InnoDB redo log.
+
+2) Normally these changes are performed using a mlog_write_ulint()
+or similar function.
+
+3) In some page level operations only a code number of a
+c-function and its parameters are written to the log to
+reduce the size of the log.
+
+ 3a) You should not add parameters to these kind of functions
+ (e.g. trx_undo_header_create(), trx_undo_insert_header_reuse())
+
+ 3b) You should not add such functionality which either change
+ working when compared with the old or are dependent on data
+ outside of the page. These kind of functions should implement
+ self-contained page transformation and it should be unchanged
+ if you don't have very essential reasons to change log
+ semantics or format.
+
+*/
+
/* Current free limit of space 0; protected by the log sys mutex; 0 means
uninitialized */
ulint log_fsp_current_free_limit = 0;
diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c
index 559c2cb5128..4c68e0a0dd3 100644
--- a/innobase/trx/trx0roll.c
+++ b/innobase/trx/trx0roll.c
@@ -440,7 +440,17 @@ loop:
if ((trx->sess || (trx->conc_state == TRX_NOT_STARTED))) {
trx = UT_LIST_GET_NEXT(trx_list, trx);
} else if (trx->conc_state == TRX_PREPARED) {
- trx->sess = trx_dummy_sess;
+
+ /* Roll back all prepared transactions if
+ innobase_force_recovery > 0 in my.cnf */
+
+ if (srv_force_recovery > 0) {
+ trx->conc_state = TRX_ACTIVE;
+ break;
+ } else {
+ trx->sess = trx_dummy_sess;
+ trx = UT_LIST_GET_NEXT(trx_list, trx);
+ }
} else {
break;
}
diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c
index a33ca4b8ec3..344fe280711 100644
--- a/innobase/trx/trx0trx.c
+++ b/innobase/trx/trx0trx.c
@@ -435,14 +435,14 @@ trx_lists_init_at_db_start(void)
if (undo->state == TRX_UNDO_PREPARED) {
- fprintf(stderr,
+ fprintf(stderr,
"InnoDB: Transaction %lu %lu was in the XA prepared state.\n",
ut_dulint_get_high(trx->id),
ut_dulint_get_low(trx->id));
- /* trx->conc_state = TRX_PREPARED; */
- trx->conc_state =
- TRX_ACTIVE;
+ trx->conc_state = TRX_ACTIVE;
+
+ /* trx->conc_state = TRX_PREPARED;*/
} else {
trx->conc_state =
TRX_COMMITTED_IN_MEMORY;
@@ -498,16 +498,15 @@ trx_lists_init_at_db_start(void)
commit or abort decision from MySQL */
if (undo->state == TRX_UNDO_PREPARED) {
-
- fprintf(stderr,
+ fprintf(stderr,
"InnoDB: Transaction %lu %lu was in the XA prepared state.\n",
- ut_dulint_get_high(trx->id),
- ut_dulint_get_low(trx->id));
+ ut_dulint_get_high(trx->id),
+ ut_dulint_get_low(trx->id));
- /* trx->conc_state = TRX_PREPARED; */
- trx->conc_state =
- TRX_ACTIVE;
+ trx->conc_state = TRX_ACTIVE;
+ /* trx->conc_state =
+ TRX_PREPARED; */
} else {
trx->conc_state =
TRX_COMMITTED_IN_MEMORY;
@@ -1638,10 +1637,13 @@ trx_print(
fputs(", not started", f);
break;
case TRX_ACTIVE:
- case TRX_PREPARED:
fprintf(f, ", ACTIVE %lu sec",
(ulong)difftime(time(NULL), trx->start_time));
break;
+ case TRX_PREPARED:
+ fprintf(f, ", ACTIVE (PREPARED) %lu sec",
+ (ulong)difftime(time(NULL), trx->start_time));
+ break;
case TRX_COMMITTED_IN_MEMORY:
fputs(", COMMITTED IN MEMORY", f);
break;
@@ -1938,7 +1940,7 @@ trx_get_trx_by_xid(
if (xid->gtrid_length == trx->xid.gtrid_length &&
xid->bqual_length == trx->xid.bqual_length &&
- memcmp(xid, &trx->xid,
+ memcmp(xid->data, trx->xid.data,
xid->gtrid_length +
xid->bqual_length) == 0) {
break;
diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c
index 545e1b77fee..88185973dfc 100644
--- a/innobase/trx/trx0undo.c
+++ b/innobase/trx/trx0undo.c
@@ -599,11 +599,10 @@ trx_undo_read_xid(
Adds the XA XID after an undo log old-style header. */
static
void
-trx_undo_header_add_xid(
-/*====================*/
+trx_undo_header_add_space_for_xid(
+/*==============================*/
page_t* undo_page,/* in: undo log segment header page */
trx_ulogf_t* log_hdr,/* in: undo log header */
- XID* xid, /* in: X/Open XA transaction identification */
mtr_t* mtr) /* in: mtr */
{
trx_upagef_t* page_hdr;
@@ -620,9 +619,8 @@ trx_undo_header_add_xid(
new_free = free + (TRX_UNDO_LOG_XA_HDR_SIZE
- TRX_UNDO_LOG_OLD_HDR_SIZE);
- trx_undo_write_xid(log_hdr, xid, mtr);
- /* Now that we added the XID after the header, update the free offset
+ /* Add space for a XID after the header, update the free offset
fields on the undo log page and in the undo log header */
mlog_write_ulint(page_hdr + TRX_UNDO_PAGE_START, new_free,
@@ -1532,7 +1530,7 @@ trx_undo_create(
offset = trx_undo_header_create(undo_page, trx_id, mtr);
- trx_undo_header_add_xid(undo_page, undo_page + offset, xid, mtr);
+ trx_undo_header_add_space_for_xid(undo_page, undo_page + offset, mtr);
undo = trx_undo_mem_create(rseg, id, type, trx_id, xid,
page_no, offset);
@@ -1599,7 +1597,7 @@ trx_undo_reuse_cached(
if (type == TRX_UNDO_INSERT) {
offset = trx_undo_insert_header_reuse(undo_page, trx_id, mtr);
- trx_undo_header_add_xid(undo_page, undo_page + offset, xid,
+ trx_undo_header_add_space_for_xid(undo_page, undo_page + offset,
mtr);
} else {
ut_a(mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
@@ -1607,7 +1605,7 @@ trx_undo_reuse_cached(
== TRX_UNDO_UPDATE);
offset = trx_undo_header_create(undo_page, trx_id, mtr);
- trx_undo_header_add_xid(undo_page, undo_page + offset, xid,
+ trx_undo_header_add_space_for_xid(undo_page, undo_page + offset,
mtr);
}
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index f68ad99ac44..b733af7774e 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -3071,9 +3071,6 @@ ha_innobase::unlock_row(void)
DBUG_ENTER("ha_innobase::unlock_row");
- ut_ad(prebuilt->trx ==
- (trx_t*) current_thd->transaction.all.innobase_tid);
-
if (last_query_id != user_thd->query_id) {
ut_print_timestamp(stderr);
fprintf(stderr,