diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-04-25 09:04:09 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-04-25 09:04:09 +0300 |
commit | bc145193c164b895a52b943e73fff53952d48a60 (patch) | |
tree | 278a02f85834d7ed8fa6933959e9b3b96655d1e1 /storage/innobase/trx/trx0trx.cc | |
parent | 1f1a61cfc41a01ffa65d568eebdc037a54b5c463 (diff) | |
parent | bfb0726fc24acb896e54bc7ef7536ad1aab9d574 (diff) | |
download | mariadb-git-bc145193c164b895a52b943e73fff53952d48a60.tar.gz |
Merge 10.1 into 10.2
Diffstat (limited to 'storage/innobase/trx/trx0trx.cc')
-rw-r--r-- | storage/innobase/trx/trx0trx.cc | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index e548ffbe62b..91e60571438 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -527,6 +527,7 @@ trx_free_prepared( trx_t* trx) /*!< in, own: trx object */ { ut_a(trx_state_eq(trx, TRX_STATE_PREPARED) + || trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED) || (trx->is_recovered && (trx_state_eq(trx, TRX_STATE_ACTIVE) || trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY)) @@ -779,9 +780,7 @@ trx_resurrect_insert( /* trx_start_low() is not called with resurrect, so need to initialize start time here.*/ - if (trx->state == TRX_STATE_ACTIVE - || trx->state == TRX_STATE_PREPARED) { - + if (trx->state != TRX_STATE_COMMITTED_IN_MEMORY) { trx->start_time = ut_time(); } @@ -1997,7 +1996,7 @@ trx_commit_or_rollback_prepare( case TRX_STATE_ACTIVE: case TRX_STATE_PREPARED: - + case TRX_STATE_PREPARED_RECOVERED: /* If the trx is in a lock wait state, moves the waiting query thread to the suspended state */ @@ -2108,7 +2107,7 @@ trx_commit_for_mysql( /* fall through */ case TRX_STATE_ACTIVE: case TRX_STATE_PREPARED: - + case TRX_STATE_PREPARED_RECOVERED: trx->op_info = "committing"; if (trx->id != 0) { @@ -2158,6 +2157,7 @@ trx_mark_sql_stat_end( switch (trx->state) { case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: case TRX_STATE_COMMITTED_IN_MEMORY: break; case TRX_STATE_NOT_STARTED: @@ -2216,6 +2216,7 @@ trx_print_low( (ulong) difftime(time(NULL), trx->start_time)); goto state_ok; case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: fprintf(f, ", ACTIVE (PREPARED) %lu sec", (ulong) difftime(time(NULL), trx->start_time)); goto state_ok; @@ -2353,6 +2354,7 @@ wsrep_trx_print_locking( (ulong) difftime(time(NULL), trx->start_time)); goto state_ok; case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: fprintf(f, ", ACTIVE (PREPARED) %lu sec", (ulong) difftime(time(NULL), trx->start_time)); goto state_ok; @@ -2475,6 +2477,7 @@ trx_assert_started( switch (trx->state) { case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: return(TRUE); case TRX_STATE_ACTIVE: @@ -2656,7 +2659,7 @@ trx_recover_for_mysql( XID* xid_list, /*!< in/out: prepared transactions */ ulint len) /*!< in: number of slots in xid_list */ { - const trx_t* trx; + trx_t* trx; ulint count = 0; ut_ad(xid_list); @@ -2678,6 +2681,7 @@ trx_recover_for_mysql( trx_sys->mutex. It may change to PREPARED, but not if trx->is_recovered. It may also change to COMMITTED. */ if (trx_state_eq(trx, TRX_STATE_PREPARED)) { + trx->state = TRX_STATE_PREPARED_RECOVERED; xid_list[count] = *trx->xid; if (count == 0) { @@ -2695,11 +2699,22 @@ trx_recover_for_mysql( count++; if (count == len) { - break; + goto partial; } } } + /* After returning the full list, reset the state, because + there will be a second call to recover the transactions. */ + for (trx = UT_LIST_GET_FIRST(trx_sys->rw_trx_list); + trx != NULL; + trx = UT_LIST_GET_NEXT(trx_list, trx)) { + if (trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) { + trx->state = TRX_STATE_PREPARED; + } + } + +partial: trx_sys_mutex_exit(); if (count > 0){ @@ -2739,9 +2754,9 @@ trx_get_trx_by_xid_low( the same */ if (trx->is_recovered - && trx_state_eq(trx, TRX_STATE_PREPARED) - && xid->eq((XID*)trx->xid)) { - + && (trx_state_eq(trx, TRX_STATE_PREPARED) + || trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) + && xid->eq(trx->xid)) { #ifdef WITH_WSREP /* The commit of a prepared recovered Galera transaction needs a valid trx->xid for @@ -2812,6 +2827,7 @@ trx_start_if_not_started_xa_low( } return; case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: case TRX_STATE_COMMITTED_IN_MEMORY: break; } @@ -2839,6 +2855,7 @@ trx_start_if_not_started_low( return; case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: case TRX_STATE_COMMITTED_IN_MEMORY: break; } @@ -2914,6 +2931,7 @@ trx_start_for_ddl_low( return; case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: case TRX_STATE_COMMITTED_IN_MEMORY: break; } |