Commit 5defdc38 authored by Marko Mäkelä's avatar Marko Mäkelä

Cleanup: Remove mtr_state_t and mtr_t::m_state

mtr_t::is_active(), mtr_t::is_committed(): Make debug-only.
parent c69a8629
...@@ -125,25 +125,22 @@ struct mtr_memo_slot_t { ...@@ -125,25 +125,22 @@ struct mtr_memo_slot_t {
/** Mini-transaction handle and buffer */ /** Mini-transaction handle and buffer */
struct mtr_t { struct mtr_t {
mtr_t() : m_state(MTR_STATE_INIT) {} /** Start a mini-transaction. */
void start();
/** Start a mini-transaction. */ /** Commit the mini-transaction. */
void start(); void commit();
/** Commit the mini-transaction. */ /** Commit a mini-transaction that did not modify any pages,
void commit(); but generated some redo log on a higher level, such as
MLOG_FILE_NAME records and an optional MLOG_CHECKPOINT marker.
The caller must invoke log_mutex_enter() and log_mutex_exit().
This is to be used at log_checkpoint().
@param checkpoint_lsn the log sequence number of a checkpoint, or 0 */
void commit_files(lsn_t checkpoint_lsn= 0);
/** Commit a mini-transaction that did not modify any pages, /** @return mini-transaction savepoint (current size of m_memo) */
but generated some redo log on a higher level, such as ulint get_savepoint() const { ut_ad(is_active()); return m_memo.size(); }
MLOG_FILE_NAME records and an optional MLOG_CHECKPOINT marker.
The caller must invoke log_mutex_enter() and log_mutex_exit().
This is to be used at log_checkpoint().
@param[in] checkpoint_lsn log checkpoint LSN, or 0 */
void commit_files(lsn_t checkpoint_lsn = 0);
/** Return current size of the buffer.
@return savepoint */
ulint get_savepoint() const {ut_ad(is_active()); return m_memo.size();}
/** Release the (index tree) s-latch stored in an mtr memo after a /** Release the (index tree) s-latch stored in an mtr memo after a
savepoint. savepoint.
...@@ -331,10 +328,6 @@ struct mtr_t { ...@@ -331,10 +328,6 @@ struct mtr_t {
/** @return true if we are inside the change buffer code */ /** @return true if we are inside the change buffer code */
bool is_inside_ibuf() const { return m_inside_ibuf; } bool is_inside_ibuf() const { return m_inside_ibuf; }
/*
@return true if the mini-transaction is active */
bool is_active() const { return m_state == MTR_STATE_ACTIVE; }
/** Get flush observer /** Get flush observer
@return flush observer */ @return flush observer */
FlushObserver* get_flush_observer() const { return m_flush_observer; } FlushObserver* get_flush_observer() const { return m_flush_observer; }
...@@ -383,9 +376,6 @@ struct mtr_t { ...@@ -383,9 +376,6 @@ struct mtr_t {
/** Print info of an mtr handle. */ /** Print info of an mtr handle. */
void print() const; void print() const;
/** @return true if the mini-transaction has committed */
bool has_committed() const { return m_state == MTR_STATE_COMMITTED; }
/** @return true if mini-transaction contains modifications. */ /** @return true if mini-transaction contains modifications. */
bool has_modifications() const { return m_modifications; } bool has_modifications() const { return m_modifications; }
...@@ -485,17 +475,30 @@ struct mtr_t { ...@@ -485,17 +475,30 @@ struct mtr_t {
byte *log_ptr, uint64_t val) byte *log_ptr, uint64_t val)
MY_ATTRIBUTE((nonnull)); MY_ATTRIBUTE((nonnull));
/** Prepare to write the mini-transaction log to the redo log buffer. /** Prepare to write the mini-transaction log to the redo log buffer.
@return number of bytes to write in finish_write() */ @return number of bytes to write in finish_write() */
inline ulint prepare_write(); inline ulint prepare_write();
/** Append the redo log records to the redo log buffer. /** Append the redo log records to the redo log buffer.
@param[in] len number of bytes to write @param len number of bytes to write
@return start_lsn */ @return start_lsn */
inline lsn_t finish_write(ulint len); inline lsn_t finish_write(ulint len);
/** Release the resources */ /** Release the resources */
inline void release_resources(); inline void release_resources();
#ifdef UNIV_DEBUG
public:
/** @return whether the mini-transaction is active */
bool is_active() const { ut_ad(!m_commit || m_start); return m_start; }
/** @return whether the mini-transaction has been committed */
bool has_committed() const { ut_ad(!m_commit || m_start); return m_commit; }
private:
/** whether start() has been called */
bool m_start= false;
/** whether commit() has been called */
bool m_commit= false;
#endif
/** memo stack for locks etc. */ /** memo stack for locks etc. */
mtr_buf_t m_memo; mtr_buf_t m_memo;
...@@ -527,9 +530,6 @@ struct mtr_t { ...@@ -527,9 +530,6 @@ struct mtr_t {
/** User tablespace that is being modified by the mini-transaction */ /** User tablespace that is being modified by the mini-transaction */
fil_space_t* m_user_space; fil_space_t* m_user_space;
/** State of the transaction */
mtr_state_t m_state;
/** Flush Observer */ /** Flush Observer */
FlushObserver* m_flush_observer; FlushObserver* m_flush_observer;
......
...@@ -272,10 +272,4 @@ enum mtr_memo_type_t { ...@@ -272,10 +272,4 @@ enum mtr_memo_type_t {
}; };
#endif /* !UNIV_CHECKSUM */ #endif /* !UNIV_CHECKSUM */
enum mtr_state_t {
MTR_STATE_INIT = 0,
MTR_STATE_ACTIVE,
MTR_STATE_COMMITTED
};
#endif /* mtr0types_h */ #endif /* mtr0types_h */
...@@ -380,6 +380,9 @@ void mtr_t::start() ...@@ -380,6 +380,9 @@ void mtr_t::start()
{ {
UNIV_MEM_INVALID(this, sizeof *this); UNIV_MEM_INVALID(this, sizeof *this);
ut_d(m_start= true);
ut_d(m_commit= false);
new(&m_memo) mtr_buf_t(); new(&m_memo) mtr_buf_t();
new(&m_log) mtr_buf_t(); new(&m_log) mtr_buf_t();
...@@ -389,24 +392,23 @@ void mtr_t::start() ...@@ -389,24 +392,23 @@ void mtr_t::start()
m_n_log_recs= 0; m_n_log_recs= 0;
m_log_mode= MTR_LOG_ALL; m_log_mode= MTR_LOG_ALL;
ut_d(m_user_space_id= TRX_SYS_SPACE); ut_d(m_user_space_id= TRX_SYS_SPACE);
m_user_space= NULL; m_user_space= nullptr;
m_state= MTR_STATE_ACTIVE; m_flush_observer= nullptr;
m_flush_observer= NULL;
m_commit_lsn= 0; m_commit_lsn= 0;
} }
/** Release the resources */ /** Release the resources */
inline void mtr_t::release_resources() inline void mtr_t::release_resources()
{ {
ut_ad(is_active());
ut_d(m_memo.for_each_block_in_reverse(CIterate<DebugCheck>())); ut_d(m_memo.for_each_block_in_reverse(CIterate<DebugCheck>()));
m_log.erase(); m_log.erase();
m_memo.erase(); m_memo.erase();
m_state= MTR_STATE_COMMITTED; ut_d(m_commit= true);
} }
/** Commit a mini-transaction. */ /** Commit a mini-transaction. */
void void mtr_t::commit()
mtr_t::commit()
{ {
ut_ad(is_active()); ut_ad(is_active());
ut_ad(!is_inside_ibuf()); ut_ad(!is_inside_ibuf());
...@@ -415,8 +417,7 @@ mtr_t::commit() ...@@ -415,8 +417,7 @@ mtr_t::commit()
ut_ad(!m_modifications || !recv_no_log_write); ut_ad(!m_modifications || !recv_no_log_write);
ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE); ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE);
if (m_modifications if (m_modifications && (m_n_log_recs || m_log_mode == MTR_LOG_NO_REDO))
&& (m_n_log_recs || m_log_mode == MTR_LOG_NO_REDO))
{ {
ut_ad(!srv_read_only_mode || m_log_mode == MTR_LOG_NO_REDO); ut_ad(!srv_read_only_mode || m_log_mode == MTR_LOG_NO_REDO);
......
...@@ -64,14 +64,10 @@ class index_tuple_info_t { ...@@ -64,14 +64,10 @@ class index_tuple_info_t {
/** constructor /** constructor
@param[in] heap memory heap @param[in] heap memory heap
@param[in] index index to be created */ @param[in] index index to be created */
index_tuple_info_t( index_tuple_info_t(mem_heap_t* heap, dict_index_t* index) :
mem_heap_t* heap, m_dtuple_vec(UT_NEW_NOKEY(idx_tuple_vec())),
dict_index_t* index) UNIV_NOTHROW m_index(index), m_heap(heap)
{ { ut_ad(index->is_spatial()); }
m_heap = heap;
m_index = index;
m_dtuple_vec = UT_NEW_NOKEY(idx_tuple_vec());
}
/** destructor */ /** destructor */
~index_tuple_info_t() ~index_tuple_info_t()
...@@ -107,13 +103,11 @@ class index_tuple_info_t { ...@@ -107,13 +103,11 @@ class index_tuple_info_t {
@param[in] trx_id transaction id @param[in] trx_id transaction id
@param[in,out] row_heap memory heap @param[in,out] row_heap memory heap
@param[in] pcur cluster index scanning cursor @param[in] pcur cluster index scanning cursor
@param[in,out] mtr_started whether scan_mtr is active
@param[in,out] scan_mtr mini-transaction for pcur @param[in,out] scan_mtr mini-transaction for pcur
@return DB_SUCCESS if successful, else error number */ @return DB_SUCCESS if successful, else error number */
inline dberr_t insert( dberr_t insert(trx_id_t trx_id, mem_heap_t* row_heap, btr_pcur_t* pcur,
trx_id_t trx_id, bool& mtr_started, mtr_t* scan_mtr) const
mem_heap_t* row_heap,
btr_pcur_t* pcur,
mtr_t* scan_mtr)
{ {
big_rec_t* big_rec; big_rec_t* big_rec;
rec_t* rec; rec_t* rec;
...@@ -128,7 +122,7 @@ class index_tuple_info_t { ...@@ -128,7 +122,7 @@ class index_tuple_info_t {
| BTR_NO_LOCKING_FLAG | BTR_NO_LOCKING_FLAG
| BTR_KEEP_SYS_FLAG | BTR_CREATE_FLAG; | BTR_KEEP_SYS_FLAG | BTR_CREATE_FLAG;
ut_ad(dict_index_is_spatial(m_index)); ut_ad(mtr_started == scan_mtr->is_active());
DBUG_EXECUTE_IF("row_merge_instrument_log_check_flush", DBUG_EXECUTE_IF("row_merge_instrument_log_check_flush",
log_sys.check_flush_or_checkpoint = true; log_sys.check_flush_or_checkpoint = true;
...@@ -141,10 +135,11 @@ class index_tuple_info_t { ...@@ -141,10 +135,11 @@ class index_tuple_info_t {
ut_ad(dtuple); ut_ad(dtuple);
if (log_sys.check_flush_or_checkpoint) { if (log_sys.check_flush_or_checkpoint) {
if (scan_mtr->is_active()) { if (mtr_started) {
btr_pcur_move_to_prev_on_page(pcur); btr_pcur_move_to_prev_on_page(pcur);
btr_pcur_store_position(pcur, scan_mtr); btr_pcur_store_position(pcur, scan_mtr);
scan_mtr->commit(); scan_mtr->commit();
mtr_started = false;
} }
log_free_check(); log_free_check();
...@@ -247,13 +242,13 @@ class index_tuple_info_t { ...@@ -247,13 +242,13 @@ class index_tuple_info_t {
idx_tuple_vec; idx_tuple_vec;
/** vector used to cache index rows made from cluster index scan */ /** vector used to cache index rows made from cluster index scan */
idx_tuple_vec* m_dtuple_vec; idx_tuple_vec* const m_dtuple_vec;
/** the index being built */ /** the index being built */
dict_index_t* m_index; dict_index_t* const m_index;
/** memory heap for creating index tuples */ /** memory heap for creating index tuples */
mem_heap_t* m_heap; mem_heap_t* const m_heap;
}; };
/* Maximum pending doc memory limit in bytes for a fts tokenization thread */ /* Maximum pending doc memory limit in bytes for a fts tokenization thread */
...@@ -1574,10 +1569,11 @@ row_mtuple_cmp( ...@@ -1574,10 +1569,11 @@ row_mtuple_cmp(
@param[in] trx_id transaction id @param[in] trx_id transaction id
@param[in] sp_tuples cached spatial rows @param[in] sp_tuples cached spatial rows
@param[in] num_spatial number of spatial indexes @param[in] num_spatial number of spatial indexes
@param[in,out] row_heap heap for insert @param[in,out] heap heap for insert
@param[in,out] sp_heap heap for tuples @param[in,out] sp_heap heap for tuples
@param[in,out] pcur cluster index cursor @param[in,out] pcur cluster index cursor
@param[in,out] mtr mini transaction @param[in,out] started whether mtr is active
@param[in,out] mtr mini-transaction
@return DB_SUCCESS or error number */ @return DB_SUCCESS or error number */
static static
dberr_t dberr_t
...@@ -1585,30 +1581,21 @@ row_merge_spatial_rows( ...@@ -1585,30 +1581,21 @@ row_merge_spatial_rows(
trx_id_t trx_id, trx_id_t trx_id,
index_tuple_info_t** sp_tuples, index_tuple_info_t** sp_tuples,
ulint num_spatial, ulint num_spatial,
mem_heap_t* row_heap, mem_heap_t* heap,
mem_heap_t* sp_heap, mem_heap_t* sp_heap,
btr_pcur_t* pcur, btr_pcur_t* pcur,
bool& started,
mtr_t* mtr) mtr_t* mtr)
{ {
dberr_t err = DB_SUCCESS; if (!sp_tuples)
return DB_SUCCESS;
if (sp_tuples == NULL) {
return(DB_SUCCESS);
}
ut_ad(sp_heap != NULL);
for (ulint j = 0; j < num_spatial; j++) {
err = sp_tuples[j]->insert(trx_id, row_heap, pcur, mtr);
if (err != DB_SUCCESS) {
return(err);
}
}
mem_heap_empty(sp_heap); for (ulint j= 0; j < num_spatial; j++)
if (dberr_t err= sp_tuples[j]->insert(trx_id, heap, pcur, started, mtr))
return err;
return(err); mem_heap_empty(sp_heap);
return DB_SUCCESS;
} }
/** Check if the geometry field is valid. /** Check if the geometry field is valid.
...@@ -1695,7 +1682,7 @@ row_merge_read_clustered_index( ...@@ -1695,7 +1682,7 @@ row_merge_read_clustered_index(
ib_sequence_t& sequence, ib_sequence_t& sequence,
row_merge_block_t* block, row_merge_block_t* block,
bool skip_pk_sort, bool skip_pk_sort,
pfs_os_file_t* tmpfd, pfs_os_file_t* tmpfd,
ut_stage_alter_t* stage, ut_stage_alter_t* stage,
double pct_cost, double pct_cost,
row_merge_block_t* crypt_block, row_merge_block_t* crypt_block,
...@@ -1711,6 +1698,7 @@ row_merge_read_clustered_index( ...@@ -1711,6 +1698,7 @@ row_merge_read_clustered_index(
btr_pcur_t pcur; /* Cursor on the clustered btr_pcur_t pcur; /* Cursor on the clustered
index */ index */
mtr_t mtr; /* Mini transaction */ mtr_t mtr; /* Mini transaction */
bool mtr_started = false;
dberr_t err = DB_SUCCESS;/* Return code */ dberr_t err = DB_SUCCESS;/* Return code */
ulint n_nonnull = 0; /* number of columns ulint n_nonnull = 0; /* number of columns
changed to NOT NULL */ changed to NOT NULL */
...@@ -1833,7 +1821,8 @@ row_merge_read_clustered_index( ...@@ -1833,7 +1821,8 @@ row_merge_read_clustered_index(
ut_ad(count == num_spatial); ut_ad(count == num_spatial);
} }
mtr_start(&mtr); mtr.start();
mtr_started = true;
/* Find the clustered index and create a persistent cursor /* Find the clustered index and create a persistent cursor
based on that. */ based on that. */
...@@ -1852,6 +1841,7 @@ row_merge_read_clustered_index( ...@@ -1852,6 +1841,7 @@ row_merge_read_clustered_index(
btr_pcur_open_at_index_side( btr_pcur_open_at_index_side(
true, clust_index, BTR_SEARCH_LEAF, &pcur, true, 0, &mtr); true, clust_index, BTR_SEARCH_LEAF, &pcur, true, 0, &mtr);
mtr_started = true;
btr_pcur_move_to_next_user_rec(&pcur, &mtr); btr_pcur_move_to_next_user_rec(&pcur, &mtr);
if (rec_is_metadata(btr_pcur_get_rec(&pcur), *clust_index)) { if (rec_is_metadata(btr_pcur_get_rec(&pcur), *clust_index)) {
ut_ad(btr_pcur_is_on_user_rec(&pcur)); ut_ad(btr_pcur_is_on_user_rec(&pcur));
...@@ -1958,13 +1948,13 @@ row_merge_read_clustered_index( ...@@ -1958,13 +1948,13 @@ row_merge_read_clustered_index(
/* Insert the cached spatial index rows. */ /* Insert the cached spatial index rows. */
err = row_merge_spatial_rows( err = row_merge_spatial_rows(
trx->id, sp_tuples, num_spatial, trx->id, sp_tuples, num_spatial,
row_heap, sp_heap, &pcur, &mtr); row_heap, sp_heap, &pcur, mtr_started, &mtr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto func_exit; goto func_exit;
} }
if (!mtr.is_active()) { if (!mtr_started) {
goto scan_next; goto scan_next;
} }
...@@ -1988,12 +1978,16 @@ row_merge_read_clustered_index( ...@@ -1988,12 +1978,16 @@ row_merge_read_clustered_index(
== clust_index->page); == clust_index->page);
btr_pcur_store_position(&pcur, &mtr); btr_pcur_store_position(&pcur, &mtr);
mtr_commit(&mtr); mtr.commit();
mtr_started = false;
/* Give the waiters a chance to proceed. */ /* Give the waiters a chance to proceed. */
os_thread_yield(); os_thread_yield();
scan_next: scan_next:
mtr_start(&mtr); ut_ad(!mtr_started);
ut_ad(mtr.is_active());
mtr.start();
mtr_started = true;
/* Restore position on the record, or its /* Restore position on the record, or its
predecessor if the record was purged predecessor if the record was purged
meanwhile. */ meanwhile. */
...@@ -2005,7 +1999,8 @@ row_merge_read_clustered_index( ...@@ -2005,7 +1999,8 @@ row_merge_read_clustered_index(
&pcur, &mtr)) { &pcur, &mtr)) {
end_of_index: end_of_index:
row = NULL; row = NULL;
mtr_commit(&mtr); mtr.commit();
mtr_started = false;
mem_heap_free(row_heap); mem_heap_free(row_heap);
row_heap = NULL; row_heap = NULL;
ut_free(nonnull); ut_free(nonnull);
...@@ -2471,7 +2466,8 @@ row_merge_read_clustered_index( ...@@ -2471,7 +2466,8 @@ row_merge_read_clustered_index(
trx->id, sp_tuples, trx->id, sp_tuples,
num_spatial, num_spatial,
row_heap, sp_heap, row_heap, sp_heap,
&pcur, &mtr); &pcur, mtr_started,
&mtr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto func_exit; goto func_exit;
...@@ -2479,20 +2475,21 @@ row_merge_read_clustered_index( ...@@ -2479,20 +2475,21 @@ row_merge_read_clustered_index(
/* We are not at the end of /* We are not at the end of
the scan yet. We must the scan yet. We must
mtr_commit() in order to be mtr.commit() in order to be
able to call log_free_check() able to call log_free_check()
in row_merge_insert_index_tuples(). in row_merge_insert_index_tuples().
Due to mtr_commit(), the Due to mtr.commit(), the
current row will be invalid, and current row will be invalid, and
we must reread it on the next we must reread it on the next
loop iteration. */ loop iteration. */
if (mtr.is_active()) { if (mtr_started) {
btr_pcur_move_to_prev_on_page( btr_pcur_move_to_prev_on_page(
&pcur); &pcur);
btr_pcur_store_position( btr_pcur_store_position(
&pcur, &mtr); &pcur, &mtr);
mtr.commit(); mtr.commit();
mtr_started = false;
} }
} }
...@@ -2548,7 +2545,8 @@ row_merge_read_clustered_index( ...@@ -2548,7 +2545,8 @@ row_merge_read_clustered_index(
next record (the one which we next record (the one which we
had to ignore due to the buffer had to ignore due to the buffer
overflow). */ overflow). */
mtr_start(&mtr); mtr.start();
mtr_started = true;
btr_pcur_restore_position( btr_pcur_restore_position(
BTR_SEARCH_LEAF, &pcur, BTR_SEARCH_LEAF, &pcur,
&mtr); &mtr);
...@@ -2734,8 +2732,9 @@ row_merge_read_clustered_index( ...@@ -2734,8 +2732,9 @@ row_merge_read_clustered_index(
} }
func_exit: func_exit:
if (mtr.is_active()) { ut_ad(mtr_started == mtr.is_active());
mtr_commit(&mtr); if (mtr_started) {
mtr.commit();
} }
if (row_heap) { if (row_heap) {
mem_heap_free(row_heap); mem_heap_free(row_heap);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment