1
1
/*****************************************************************************
3
Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved.
3
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
4
4
Copyright (c) 2008, 2009 Google Inc.
5
Copyright (c) 2009, Percona Inc.
7
6
Portions of this file contain modifications contributed and copyrighted by
8
7
Google, Inc. Those modifications are gratefully acknowledged and are described
10
9
incorporated with their permission, and subject to the conditions contained in
11
10
the file COPYING.Google.
13
Portions of this file contain modifications contributed and copyrighted
14
by Percona Inc.. Those modifications are
15
gratefully acknowledged and are described briefly in the InnoDB
16
documentation. The contributions by Percona Inc. are incorporated with
17
their permission, and subject to the conditions contained in the file
20
12
This program is free software; you can redistribute it and/or modify it under
21
13
the terms of the GNU General Public License as published by the Free Software
22
14
Foundation; version 2 of the License.
30
22
St, Fifth Floor, Boston, MA 02110-1301 USA
32
24
*****************************************************************************/
25
/***********************************************************************
27
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
28
Copyright (c) 2009, Percona Inc.
30
Portions of this file contain modifications contributed and copyrighted
31
by Percona Inc.. Those modifications are
32
gratefully acknowledged and are described briefly in the InnoDB
33
documentation. The contributions by Percona Inc. are incorporated with
34
their permission, and subject to the conditions contained in the file
37
This program is free software; you can redistribute it and/or modify it
38
under the terms of the GNU General Public License as published by the
39
Free Software Foundation; version 2 of the License.
41
This program is distributed in the hope that it will be useful, but
42
WITHOUT ANY WARRANTY; without even the implied warranty of
43
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
44
Public License for more details.
46
You should have received a copy of the GNU General Public License along
47
with this program; if not, write to the Free Software Foundation, Inc.,
48
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
50
***********************************************************************/
34
52
/**************************************************//**
35
53
@file srv/srv0srv.c
136
154
on duplicate key checking and foreign key checking */
137
155
UNIV_INTERN ibool srv_locks_unsafe_for_binlog = FALSE;
139
/* If this flag is TRUE, then we will use the native aio of the
140
OS (provided we compiled Innobase with it in), otherwise we will
141
use simulated aio we build below with threads.
142
Currently we support native aio on windows and linux */
143
UNIV_INTERN my_bool srv_use_native_aio = TRUE;
146
/* Windows native condition variables. We use runtime loading / function
147
pointers, because they are not available on Windows Server 2003 and
150
We use condition for events on Windows if possible, even if os_event
151
resembles Windows kernel event object well API-wise. The reason is
152
performance, kernel objects are heavyweights and WaitForSingleObject() is a
153
performance killer causing calling thread to context switch. Besides, Innodb
154
is preallocating large number (often millions) of os_events. With kernel event
155
objects it takes a big chunk out of non-paged pool, which is better suited
156
for tasks like IO than for storing idle event objects. */
157
UNIV_INTERN ibool srv_use_native_conditions = FALSE;
160
157
UNIV_INTERN ulint srv_n_data_files = 0;
161
158
UNIV_INTERN char** srv_data_file_names = NULL;
162
159
/* size in database pages */
191
188
the checkpoints. */
192
189
UNIV_INTERN bool srv_adaptive_flushing = TRUE;
194
/** Maximum number of times allowed to conditionally acquire
195
mutex before switching to blocking wait on the mutex */
196
#define MAX_MUTEX_NOWAIT 20
198
/** Check whether the number of failed nonblocking mutex
199
acquisition attempts exceeds maximum allowed value. If so,
200
srv_printf_innodb_monitor() will request mutex acquisition
201
with mutex_enter(), which will wait until it gets the mutex. */
202
#define MUTEX_NOWAIT(mutex_skipped) ((mutex_skipped) < MAX_MUTEX_NOWAIT)
204
/** The sort order table of the MySQL latin1_swedish_ci character set
191
/* The sort order table of the MySQL latin1_swedish_ci character set
206
193
#if defined(BUILD_DRIZZLE)
207
194
UNIV_INTERN const byte srv_latin1_ordering[256] /* The sort order table of the latin1
488
466
/* Mutex for locking srv_monitor_file */
489
467
UNIV_INTERN mutex_t srv_monitor_file_mutex;
491
#ifdef UNIV_PFS_MUTEX
492
/* Key to register kernel_mutex with performance schema */
493
UNIV_INTERN mysql_pfs_key_t kernel_mutex_key;
494
/* Key to register srv_innodb_monitor_mutex with performance schema */
495
UNIV_INTERN mysql_pfs_key_t srv_innodb_monitor_mutex_key;
496
/* Key to register srv_monitor_file_mutex with performance schema */
497
UNIV_INTERN mysql_pfs_key_t srv_monitor_file_mutex_key;
498
/* Key to register srv_dict_tmpfile_mutex with performance schema */
499
UNIV_INTERN mysql_pfs_key_t srv_dict_tmpfile_mutex_key;
500
/* Key to register the mutex with performance schema */
501
UNIV_INTERN mysql_pfs_key_t srv_misc_tmpfile_mutex_key;
502
#endif /* UNIV_PFS_MUTEX */
504
468
/* Temporary file for innodb monitor output */
505
469
UNIV_INTERN FILE* srv_monitor_file;
506
470
/* Mutex for locking srv_dict_tmpfile.
1016
980
srv_sys = mem_alloc(sizeof(srv_sys_t));
1018
982
kernel_mutex_temp = mem_alloc(sizeof(mutex_t));
1019
mutex_create(kernel_mutex_key, &kernel_mutex, SYNC_KERNEL);
983
mutex_create(&kernel_mutex, SYNC_KERNEL);
1021
mutex_create(srv_innodb_monitor_mutex_key,
1022
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
985
mutex_create(&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
1024
987
srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t));
1620
1583
row_mysql_unfreeze_data_dictionary(trx);
1622
1585
case RW_X_LATCH:
1623
/* There should never be a lock wait when the
1624
dictionary latch is reserved in X mode. Dictionary
1625
transactions should only acquire locks on dictionary
1626
tables, not other tables. All access to dictionary
1627
tables should be covered by dictionary
1629
ut_print_timestamp(stderr);
1630
fputs(" InnoDB: Error: dict X latch held in "
1631
"srv_suspend_mysql_thread\n", stderr);
1632
/* This should never occur. This incorrect handling
1633
was added in the early development of
1634
ha_innobase::add_index() in InnoDB Plugin 1.0. */
1635
1586
/* Release fast index creation latch */
1636
1587
row_mysql_unlock_data_dictionary(trx);
1783
1723
/******************************************************************//**
1784
Outputs to a file the output of the InnoDB Monitor.
1785
@return FALSE if not all information printed
1786
due to failure to obtain necessary mutex */
1724
Outputs to a file the output of the InnoDB Monitor. */
1789
1727
srv_printf_innodb_monitor(
1790
1728
/*======================*/
1791
1729
FILE* file, /*!< in: output stream */
1792
ibool nowait, /*!< in: whether to wait for kernel mutex */
1793
1730
ulint* trx_start, /*!< out: file position of the start of
1794
1731
the list of active transactions */
1795
1732
ulint* trx_end) /*!< out: file position of the end of
1849
1785
mutex_exit(&dict_foreign_err_mutex);
1851
/* Only if lock_print_info_summary proceeds correctly,
1852
before we call the lock_print_info_all_transactions
1853
to print all the lock information. */
1854
ret = lock_print_info_summary(file, nowait);
1858
long t = ftell(file);
1860
*trx_start = ULINT_UNDEFINED;
1862
*trx_start = (ulint) t;
1865
lock_print_info_all_transactions(file);
1867
long t = ftell(file);
1869
*trx_end = ULINT_UNDEFINED;
1871
*trx_end = (ulint) t;
1787
lock_print_info_summary(file);
1789
long t = ftell(file);
1791
*trx_start = ULINT_UNDEFINED;
1793
*trx_start = (ulint) t;
1796
lock_print_info_all_transactions(file);
1798
long t = ftell(file);
1800
*trx_end = ULINT_UNDEFINED;
1802
*trx_end = (ulint) t;
1876
1805
fputs("--------\n"
1878
1807
"--------\n", file);
2003
1922
export_vars.innodb_data_reads = os_n_file_reads;
2004
1923
export_vars.innodb_data_writes = os_n_file_writes;
2005
1924
export_vars.innodb_data_written = srv_data_written;
2006
export_vars.innodb_buffer_pool_read_requests = stat.n_page_gets;
1925
export_vars.innodb_buffer_pool_read_requests = buf_pool->stat.n_page_gets;
2007
1926
export_vars.innodb_buffer_pool_write_requests
2008
1927
= srv_buf_pool_write_requests;
2009
1928
export_vars.innodb_buffer_pool_wait_free = srv_buf_pool_wait_free;
2010
1929
export_vars.innodb_buffer_pool_pages_flushed = srv_buf_pool_flushed;
2011
1930
export_vars.innodb_buffer_pool_reads = srv_buf_pool_reads;
2012
1931
export_vars.innodb_buffer_pool_read_ahead
2013
= stat.n_ra_pages_read;
1932
= buf_pool->stat.n_ra_pages_read;
2014
1933
export_vars.innodb_buffer_pool_read_ahead_evicted
2015
= stat.n_ra_pages_evicted;
2016
export_vars.innodb_buffer_pool_pages_data = LRU_len;
2017
export_vars.innodb_buffer_pool_pages_dirty = flush_list_len;
2018
export_vars.innodb_buffer_pool_pages_free = free_len;
1934
= buf_pool->stat.n_ra_pages_evicted;
1935
export_vars.innodb_buffer_pool_pages_data
1936
= UT_LIST_GET_LEN(buf_pool->LRU);
1937
export_vars.innodb_buffer_pool_pages_dirty
1938
= UT_LIST_GET_LEN(buf_pool->flush_list);
1939
export_vars.innodb_buffer_pool_pages_free
1940
= UT_LIST_GET_LEN(buf_pool->free);
2019
1941
#ifdef UNIV_DEBUG
2020
1942
export_vars.innodb_buffer_pool_pages_latched
2021
1943
= buf_get_latched_pages_number();
2022
1944
#endif /* UNIV_DEBUG */
2023
export_vars.innodb_buffer_pool_pages_total = buf_pool_get_n_pages();
1945
export_vars.innodb_buffer_pool_pages_total = buf_pool->curr_size;
2025
export_vars.innodb_buffer_pool_pages_misc
2026
= buf_pool_get_n_pages() - LRU_len - free_len;
1947
export_vars.innodb_buffer_pool_pages_misc = buf_pool->curr_size
1948
- UT_LIST_GET_LEN(buf_pool->LRU)
1949
- UT_LIST_GET_LEN(buf_pool->free);
2027
1950
#ifdef HAVE_ATOMIC_BUILTINS
2028
1951
export_vars.innodb_have_atomic_builtins = 1;
2039
1962
export_vars.innodb_log_writes = srv_log_writes;
2040
1963
export_vars.innodb_dblwr_pages_written = srv_dblwr_pages_written;
2041
1964
export_vars.innodb_dblwr_writes = srv_dblwr_writes;
2042
export_vars.innodb_pages_created = stat.n_pages_created;
2043
export_vars.innodb_pages_read = stat.n_pages_read;
2044
export_vars.innodb_pages_written = stat.n_pages_written;
1965
export_vars.innodb_pages_created = buf_pool->stat.n_pages_created;
1966
export_vars.innodb_pages_read = buf_pool->stat.n_pages_read;
1967
export_vars.innodb_pages_written = buf_pool->stat.n_pages_written;
2045
1968
export_vars.innodb_row_lock_waits = srv_n_lock_wait_count;
2046
1969
export_vars.innodb_row_lock_current_waits
2047
1970
= srv_n_lock_wait_current_count;
2058
1981
export_vars.innodb_rows_inserted = srv_n_rows_inserted;
2059
1982
export_vars.innodb_rows_updated = srv_n_rows_updated;
2060
1983
export_vars.innodb_rows_deleted = srv_n_rows_deleted;
2061
export_vars.innodb_truncated_status_writes = srv_truncated_status_writes;
2063
1985
mutex_exit(&srv_innodb_monitor_mutex);
2066
1988
/*********************************************************************//**
2067
A thread which prints the info output by various InnoDB monitors.
1989
A thread which wakes up threads whose lock wait may have lasted too long.
1990
This also prints the info output by various InnoDB monitors.
2068
1991
@return a dummy parameter */
2070
1993
os_thread_ret_t
1994
srv_lock_timeout_and_monitor_thread(
1995
/*================================*/
2073
1996
void* arg __attribute__((unused)))
2074
1997
/*!< in: a dummy parameter required by
2075
1998
os_thread_create */
2077
2001
double time_elapsed;
2078
2002
time_t current_time;
2079
2003
time_t last_table_monitor_time;
2080
2004
time_t last_tablespace_monitor_time;
2081
2005
time_t last_monitor_time;
2082
ulint mutex_skipped;
2083
ibool last_srv_print_monitor;
2085
2010
#ifdef UNIV_DEBUG_THREAD_CREATION
2086
2011
fprintf(stderr, "Lock timeout thread starts, id %lu\n",
2087
2012
os_thread_pf(os_thread_get_curr_id()));
2090
#ifdef UNIV_PFS_THREAD
2091
pfs_register_thread(srv_monitor_thread_key);
2094
2014
UT_NOT_USED(arg);
2095
2015
srv_last_monitor_time = time(NULL);
2096
2016
last_table_monitor_time = time(NULL);
2097
2017
last_tablespace_monitor_time = time(NULL);
2098
2018
last_monitor_time = time(NULL);
2100
last_srv_print_monitor = srv_print_innodb_monitor;
2102
srv_monitor_active = TRUE;
2104
/* Wake up every 5 seconds to see if we need to print
2105
monitor information. */
2107
os_thread_sleep(5000000);
2020
srv_lock_timeout_and_monitor_active = TRUE;
2022
/* When someone is waiting for a lock, we wake up every second
2023
and check if a timeout has passed for a lock wait */
2025
os_thread_sleep(1000000);
2109
2027
current_time = time(NULL);
2114
2032
last_monitor_time = time(NULL);
2116
2034
if (srv_print_innodb_monitor) {
2117
/* Reset mutex_skipped counter everytime
2118
srv_print_innodb_monitor changes. This is to
2119
ensure we will not be blocked by kernel_mutex
2120
for short duration information printing,
2121
such as requested by sync_array_print_long_waits() */
2122
if (!last_srv_print_monitor) {
2124
last_srv_print_monitor = TRUE;
2127
if (!srv_printf_innodb_monitor(stderr,
2128
MUTEX_NOWAIT(mutex_skipped),
2132
/* Reset the counter */
2136
last_srv_print_monitor = FALSE;
2035
srv_printf_innodb_monitor(stderr, NULL, NULL);
2140
2038
if (srv_innodb_status) {
2141
2039
mutex_enter(&srv_monitor_file_mutex);
2142
2040
rewind(srv_monitor_file);
2143
if (!srv_printf_innodb_monitor(srv_monitor_file,
2144
MUTEX_NOWAIT(mutex_skipped),
2041
srv_printf_innodb_monitor(srv_monitor_file, NULL,
2151
2043
os_file_set_eof(srv_monitor_file);
2152
2044
mutex_exit(&srv_monitor_file_mutex);
2203
if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) {
2207
if (srv_print_innodb_monitor
2208
|| srv_print_innodb_lock_monitor
2209
|| srv_print_innodb_tablespace_monitor
2210
|| srv_print_innodb_table_monitor) {
2214
srv_monitor_active = FALSE;
2219
srv_monitor_active = FALSE;
2221
/* We count the number of threads in os_thread_exit(). A created
2222
thread should always use that to exit and not use return() to exit. */
2224
os_thread_exit(NULL);
2226
OS_THREAD_DUMMY_RETURN;
2229
/*********************************************************************//**
2230
A thread which wakes up threads whose lock wait may have lasted too long.
2231
@return a dummy parameter */
2234
srv_lock_timeout_thread(
2235
/*====================*/
2236
void* arg __attribute__((unused)))
2237
/* in: a dummy parameter required by
2245
#ifdef UNIV_PFS_THREAD
2246
pfs_register_thread(srv_lock_timeout_thread_key);
2250
/* When someone is waiting for a lock, we wake up every second
2251
and check if a timeout has passed for a lock wait */
2253
os_thread_sleep(1000000);
2255
srv_lock_timeout_active = TRUE;
2257
2095
mutex_enter(&kernel_mutex);
2259
2097
some_waits = FALSE;
2437
2275
OS_THREAD_DUMMY_RETURN;
2440
/**********************************************************************//**
2441
Check whether any background thread is active.
2442
@return FALSE if all are are suspended or have exited. */
2445
srv_is_any_background_thread_active(void)
2446
/*=====================================*/
2451
mutex_enter(&kernel_mutex);
2453
for (i = SRV_COM; i <= SRV_MASTER; ++i) {
2454
if (srv_n_threads_active[i] != 0) {
2460
mutex_exit(&kernel_mutex);
2465
2278
/*******************************************************************//**
2466
2279
Tells the InnoDB server that there has been activity in the database
2467
2280
and wakes up the master thread if it is suspended (not sleeping). Used
2468
2281
in the MySQL interface. Note that there is a small chance that the master
2469
thread stays suspended (we do not protect our operation with the
2470
srv_sys_t->mutex, for performance reasons). */
2282
thread stays suspended (we do not protect our operation with the kernel
2283
mutex, for performace reasons). */
2473
2286
srv_active_wake_master_thread(void)
2488
2301
/*******************************************************************//**
2489
Tells the purge thread that there has been activity in the database
2490
and wakes up the purge thread if it is suspended (not sleeping). Note
2491
that there is a small chance that the purge thread stays suspended
2492
(we do not protect our operation with the kernel mutex, for
2493
performace reasons). */
2496
srv_wake_purge_thread_if_not_active(void)
2497
/*=====================================*/
2499
ut_ad(!mutex_own(&kernel_mutex));
2501
if (srv_n_purge_threads > 0
2502
&& srv_n_threads_active[SRV_WORKER] == 0) {
2504
mutex_enter(&kernel_mutex);
2506
srv_release_threads(SRV_WORKER, 1);
2508
mutex_exit(&kernel_mutex);
2512
/*******************************************************************//**
2513
2302
Wakes up the master thread if it is suspended or being suspended. */
2525
2314
mutex_exit(&kernel_mutex);
2528
/*******************************************************************//**
2529
Wakes up the purge thread if it's not already awake. */
2532
srv_wake_purge_thread(void)
2533
/*=======================*/
2535
ut_ad(!mutex_own(&kernel_mutex));
2537
if (srv_n_purge_threads > 0) {
2539
mutex_enter(&kernel_mutex);
2541
srv_release_threads(SRV_WORKER, 1);
2543
mutex_exit(&kernel_mutex);
2547
2317
/**********************************************************************
2548
2318
The master thread is tasked to ensure that flush of log file happens
2549
2319
once every second in the background. This is to ensure that not more
2567
/********************************************************************//**
2568
Do a full purge, reconfigure the purge sub-system if a dynamic
2569
change is detected. */
2572
srv_master_do_purge(void)
2573
/*=====================*/
2575
ulint n_pages_purged;
2577
ut_ad(!mutex_own(&kernel_mutex));
2579
ut_a(srv_n_purge_threads == 0);
2582
/* Check for shutdown and change in purge config. */
2583
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2584
/* Nothing to purge. */
2587
n_pages_purged = trx_purge(srv_purge_batch_size);
2590
srv_sync_log_buffer_in_background();
2592
} while (n_pages_purged > 0);
2595
2337
/*********************************************************************//**
2596
2338
The master thread controlling the server.
2597
2339
@return a dummy parameter */
2664
2399
when there is database activity */
2666
2401
srv_last_log_flush_time = time(NULL);
2668
/* Sleep for 1 second on entrying the for loop below the first time. */
2669
next_itr_time = ut_time_ms() + 1000;
2671
2404
for (i = 0; i < 10; i++) {
2672
ulint cur_time = ut_time_ms();
2674
buf_get_total_stat(&buf_stat);
2676
n_ios_old = log_sys->n_log_ios + buf_stat.n_pages_read
2677
+ buf_stat.n_pages_written;
2405
n_ios_old = log_sys->n_log_ios + buf_pool->stat.n_pages_read
2406
+ buf_pool->stat.n_pages_written;
2679
2407
srv_main_thread_op_info = "sleeping";
2680
2408
srv_main_1_second_loops++;
2682
if (next_itr_time > cur_time) {
2684
/* Get sleep interval in micro seconds. We use
2685
ut_min() to avoid long sleep in case of
2687
os_thread_sleep(ut_min(1000000,
2688
(next_itr_time - cur_time)
2412
os_thread_sleep(1000000);
2690
2413
srv_main_sleeps++;
2693
/* Each iteration should happen at 1 second interval. */
2694
next_itr_time = ut_time_ms() + 1000;
2696
2418
/* ALTER TABLE in MySQL requires on Unix that the table handler
2697
2419
can drop tables lazily after there no longer are SELECT
2715
2437
log_free_check();
2717
2439
/* If i/os during one second sleep were less than 5% of
2718
capacity, we assume that there is free disk i/o capacity
2719
available, and it makes sense to do an insert buffer merge. */
2440
capacity, we assume that there is free disk i/o capacity
2441
available, and it makes sense to do an insert buffer merge. */
2721
buf_get_total_stat(&buf_stat);
2722
2443
n_pend_ios = buf_get_n_pending_ios()
2723
2444
+ log_sys->n_pending_writes;
2724
n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2725
+ buf_stat.n_pages_written;
2445
n_ios = log_sys->n_log_ios + buf_pool->stat.n_pages_read
2446
+ buf_pool->stat.n_pages_written;
2726
2447
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2727
2448
&& (n_ios - n_ios_old < SRV_RECENT_IO_ACTIVITY)) {
2728
2449
srv_main_thread_op_info = "doing insert buffer merge";
2741
2462
srv_main_thread_op_info =
2742
2463
"flushing buffer pool pages";
2743
n_pages_flushed = buf_flush_list(
2744
PCT_IO(100), IB_ULONGLONG_MAX);
2464
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2468
/* If we had to do the flush, it may have taken
2469
even more than 1 second, and also, there may be more
2470
to flush. Do not sleep 1 second during the next
2471
iteration of this loop. */
2746
2474
} else if (srv_adaptive_flushing) {
2748
2476
/* Try to keep the rate of flushing of dirty
2787
2517
loop above requests writes for that case. The writes done here
2788
2518
are not required, and may be disabled. */
2790
buf_get_total_stat(&buf_stat);
2791
2520
n_pend_ios = buf_get_n_pending_ios() + log_sys->n_pending_writes;
2792
n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2793
+ buf_stat.n_pages_written;
2521
n_ios = log_sys->n_log_ios + buf_pool->stat.n_pages_read
2522
+ buf_pool->stat.n_pages_written;
2795
2524
srv_main_10_second_loops++;
2796
2525
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2797
2526
&& (n_ios - n_ios_very_old < SRV_PAST_IO_ACTIVITY)) {
2799
2528
srv_main_thread_op_info = "flushing buffer pool pages";
2800
buf_flush_list(PCT_IO(100), IB_ULONGLONG_MAX);
2529
buf_flush_batch(BUF_FLUSH_LIST, PCT_IO(100),
2802
2532
/* Flush logs if needed */
2803
2533
srv_sync_log_buffer_in_background();
2812
2542
/* Flush logs if needed */
2813
2543
srv_sync_log_buffer_in_background();
2815
if (srv_n_purge_threads == 0) {
2816
srv_main_thread_op_info = "master purging";
2818
srv_master_do_purge();
2545
/* We run a full purge every 10 seconds, even if the server
2820
2549
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2822
2551
goto background_loop;
2554
srv_main_thread_op_info = "purging";
2555
n_pages_purged = trx_purge();
2557
/* Flush logs if needed */
2558
srv_sync_log_buffer_in_background();
2560
} while (n_pages_purged);
2826
2562
srv_main_thread_op_info = "flushing buffer pool pages";
2833
2569
(> 70 %), we assume we can afford reserving the disk(s) for
2834
2570
the time it requires to flush 100 pages */
2836
n_pages_flushed = buf_flush_list(
2837
PCT_IO(100), IB_ULONGLONG_MAX);
2572
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2839
2576
/* Otherwise, we only flush a small number of pages so that
2840
2577
we do not unnecessarily use much disk i/o capacity from
2843
n_pages_flushed = buf_flush_list(
2844
PCT_IO(10), IB_ULONGLONG_MAX);
2580
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2847
2585
srv_main_thread_op_info = "making checkpoint";
2888
2626
os_thread_sleep(100000);
2891
if (srv_n_purge_threads == 0) {
2892
srv_main_thread_op_info = "master purging";
2894
srv_master_do_purge();
2629
srv_main_thread_op_info = "purging";
2631
/* Run a full purge */
2633
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2638
srv_main_thread_op_info = "purging";
2639
n_pages_purged = trx_purge();
2641
/* Flush logs if needed */
2642
srv_sync_log_buffer_in_background();
2644
} while (n_pages_purged);
2897
2646
srv_main_thread_op_info = "reserving kernel mutex";
3048
2797
OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3052
/*********************************************************************//**
3053
Asynchronous purge thread.
3054
@return a dummy parameter */
3059
void* arg __attribute__((unused))) /*!< in: a dummy parameter
3060
required by os_thread_create */
3063
ulint slot_no = ULINT_UNDEFINED;
3064
ulint n_total_purged = ULINT_UNDEFINED;
3066
ut_a(srv_n_purge_threads == 1);
3068
#ifdef UNIV_DEBUG_THREAD_CREATION
3069
fprintf(stderr, "InnoDB: Purge thread running, id %lu\n",
3070
os_thread_pf(os_thread_get_curr_id()));
3071
#endif /* UNIV_DEBUG_THREAD_CREATION */
3073
mutex_enter(&kernel_mutex);
3075
slot_no = srv_table_reserve_slot(SRV_WORKER);
3077
slot = srv_table_get_nth_slot(slot_no);
3079
++srv_n_threads_active[SRV_WORKER];
3081
mutex_exit(&kernel_mutex);
3083
while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS) {
3085
ulint n_pages_purged;
3087
/* If there are very few records to purge or the last
3088
purge didn't purge any records then wait for activity.
3089
We peek at the history len without holding any mutex
3090
because in the worst case we will end up waiting for
3091
the next purge event. */
3092
if (trx_sys->rseg_history_len < srv_purge_batch_size
3093
|| n_total_purged == 0) {
3097
mutex_enter(&kernel_mutex);
3099
event = srv_suspend_thread();
3101
mutex_exit(&kernel_mutex);
3103
os_event_wait(event);
3106
/* Check for shutdown and whether we should do purge at all. */
3107
if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND
3108
|| srv_shutdown_state != 0
3109
|| srv_fast_shutdown) {
3116
/* Purge until there are no more records to purge and there is
3117
no change in configuration or server state. */
3119
n_pages_purged = trx_purge(srv_purge_batch_size);
3121
n_total_purged += n_pages_purged;
3123
} while (n_pages_purged > 0 && !srv_fast_shutdown);
3125
srv_sync_log_buffer_in_background();
3128
mutex_enter(&kernel_mutex);
3130
ut_ad(srv_table_get_nth_slot(slot_no) == slot);
3132
/* Decrement the active count. */
3133
srv_suspend_thread();
3135
slot->in_use = FALSE;
3137
/* Free the thread local memory. */
3138
thr_local_free(os_thread_get_curr_id());
3140
mutex_exit(&kernel_mutex);
3142
#ifdef UNIV_DEBUG_THREAD_CREATION
3143
fprintf(stderr, "InnoDB: Purge thread exiting, id %lu\n",
3144
os_thread_pf(os_thread_get_curr_id()));
3145
#endif /* UNIV_DEBUG_THREAD_CREATION */
3147
/* We count the number of threads in os_thread_exit(). A created
3148
thread should always use that to exit and not use return() to exit. */
3149
os_thread_exit(NULL);
3151
OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3154
/**********************************************************************//**
3155
Enqueues a task to server task queue and releases a worker thread, if there
3156
is a suspended one. */
3159
srv_que_task_enqueue_low(
3160
/*=====================*/
3161
que_thr_t* thr) /*!< in: query thread */
3165
mutex_enter(&kernel_mutex);
3167
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
3169
srv_release_threads(SRV_WORKER, 1);
3171
mutex_exit(&kernel_mutex);