From 7445be89afca1a0f7ab427f130e776728fe3163f Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 11 May 2017 12:29:14 +0300 Subject: [PATCH] IB: correct way of using start_time_micro [fixes #189] --- storage/innobase/row/row0ins.cc | 2 +- storage/innobase/trx/trx0purge.cc | 1 + storage/innobase/trx/trx0trx.cc | 20 +++++++++----------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index c107ae6e01b..9fb473aadfa 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -3985,7 +3985,7 @@ void vers_notify_vtq(trx_t* trx) timeval begin_ts, commit_ts; begin_ts.tv_sec = trx->start_time; - begin_ts.tv_usec = trx->start_time_micro; + begin_ts.tv_usec = trx->start_time_micro % 1000000; mutex_enter(&trx_sys->mutex); trx_id_t commit_id = trx_sys_get_new_trx_id(); diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 39e042d3756..ea243061b0e 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -185,6 +185,7 @@ trx_purge_graph_build(sess_t* sess) trx->id = 0; ut_usectime((ulong *)&trx->start_time, (ulong *)&trx->start_time_micro); + trx->start_time_micro += trx->start_time * 1000000; trx->state = TRX_STATE_ACTIVE; trx->op_info = "purge trx"; diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index aaa8a610bf0..a7d0071c67e 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -882,6 +882,7 @@ trx_resurrect_insert( ut_usectime((ulong *)&trx->start_time, (ulong *)&trx->start_time_micro); + trx->start_time_micro += trx->start_time * 1000000; } if (undo->dict_operation) { @@ -983,6 +984,7 @@ trx_resurrect_update( || trx->state == TRX_STATE_PREPARED) { ut_usectime((ulong *)&trx->start_time, (ulong *)&trx->start_time_micro); + trx->start_time_micro += trx->start_time * 1000000; } if (undo->dict_operation) { @@ -1351,18 +1353,14 @@ trx_start_low( } } - ut_usectime((ulong *)&trx->start_time, - (ulong *)&trx->start_time_micro); + if (trx->mysql_thd != NULL && + (trx->start_time_micro = thd_query_start_micro(trx->mysql_thd))) { + trx->start_time = trx->start_time_micro / 1000000; - if (trx->mysql_thd != NULL) { - time_t start_time = thd_start_time_in_secs(trx->mysql_thd); - ib_uint64_t start_utime = thd_query_start_micro(trx->mysql_thd); - if (start_time < trx->start_time || - (start_time == trx->start_time && start_utime < trx->start_time_micro)) - { - trx->start_time = start_time; - trx->start_time_micro = start_utime; - } + } else { + ut_usectime((ulong *)&trx->start_time, + (ulong *)&trx->start_time_micro); + trx->start_time_micro += trx->start_time * 1000000; } trx->vtq_notify_on_commit = false;