2012-09-01 23:21:59 +02:00
|
|
|
/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
2020-07-14 14:10:59 +02:00
|
|
|
Copyright (c) 2012, 2020, MariaDB
|
2012-09-01 23:21:59 +02:00
|
|
|
|
|
|
|
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 Foundation; version 2 of the License.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
2019-05-11 21:19:05 +02:00
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
|
2012-09-01 23:21:59 +02:00
|
|
|
|
2017-06-18 05:42:16 +02:00
|
|
|
#include "mariadb.h"
|
2012-09-01 23:21:59 +02:00
|
|
|
#include "filesort_utils.h"
|
|
|
|
#include "sql_const.h"
|
|
|
|
#include "sql_sort.h"
|
|
|
|
#include "table.h"
|
|
|
|
|
|
|
|
|
2020-01-29 13:50:26 +01:00
|
|
|
PSI_memory_key key_memory_Filesort_buffer_sort_keys;
|
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
/**
|
|
|
|
A local helper function. See comments for get_merge_buffers_cost().
|
2022-04-05 19:12:29 +02:00
|
|
|
*/
|
|
|
|
|
2022-06-30 13:48:00 +02:00
|
|
|
static
|
|
|
|
double get_merge_cost(ha_rows num_elements,
|
|
|
|
ha_rows num_buffers,
|
|
|
|
uint elem_size,
|
|
|
|
double key_compare_cost)
|
2012-09-01 23:21:59 +02:00
|
|
|
{
|
2022-04-05 19:12:29 +02:00
|
|
|
return (2.0 * ((double) num_elements * elem_size) / IO_SIZE
|
|
|
|
+ (double) num_elements * log((double) num_buffers) *
|
2022-06-30 13:48:00 +02:00
|
|
|
key_compare_cost / M_LN2);
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
This is a simplified, and faster version of @see get_merge_many_buffs_cost().
|
|
|
|
We calculate the cost of merging buffers, by simulating the actions
|
|
|
|
of @see merge_many_buff. For explanations of formulas below,
|
|
|
|
see comments for get_merge_buffers_cost().
|
|
|
|
TODO: Use this function for Unique::get_use_cost().
|
|
|
|
*/
|
2022-04-05 19:12:29 +02:00
|
|
|
|
2022-06-30 13:48:00 +02:00
|
|
|
double get_merge_many_buffs_cost_fast(ha_rows num_rows,
|
2012-09-01 23:21:59 +02:00
|
|
|
ha_rows num_keys_per_buffer,
|
2022-06-30 13:48:00 +02:00
|
|
|
uint elem_size,
|
|
|
|
double key_compare_cost)
|
2012-09-01 23:21:59 +02:00
|
|
|
{
|
|
|
|
ha_rows num_buffers= num_rows / num_keys_per_buffer;
|
|
|
|
ha_rows last_n_elems= num_rows % num_keys_per_buffer;
|
2022-06-30 13:48:00 +02:00
|
|
|
double total_cost;
|
2012-09-01 23:21:59 +02:00
|
|
|
|
|
|
|
// Calculate CPU cost of sorting buffers.
|
|
|
|
total_cost=
|
2020-02-28 11:59:30 +01:00
|
|
|
((num_buffers * num_keys_per_buffer * log(1.0 + num_keys_per_buffer) +
|
2022-06-30 13:48:00 +02:00
|
|
|
last_n_elems * log(1.0 + last_n_elems)) * key_compare_cost);
|
2022-04-05 19:12:29 +02:00
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
// Simulate behavior of merge_many_buff().
|
|
|
|
while (num_buffers >= MERGEBUFF2)
|
|
|
|
{
|
|
|
|
// Calculate # of calls to merge_buffers().
|
|
|
|
const ha_rows loop_limit= num_buffers - MERGEBUFF*3/2;
|
|
|
|
const ha_rows num_merge_calls= 1 + loop_limit/MERGEBUFF;
|
|
|
|
const ha_rows num_remaining_buffs=
|
|
|
|
num_buffers - num_merge_calls * MERGEBUFF;
|
|
|
|
|
|
|
|
// Cost of merge sort 'num_merge_calls'.
|
|
|
|
total_cost+=
|
|
|
|
num_merge_calls *
|
2022-06-30 13:48:00 +02:00
|
|
|
get_merge_cost(num_keys_per_buffer * MERGEBUFF, MERGEBUFF, elem_size,
|
|
|
|
key_compare_cost);
|
2012-09-01 23:21:59 +02:00
|
|
|
|
|
|
|
// # of records in remaining buffers.
|
|
|
|
last_n_elems+= num_remaining_buffs * num_keys_per_buffer;
|
|
|
|
|
|
|
|
// Cost of merge sort of remaining buffers.
|
|
|
|
total_cost+=
|
2022-06-30 13:48:00 +02:00
|
|
|
get_merge_cost(last_n_elems, 1 + num_remaining_buffs, elem_size,
|
|
|
|
key_compare_cost);
|
2012-09-01 23:21:59 +02:00
|
|
|
|
|
|
|
num_buffers= num_merge_calls;
|
|
|
|
num_keys_per_buffer*= MERGEBUFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Simulate final merge_buff call.
|
|
|
|
last_n_elems+= num_keys_per_buffer * num_buffers;
|
2022-06-30 13:48:00 +02:00
|
|
|
total_cost+= get_merge_cost(last_n_elems, 1 + num_buffers, elem_size,
|
|
|
|
key_compare_cost);
|
2012-09-01 23:21:59 +02:00
|
|
|
return total_cost;
|
|
|
|
}
|
|
|
|
|
2016-03-22 20:51:59 +01:00
|
|
|
/*
|
|
|
|
alloc_sort_buffer()
|
2012-09-02 04:41:38 +02:00
|
|
|
|
2016-03-22 20:51:59 +01:00
|
|
|
Allocate buffer for sorting keys.
|
|
|
|
Try to reuse old buffer if possible.
|
2012-09-01 23:21:59 +02:00
|
|
|
|
2016-03-22 20:51:59 +01:00
|
|
|
@return
|
|
|
|
0 Error
|
|
|
|
# Pointer to allocated buffer
|
|
|
|
*/
|
|
|
|
|
2020-01-20 21:07:47 +01:00
|
|
|
uchar *Filesort_buffer::alloc_sort_buffer(uint num_records,
|
|
|
|
uint record_length)
|
2016-03-22 20:51:59 +01:00
|
|
|
{
|
|
|
|
size_t buff_size;
|
|
|
|
DBUG_ENTER("alloc_sort_buffer");
|
2012-09-01 23:21:59 +02:00
|
|
|
DBUG_EXECUTE_IF("alloc_sort_buffer_fail",
|
|
|
|
DBUG_SET("+d,simulate_out_of_memory"););
|
|
|
|
|
2020-01-20 21:07:47 +01:00
|
|
|
buff_size= ALIGN_SIZE(num_records * (record_length + sizeof(uchar*)));
|
2016-03-22 20:51:59 +01:00
|
|
|
|
2020-01-20 21:07:47 +01:00
|
|
|
if (m_rawmem)
|
2012-09-01 23:21:59 +02:00
|
|
|
{
|
2016-03-22 20:51:59 +01:00
|
|
|
/*
|
|
|
|
Reuse old buffer if exists and is large enough
|
|
|
|
Note that we don't make the buffer smaller, as we want to be
|
|
|
|
prepared for next subquery iteration.
|
|
|
|
*/
|
2020-01-20 21:07:47 +01:00
|
|
|
if (buff_size > m_size_in_bytes)
|
2016-03-22 20:51:59 +01:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
Better to free and alloc than realloc as we don't have to remember
|
|
|
|
the old values
|
|
|
|
*/
|
2020-01-20 21:07:47 +01:00
|
|
|
my_free(m_rawmem);
|
2020-01-29 13:50:26 +01:00
|
|
|
if (!(m_rawmem= (uchar*) my_malloc(key_memory_Filesort_buffer_sort_keys,
|
|
|
|
buff_size, MYF(MY_THREAD_SPECIFIC))))
|
2016-03-22 20:51:59 +01:00
|
|
|
{
|
2020-01-20 21:07:47 +01:00
|
|
|
m_size_in_bytes= 0;
|
2016-03-22 20:51:59 +01:00
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
}
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-01-29 13:50:26 +01:00
|
|
|
if (!(m_rawmem= (uchar*) my_malloc(key_memory_Filesort_buffer_sort_keys,
|
|
|
|
buff_size, MYF(MY_THREAD_SPECIFIC))))
|
2020-01-20 21:07:47 +01:00
|
|
|
{
|
|
|
|
m_size_in_bytes= 0;
|
2016-03-22 20:51:59 +01:00
|
|
|
DBUG_RETURN(0);
|
2020-01-20 21:07:47 +01:00
|
|
|
}
|
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
2016-03-22 20:51:59 +01:00
|
|
|
|
2020-01-20 21:07:47 +01:00
|
|
|
m_size_in_bytes= buff_size;
|
|
|
|
m_record_pointers= reinterpret_cast<uchar**>(m_rawmem) +
|
|
|
|
((m_size_in_bytes / sizeof(uchar*)) - 1);
|
|
|
|
m_num_records= num_records;
|
2016-03-22 20:51:59 +01:00
|
|
|
m_record_length= record_length;
|
2020-01-20 21:07:47 +01:00
|
|
|
m_idx= 0;
|
|
|
|
DBUG_RETURN(m_rawmem);
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Filesort_buffer::free_sort_buffer()
|
|
|
|
{
|
2020-01-20 21:07:47 +01:00
|
|
|
my_free(m_rawmem);
|
|
|
|
*this= Filesort_buffer();
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Filesort_buffer::sort_buffer(const Sort_param *param, uint count)
|
|
|
|
{
|
2014-11-18 22:27:31 +01:00
|
|
|
size_t size= param->sort_length;
|
2020-01-20 21:07:47 +01:00
|
|
|
m_sort_keys= get_sort_keys();
|
|
|
|
|
2014-11-18 22:27:31 +01:00
|
|
|
if (count <= 1 || size == 0)
|
2012-09-01 23:21:59 +02:00
|
|
|
return;
|
2020-01-20 21:07:47 +01:00
|
|
|
|
2020-03-04 17:30:08 +01:00
|
|
|
// don't reverse for PQ, it is already done
|
2020-01-20 21:07:47 +01:00
|
|
|
if (!param->using_pq)
|
|
|
|
reverse_record_pointers();
|
|
|
|
|
2012-09-01 23:21:59 +02:00
|
|
|
uchar **buffer= NULL;
|
2020-03-10 00:26:38 +01:00
|
|
|
if (!param->using_packed_sortkeys() &&
|
2022-07-02 20:47:57 +02:00
|
|
|
radixsort_is_applicable(count, param->sort_length) &&
|
2020-01-29 13:50:26 +01:00
|
|
|
(buffer= (uchar**) my_malloc(PSI_INSTRUMENT_ME, count*sizeof(char*),
|
MDEV-4011 Added per thread memory counting and usage
Base code and idea from a patch from by plinux at Taobao.
The idea is that we mark all memory that are thread specific with MY_THREAD_SPECIFIC.
Memory counting is done per thread in the my_malloc_size_cb_func callback function from my_malloc().
There are plenty of new asserts to ensure that for a debug server the counting is correct.
Information_schema.processlist gets two new columns: MEMORY_USED and EXAMINED_ROWS.
- The later is there mainly to show how query is progressing.
The following changes in interfaces was needed to get this to work:
- init_alloc_root() amd init_sql_alloc() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- One now have to use alloc_root_set_min_malloc() to set min memory to be allocated by alloc_root()
- my_init_dynamic_array() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- my_net_init() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- Added flag for hash_init() so that one can mark hash table to be thread specific.
- Added flags to init_tree() so that one can mark tree to be thread specific.
- Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
- Added flag to Warning_info::Warning_info() if the structure should be fully initialized.
- String elements can now be marked as thread specific.
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Changed type of myf from int to ulong, as this is always a set of bit flags.
Other things:
- Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
- We now also show EXAMINED_ROWS in SHOW PROCESSLIST
- Added new variable 'memory_used'
- Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
- Removed calls to the obsoleted function init_dynamic_array()
- Use set_current_thd() instead of my_pthread_setspecific_ptr(THR_THD,...)
client/completion_hash.cc:
Updated call to init_alloc_root()
client/mysql.cc:
Updated call to init_alloc_root()
client/mysqlbinlog.cc:
init_dynamic_array() -> my_init_dynamic_array()
Updated call to init_alloc_root()
client/mysqlcheck.c:
Updated call to my_init_dynamic_array()
client/mysqldump.c:
Updated call to init_alloc_root()
client/mysqltest.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Fixed compiler warnings
extra/comp_err.c:
Updated call to my_init_dynamic_array()
extra/resolve_stack_dump.c:
Updated call to my_init_dynamic_array()
include/hash.h:
Added HASH_THREAD_SPECIFIC
include/heap.h:
Added flag is internal temporary table.
include/my_dir.h:
Safety fix: Ensure that MY_DONT_SORT and MY_WANT_STAT don't interfer with other mysys flags
include/my_global.h:
Changed type of myf from int to ulong, as this is always a set of bit flags.
include/my_sys.h:
Added MY_THREAD_SPECIFIC and MY_THREAD_MOVE
Added malloc_flags to DYNAMIC_ARRAY
Added extra mysys flag argument to my_init_dynamic_array()
Removed deprecated functions init_dynamic_array() and my_init_dynamic_array.._ci
Updated paramaters for init_alloc_root()
include/my_tree.h:
Added my_flags to allow one to use MY_THREAD_SPECIFIC with hash tables.
Removed with_delete. One should now instead use MY_TREE_WITH_DELETE_FLAG
Updated parameters to init_tree()
include/myisamchk.h:
Added malloc_flags to allow one to use MY_THREAD_SPECIFIC for checks.
include/mysql.h:
Added MYSQL_THREAD_SPECIFIC_MALLOC
Used 'unused1' to mark memory as thread specific.
include/mysql.h.pp:
Updated file
include/mysql_com.h:
Used 'unused1' to mark memory as thread specific.
Updated parameters for my_net_init()
libmysql/libmysql.c:
Updated call to init_alloc_root() to mark memory thread specific.
libmysqld/emb_qcache.cc:
Updated call to init_alloc_root()
libmysqld/lib_sql.cc:
Updated call to init_alloc_root()
mysql-test/r/create.result:
Updated results
mysql-test/r/user_var.result:
Updated results
mysql-test/suite/funcs_1/datadict/processlist_priv.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/is_columns_is.result:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
Updated results
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
Updated results
mysql-test/t/show_explain.test:
Fixed usage of debug variable so that one can run test with --debug
mysql-test/t/user_var.test:
Added test of memory_usage variable.
mysys/array.c:
Added extra my_flags option to init_dynamic_array() and init_dynamic_array2() so that one can mark memory with MY_THREAD_SPECIFIC
All allocated memory is marked with the given my_flags.
Removed obsolete function init_dynamic_array()
mysys/default.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
mysys/hash.c:
Updated call to my_init_dynamic_array_ci().
Allocated memory is marked with MY_THREAD_SPECIFIC if HASH_THREAD_SPECIFIC is used.
mysys/ma_dyncol.c:
init_dynamic_array() -> my_init_dynamic_array()
Added #if to get rid of compiler warnings
mysys/mf_tempdir.c:
Updated call to my_init_dynamic_array()
mysys/my_alloc.c:
Added extra parameter to init_alloc_root() so that one can mark memory with MY_THREAD_SPECIFIC
Extend MEM_ROOT with a flag if memory is thread specific.
This is stored in block_size, to keep the size of the MEM_ROOT object identical as before.
Allocated memory is marked with MY_THREAD_SPECIFIC if used with init_alloc_root()
mysys/my_chmod.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_chsize.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_copy.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_create.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_delete.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_error.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fopen.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fstream.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_getwd.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_lib.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Updated DBUG_PRINT because of change of myf type
mysys/my_lock.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_malloc.c:
Store at start of each allocated memory block the size of the block and if the block is thread specific.
Call malloc_size_cb_func, if set, with the memory allocated/freed.
Updated DBUG_PRINT because of change of myf type
mysys/my_open.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_pread.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_read.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_redel.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_rename.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_seek.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_sync.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_thr_init.c:
Ensure that one can call my_thread_dbug_id() even if thread is not properly initialized.
mysys/my_write.c:
Updated DBUG_PRINT because of change of myf type
mysys/mysys_priv.h:
Updated parameters to sf_malloc and sf_realloc()
mysys/safemalloc.c:
Added checking that for memory marked with MY_THREAD_SPECIFIC that it's the same thread that is allocation and freeing the memory.
Added sf_malloc_dbug_id() to allow MariaDB to specify which THD is handling the memory.
Added my_flags arguments to sf_malloc() and sf_realloc() to be able to mark memory with MY_THREAD_SPECIFIC.
Added sf_report_leaked_memory() to get list of memory not freed by a thread.
mysys/tree.c:
Added flags to init_tree() so that one can mark tree to be thread specific.
Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
Updated call to init_alloc_root()
All allocated memory is marked with the given malloc flags
mysys/waiting_threads.c:
Updated call to my_init_dynamic_array()
sql-common/client.c:
Updated call to init_alloc_root() and my_net_init() to mark memory thread specific.
Updated call to my_init_dynamic_array().
Added MYSQL_THREAD_SPECIFIC_MALLOC so that client can mark memory as MY_THREAD_SPECIFIC.
sql-common/client_plugin.c:
Updated call to init_alloc_root()
sql/debug_sync.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/event_scheduler.cc:
Removed calls to net_end() as this is now done in ~THD()
Call set_current_thd() to ensure that memory is assigned to right thread.
sql/events.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/filesort.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/filesort_utils.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/ha_ndbcluster.cc:
Updated call to init_alloc_root()
Updated call to my_net_init()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_ndbcluster_binlog.cc:
Updated call to my_net_init()
Updated call to init_sql_alloc()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_partition.cc:
Updated call to init_alloc_root()
sql/handler.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
Added missing call to my_dir_end()
sql/item_func.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_subselect.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_sum.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/log.cc:
More DBUG
Updated call to init_alloc_root()
sql/mdl.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/mysqld.cc:
Added total_memory_used
Updated call to init_alloc_root()
Move mysql_cond_broadcast() before my_thread_end()
Added mariadb_dbug_id() to count memory per THD instead of per thread.
Added my_malloc_size_cb_func() callback function for my_malloc() to count memory.
Move initialization of mysqld_server_started and mysqld_server_initialized earlier.
Updated call to my_init_dynamic_array().
Updated call to my_net_init().
Call my_pthread_setspecific_ptr(THR_THD,...) to ensure that memory is assigned to right thread.
Added status variable 'memory_used'.
Updated call to init_alloc_root()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/mysqld.h:
Added set_current_thd()
sql/net_serv.cc:
Added new parameter to my_net_init() so that one can mark memory with MY_THREAD_SPECIFIC.
Store in net->thread_specific_malloc if memory is thread specific.
Mark memory to be thread specific if requested.
sql/opt_range.cc:
Updated call to my_init_dynamic_array()
Updated call to init_sql_alloc()
Added MY_THREAD_SPECIFIC to allocated memory.
sql/opt_subselect.cc:
Updated call to init_sql_alloc() to mark memory thread specific.
sql/protocol.cc:
Fixed compiler warning
sql/records.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/rpl_filter.cc:
Updated call to my_init_dynamic_array()
sql/rpl_handler.cc:
Updated call to my_init_dynamic_array2()
sql/rpl_handler.h:
Updated call to init_sql_alloc()
sql/rpl_mi.cc:
Updated call to my_init_dynamic_array()
sql/rpl_tblmap.cc:
Updated call to init_alloc_root()
sql/rpl_utility.cc:
Updated call to my_init_dynamic_array()
sql/slave.cc:
Initialize things properly before calling functions that allocate memory.
Removed calls to net_end() as this is now done in ~THD()
sql/sp_head.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
Added parameter to warning_info() that it should be fully initialized.
sql/sp_pcontext.cc:
Updated call to my_init_dynamic_array()
sql/sql_acl.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_admin.cc:
Added parameter to warning_info() that it should be fully initialized.
sql/sql_analyse.h:
Updated call to init_tree() to mark memory thread specific.
sql/sql_array.h:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_audit.cc:
Updated call to my_init_dynamic_array()
sql/sql_base.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_cache.cc:
Updated comment
sql/sql_class.cc:
Added parameter to warning_info() that not initialize it until THD is fully created.
Updated call to init_sql_alloc()
Mark THD::user_vars has to be thread specific.
Updated call to my_init_dynamic_array()
Ensure that memory allocated by THD is assigned to the THD.
More DBUG
Always acll net_end() in ~THD()
Assert that all memory signed to this THD is really deleted at ~THD.
Fixed set_status_var_init() to not reset memory_used.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_class.h:
Added MY_THREAD_SPECIFIC to allocated memory.
Added malloc_size to THD to record allocated memory per THD.
sql/sql_delete.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_error.cc:
Added 'initialize' parameter to Warning_info() to say if should allocate memory for it's structures.
This is used by THD::THD() to not allocate memory until THD is ready.
Added Warning_info::free_memory()
sql/sql_error.h:
Updated Warning_info() class.
sql/sql_handler.cc:
Updated call to init_alloc_root() to mark memory thread specific.
sql/sql_insert.cc:
More DBUG
sql/sql_join_cache.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_lex.cc:
Updated call to my_init_dynamic_array()
sql/sql_lex.h:
Updated call to my_init_dynamic_array()
sql/sql_load.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_parse.cc:
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
Ensure that examined_row_count() is reset before query.
Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Don't restore thd->status_var.memory_used when restoring thd->status_var
sql/sql_plugin.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Don't allocate THD on the stack, as this causes problems with valgrind when doing thd memory counting.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_prepare.cc:
Added parameter to warning_info() that it should be fully initialized.
Updated call to init_sql_alloc() to mark memory thread specific.
sql/sql_reload.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_select.cc:
Updated call to my_init_dynamic_array() and init_sql_alloc() to mark memory thread specific.
Added MY_THREAD_SPECIFIC to allocated memory.
More DBUG
sql/sql_servers.cc:
Updated call to init_sql_alloc() to mark memory some memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_show.cc:
Updated call to my_init_dynamic_array()
Mark my_dir() memory thread specific.
Use my_pthread_setspecific_ptr(THR_THD,...) to mark that allocated memory should be allocated to calling thread.
More DBUG.
Added malloc_size and examined_row_count to SHOW PROCESSLIST.
Added MY_THREAD_SPECIFIC to allocated memory.
Updated call to init_sql_alloc()
Added parameter to warning_info() that it should be fully initialized.
sql/sql_statistics.cc:
Fixed compiler warning
sql/sql_string.cc:
String elements can now be marked as thread specific.
sql/sql_string.h:
String elements can now be marked as thread specific.
sql/sql_table.cc:
Updated call to init_sql_alloc() and my_malloc() to mark memory thread specific
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Fixed compiler warning
sql/sql_test.cc:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_trigger.cc:
Updated call to init_sql_alloc()
sql/sql_udf.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_update.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/table.cc:
Updated call to init_sql_alloc().
Mark memory used by temporary tables, that are not for slave threads, as MY_THREAD_SPECIFIC
Updated call to init_sql_alloc()
sql/thr_malloc.cc:
Added my_flags argument to init_sql_alloc() to be able to mark memory as MY_THREAD_SPECIFIC.
sql/thr_malloc.h:
Updated prototype for init_sql_alloc()
sql/tztime.cc:
Updated call to init_sql_alloc()
Updated call to init_alloc_root() to mark memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/uniques.cc:
Updated calls to init_tree(), my_init_dynamic_array() and my_malloc() to mark memory thread specific.
sql/unireg.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/csv/ha_tina.cc:
Updated call to init_alloc_root()
storage/federated/ha_federated.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Ensure that memory allocated by fedarated is registered for the system, not for the thread.
storage/federatedx/federatedx_io_mysql.cc:
Updated call to my_init_dynamic_array()
storage/federatedx/ha_federatedx.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
storage/heap/ha_heap.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/heap/heapdef.h:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_block.c:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_create.c:
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Use MY_TREE_WITH_DELETE instead of removed option 'with_delete'.
storage/heap/hp_open.c:
Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
storage/heap/hp_write.c:
Added new parameter to hp_get_new_block()
storage/maria/ma_bitmap.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_blockrec.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_check.c:
Updated call to init_alloc_root()
storage/maria/ma_ft_boolean_search.c:
Updated calls to init_tree() and init_alloc_root()
storage/maria/ma_ft_nlq_search.c:
Updated call to init_tree()
storage/maria/ma_ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/maria/ma_loghandler.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_open.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_sort.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_write.c:
Updated calls to my_init_dynamic_array() and init_tree()
storage/maria/maria_pack.c:
Updated call to init_tree()
storage/maria/unittest/sequence_storage.c:
Updated call to my_init_dynamic_array()
storage/myisam/ft_boolean_search.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_nlq_search.c:
Updated call to init_tree()
storage/myisam/ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_stopwords.c:
Updated call to init_tree()
storage/myisam/mi_check.c:
Updated call to init_alloc_root()
storage/myisam/mi_write.c:
Updated call to my_init_dynamic_array()
Updated call to init_tree()
storage/myisam/myisamlog.c:
Updated call to init_tree()
storage/myisam/myisampack.c:
Updated call to init_tree()
storage/myisam/sort.c:
Updated call to my_init_dynamic_array()
storage/myisammrg/ha_myisammrg.cc:
Updated call to init_sql_alloc()
storage/perfschema/pfs_check.cc:
Rest current_thd
storage/perfschema/pfs_instr.cc:
Removed DBUG_ENTER/DBUG_VOID_RETURN as at this point my_thread_var is not allocated anymore, which can cause problems.
support-files/compiler_warnings.supp:
Disable compiler warning from offsetof macro.
2013-01-23 16:16:14 +01:00
|
|
|
MYF(MY_THREAD_SPECIFIC))))
|
2012-09-01 23:21:59 +02:00
|
|
|
{
|
2020-01-20 21:07:47 +01:00
|
|
|
radixsort_for_str_ptr(m_sort_keys, count, param->sort_length, buffer);
|
2012-09-01 23:21:59 +02:00
|
|
|
my_free(buffer);
|
|
|
|
return;
|
|
|
|
}
|
2020-03-10 00:26:38 +01:00
|
|
|
|
|
|
|
my_qsort2(m_sort_keys, count, sizeof(uchar*),
|
|
|
|
param->get_compare_function(),
|
|
|
|
param->get_compare_argument(&size));
|
2012-09-01 23:21:59 +02:00
|
|
|
}
|