Commit 45973ec6 authored by Eugene Kosov's avatar Eugene Kosov

InnoDB: reduce size of dtuple_t

Making a linked list of dtuple_t is needed only for inserting
records. It's better to store tuples in a non-intrusive
container to not affect all other use cases of dtuple_t

dtuple_t::tuple_list: removed, it was 2 * sizeof(void*) bytes

ins_node_t::entry_list: now it's std::vector<dtuple_t*>

ins_node_t::entry: now it's std::vector<dtuple_t*>::iterator

DBUG_EXECUTE_IF("row_ins_skip_sec": this dead code removed
parent 54b2da95
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2019, MariaDB Corporation. Copyright (c) 2017, 2019, 2020 MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -32,6 +32,7 @@ Created 5/30/1994 Heikki Tuuri ...@@ -32,6 +32,7 @@ Created 5/30/1994 Heikki Tuuri
#include "mem0mem.h" #include "mem0mem.h"
#include "dict0types.h" #include "dict0types.h"
#include "btr0types.h" #include "btr0types.h"
#include <vector>
#include <ostream> #include <ostream>
...@@ -510,9 +511,6 @@ struct dtuple_t { ...@@ -510,9 +511,6 @@ struct dtuple_t {
dfield_t* fields; /*!< fields */ dfield_t* fields; /*!< fields */
ulint n_v_fields; /*!< number of virtual fields */ ulint n_v_fields; /*!< number of virtual fields */
dfield_t* v_fields; /*!< fields on virtual column */ dfield_t* v_fields; /*!< fields on virtual column */
UT_LIST_NODE_T(dtuple_t) tuple_list;
/*!< data tuples can be linked into a
list using this field */
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
ulint magic_n; /*!< magic number, used in ulint magic_n; /*!< magic number, used in
debug assertions */ debug assertions */
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2019, MariaDB Corporation. Copyright (c) 2017, 2019, 2020 MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -31,6 +31,7 @@ Created 4/20/1996 Heikki Tuuri ...@@ -31,6 +31,7 @@ Created 4/20/1996 Heikki Tuuri
#include "que0types.h" #include "que0types.h"
#include "trx0types.h" #include "trx0types.h"
#include "row0types.h" #include "row0types.h"
#include <vector>
/***************************************************************//** /***************************************************************//**
Checks if foreign key constraint fails for an index entry. Sets shared locks Checks if foreign key constraint fails for an index entry. Sets shared locks
...@@ -159,7 +160,10 @@ row_ins_step( ...@@ -159,7 +160,10 @@ row_ins_step(
/* Insert node structure */ /* Insert node structure */
struct ins_node_t{ struct ins_node_t{
que_common_t common; /*!< node type: QUE_NODE_INSERT */ ins_node_t() : common(QUE_NODE_INSERT, NULL), entry(entry_list.end())
{
}
que_common_t common; /*!< node type: QUE_NODE_INSERT */
ulint ins_type;/* INS_VALUES, INS_SEARCHED, or INS_DIRECT */ ulint ins_type;/* INS_VALUES, INS_SEARCHED, or INS_DIRECT */
dtuple_t* row; /*!< row to insert */ dtuple_t* row; /*!< row to insert */
dict_table_t* table; /*!< table where to insert */ dict_table_t* table; /*!< table where to insert */
...@@ -169,11 +173,12 @@ struct ins_node_t{ ...@@ -169,11 +173,12 @@ struct ins_node_t{
ulint state; /*!< node execution state */ ulint state; /*!< node execution state */
dict_index_t* index; /*!< NULL, or the next index where the index dict_index_t* index; /*!< NULL, or the next index where the index
entry should be inserted */ entry should be inserted */
dtuple_t* entry; /*!< NULL, or entry to insert in the index; std::vector<dtuple_t*>
entry_list;/* list of entries, one for each index */
std::vector<dtuple_t*>::iterator
entry; /*!< NULL, or entry to insert in the index;
after a successful insert of the entry, after a successful insert of the entry,
this should be reset to NULL */ this should be reset to NULL */
UT_LIST_BASE_NODE_T(dtuple_t)
entry_list;/* list of entries, one for each index */
/** buffer for the system columns */ /** buffer for the system columns */
byte sys_buf[DATA_ROW_ID_LEN byte sys_buf[DATA_ROW_ID_LEN
+ DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN]; + DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN];
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2018, 2020 MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -460,6 +460,8 @@ que_graph_free_recursive( ...@@ -460,6 +460,8 @@ que_graph_free_recursive(
que_graph_free_recursive(ins->select); que_graph_free_recursive(ins->select);
ins->select = NULL; ins->select = NULL;
ins->~ins_node_t();
if (ins->entry_sys_heap != NULL) { if (ins->entry_sys_heap != NULL) {
mem_heap_free(ins->entry_sys_heap); mem_heap_free(ins->entry_sys_heap);
ins->entry_sys_heap = NULL; ins->entry_sys_heap = NULL;
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 2019, MariaDB Corporation. Copyright (c) 2016, 2019, 2020 MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -73,8 +73,8 @@ ins_node_create( ...@@ -73,8 +73,8 @@ ins_node_create(
{ {
ins_node_t* node; ins_node_t* node;
node = static_cast<ins_node_t*>( node = new (static_cast<ins_node_t*>(
mem_heap_alloc(heap, sizeof(ins_node_t))); mem_heap_alloc(heap, sizeof(ins_node_t)))) ins_node_t;
node->common.type = QUE_NODE_INSERT; node->common.type = QUE_NODE_INSERT;
...@@ -83,7 +83,6 @@ ins_node_create( ...@@ -83,7 +83,6 @@ ins_node_create(
node->state = INS_NODE_SET_IX_LOCK; node->state = INS_NODE_SET_IX_LOCK;
node->table = table; node->table = table;
node->index = NULL; node->index = NULL;
node->entry = NULL;
node->select = NULL; node->select = NULL;
...@@ -109,12 +108,12 @@ ins_node_create_entry_list( ...@@ -109,12 +108,12 @@ ins_node_create_entry_list(
ut_ad(node->entry_sys_heap); ut_ad(node->entry_sys_heap);
UT_LIST_INIT(node->entry_list, &dtuple_t::tuple_list);
/* We will include all indexes (include those corrupted /* We will include all indexes (include those corrupted
secondary indexes) in the entry list. Filteration of secondary indexes) in the entry list. Filtration of
these corrupted index will be done in row_ins() */ these corrupted index will be done in row_ins() */
node->entry_list.reserve(UT_LIST_GET_LEN(node->table->indexes));
for (index = dict_table_get_first_index(node->table); for (index = dict_table_get_first_index(node->table);
index != 0; index != 0;
index = dict_table_get_next_index(index)) { index = dict_table_get_next_index(index)) {
...@@ -123,7 +122,7 @@ ins_node_create_entry_list( ...@@ -123,7 +122,7 @@ ins_node_create_entry_list(
node->row, NULL, index, node->entry_sys_heap, node->row, NULL, index, node->entry_sys_heap,
ROW_BUILD_FOR_INSERT); ROW_BUILD_FOR_INSERT);
UT_LIST_ADD_LAST(node->entry_list, entry); node->entry_list.push_back(entry);
} }
} }
...@@ -189,7 +188,8 @@ ins_node_set_new_row( ...@@ -189,7 +188,8 @@ ins_node_set_new_row(
{ {
node->state = INS_NODE_SET_IX_LOCK; node->state = INS_NODE_SET_IX_LOCK;
node->index = NULL; node->index = NULL;
node->entry = NULL; node->entry_list.clear();
node->entry = node->entry_list.end();
node->row = row; node->row = row;
...@@ -3413,15 +3413,16 @@ row_ins_index_entry_step( ...@@ -3413,15 +3413,16 @@ row_ins_index_entry_step(
ut_ad(dtuple_check_typed(node->row)); ut_ad(dtuple_check_typed(node->row));
err = row_ins_index_entry_set_vals(node->index, node->entry, node->row); err = row_ins_index_entry_set_vals(node->index, *node->entry,
node->row);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
DBUG_RETURN(err); DBUG_RETURN(err);
} }
ut_ad(dtuple_check_typed(node->entry)); ut_ad(dtuple_check_typed(*node->entry));
err = row_ins_index_entry(node->index, node->entry, thr); err = row_ins_index_entry(node->index, *node->entry, thr);
DEBUG_SYNC_C_IF_THD(thr_get_trx(thr)->mysql_thd, DEBUG_SYNC_C_IF_THD(thr_get_trx(thr)->mysql_thd,
"after_row_ins_index_entry_step"); "after_row_ins_index_entry_step");
...@@ -3539,7 +3540,8 @@ row_ins( ...@@ -3539,7 +3540,8 @@ row_ins(
row_ins_alloc_row_id_step(node); row_ins_alloc_row_id_step(node);
node->index = dict_table_get_first_index(node->table); node->index = dict_table_get_first_index(node->table);
node->entry = UT_LIST_GET_FIRST(node->entry_list); ut_ad(node->entry_list.empty() == false);
node->entry = node->entry_list.begin();
if (node->ins_type == INS_SEARCHED) { if (node->ins_type == INS_SEARCHED) {
...@@ -3565,20 +3567,16 @@ row_ins( ...@@ -3565,20 +3567,16 @@ row_ins(
} }
node->index = dict_table_get_next_index(node->index); node->index = dict_table_get_next_index(node->index);
node->entry = UT_LIST_GET_NEXT(tuple_list, node->entry); ++node->entry;
DBUG_EXECUTE_IF(
"row_ins_skip_sec",
node->index = NULL; node->entry = NULL; break;);
/* Skip corrupted secondary index and its entry */ /* Skip corrupted secondary index and its entry */
while (node->index && node->index->is_corrupted()) { while (node->index && node->index->is_corrupted()) {
node->index = dict_table_get_next_index(node->index); node->index = dict_table_get_next_index(node->index);
node->entry = UT_LIST_GET_NEXT(tuple_list, node->entry); ++node->entry;
} }
} }
ut_ad(node->entry == NULL); ut_ad(node->entry == node->entry_list.end());
node->state = INS_NODE_ALLOC_ROW_ID; node->state = INS_NODE_ALLOC_ROW_ID;
......
...@@ -1092,7 +1092,7 @@ row_get_prebuilt_insert_row( ...@@ -1092,7 +1092,7 @@ row_get_prebuilt_insert_row(
may need to rebuild the row insert template. */ may need to rebuild the row insert template. */
if (prebuilt->trx_id == table->def_trx_id if (prebuilt->trx_id == table->def_trx_id
&& UT_LIST_GET_LEN(prebuilt->ins_node->entry_list) && prebuilt->ins_node->entry_list.size()
== UT_LIST_GET_LEN(table->indexes)) { == UT_LIST_GET_LEN(table->indexes)) {
return(prebuilt->ins_node->row); return(prebuilt->ins_node->row);
......
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