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
153
on duplicate key checking and foreign key checking */
137
154
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
156
UNIV_INTERN ulint srv_n_data_files = 0;
161
157
UNIV_INTERN char** srv_data_file_names = NULL;
162
158
/* size in database pages */
191
187
the checkpoints. */
192
188
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
190
/* The sort order table of the MySQL latin1_swedish_ci character set
206
192
#if defined(BUILD_DRIZZLE)
207
193
UNIV_INTERN const byte srv_latin1_ordering[256] /* The sort order table of the latin1
488
471
/* Mutex for locking srv_monitor_file */
489
472
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
473
/* Temporary file for innodb monitor output */
505
474
UNIV_INTERN FILE* srv_monitor_file;
506
475
/* Mutex for locking srv_dict_tmpfile.
774
752
srv_main_1_second_loops, srv_main_sleeps,
775
753
srv_main_10_second_loops, srv_main_background_loops,
776
754
srv_main_flush_loops);
777
fprintf(file, "srv_master_thread log flush and writes: %lu\n",
778
srv_log_writes_and_flush);
755
fprintf(file, "srv_master_thread log flush and writes: %lu "
756
" log writes only: %lu\n",
757
srv_log_writes_and_flush, srv_log_buffer_writes);
781
/* The following values give info about the activity going on in
782
the database. They are protected by the server mutex. The arrays
783
are indexed by the type of the thread. */
785
UNIV_INTERN ulint srv_n_threads_active[SRV_MASTER + 1];
786
UNIV_INTERN ulint srv_n_threads[SRV_MASTER + 1];
788
760
/*********************************************************************//**
789
761
Sets the info describing an i/o thread current state. */
1016
988
srv_sys = mem_alloc(sizeof(srv_sys_t));
1018
990
kernel_mutex_temp = mem_alloc(sizeof(mutex_t));
1019
mutex_create(kernel_mutex_key, &kernel_mutex, SYNC_KERNEL);
991
mutex_create(&kernel_mutex, SYNC_KERNEL);
1021
mutex_create(srv_innodb_monitor_mutex_key,
1022
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
993
mutex_create(&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
1024
995
srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t));
1083
1054
/*********************************************************************//**
1084
Frees the data structures created in srv_init(). */
1055
Frees the OS fast mutex created in srv_init(). */
1090
1061
os_fast_mutex_free(&srv_conc_mutex);
1091
mem_free(srv_conc_slots);
1092
srv_conc_slots = NULL;
1094
mem_free(srv_sys->threads);
1098
mem_free(kernel_mutex_temp);
1099
kernel_mutex_temp = NULL;
1100
mem_free(srv_mysql_table);
1101
srv_mysql_table = NULL;
1103
trx_i_s_cache_free(trx_i_s_cache);
1106
1064
/*********************************************************************//**
1620
1576
row_mysql_unfreeze_data_dictionary(trx);
1622
1578
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
1579
/* Release fast index creation latch */
1636
1580
row_mysql_unlock_data_dictionary(trx);
1783
1716
/******************************************************************//**
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 */
1717
Outputs to a file the output of the InnoDB Monitor. */
1789
1720
srv_printf_innodb_monitor(
1790
1721
/*======================*/
1791
1722
FILE* file, /*!< in: output stream */
1792
ibool nowait, /*!< in: whether to wait for kernel mutex */
1793
1723
ulint* trx_start, /*!< out: file position of the start of
1794
1724
the list of active transactions */
1795
1725
ulint* trx_end) /*!< out: file position of the end of
1849
1778
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;
1780
lock_print_info_summary(file);
1782
long t = ftell(file);
1784
*trx_start = ULINT_UNDEFINED;
1786
*trx_start = (ulint) t;
1789
lock_print_info_all_transactions(file);
1791
long t = ftell(file);
1793
*trx_end = ULINT_UNDEFINED;
1795
*trx_end = (ulint) t;
1876
1798
fputs("--------\n"
1878
1800
"--------\n", file);
2003
1915
export_vars.innodb_data_reads = os_n_file_reads;
2004
1916
export_vars.innodb_data_writes = os_n_file_writes;
2005
1917
export_vars.innodb_data_written = srv_data_written;
2006
export_vars.innodb_buffer_pool_read_requests = stat.n_page_gets;
1918
export_vars.innodb_buffer_pool_read_requests = buf_pool->n_page_gets;
2007
1919
export_vars.innodb_buffer_pool_write_requests
2008
1920
= srv_buf_pool_write_requests;
2009
1921
export_vars.innodb_buffer_pool_wait_free = srv_buf_pool_wait_free;
2010
1922
export_vars.innodb_buffer_pool_pages_flushed = srv_buf_pool_flushed;
2011
1923
export_vars.innodb_buffer_pool_reads = srv_buf_pool_reads;
2012
export_vars.innodb_buffer_pool_read_ahead
2013
= stat.n_ra_pages_read;
2014
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;
1924
export_vars.innodb_buffer_pool_read_ahead_rnd = srv_read_ahead_rnd;
1925
export_vars.innodb_buffer_pool_read_ahead_seq = srv_read_ahead_seq;
1926
export_vars.innodb_buffer_pool_pages_data
1927
= UT_LIST_GET_LEN(buf_pool->LRU);
1928
export_vars.innodb_buffer_pool_pages_dirty
1929
= UT_LIST_GET_LEN(buf_pool->flush_list);
1930
export_vars.innodb_buffer_pool_pages_free
1931
= UT_LIST_GET_LEN(buf_pool->free);
2019
1932
#ifdef UNIV_DEBUG
2020
1933
export_vars.innodb_buffer_pool_pages_latched
2021
1934
= buf_get_latched_pages_number();
2022
1935
#endif /* UNIV_DEBUG */
2023
export_vars.innodb_buffer_pool_pages_total = buf_pool_get_n_pages();
1936
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;
1938
export_vars.innodb_buffer_pool_pages_misc = buf_pool->curr_size
1939
- UT_LIST_GET_LEN(buf_pool->LRU)
1940
- UT_LIST_GET_LEN(buf_pool->free);
2027
1941
#ifdef HAVE_ATOMIC_BUILTINS
2028
1942
export_vars.innodb_have_atomic_builtins = 1;
2039
1953
export_vars.innodb_log_writes = srv_log_writes;
2040
1954
export_vars.innodb_dblwr_pages_written = srv_dblwr_pages_written;
2041
1955
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;
1956
export_vars.innodb_pages_created = buf_pool->n_pages_created;
1957
export_vars.innodb_pages_read = buf_pool->n_pages_read;
1958
export_vars.innodb_pages_written = buf_pool->n_pages_written;
2045
1959
export_vars.innodb_row_lock_waits = srv_n_lock_wait_count;
2046
1960
export_vars.innodb_row_lock_current_waits
2047
1961
= srv_n_lock_wait_current_count;
2058
1972
export_vars.innodb_rows_inserted = srv_n_rows_inserted;
2059
1973
export_vars.innodb_rows_updated = srv_n_rows_updated;
2060
1974
export_vars.innodb_rows_deleted = srv_n_rows_deleted;
2061
export_vars.innodb_truncated_status_writes = srv_truncated_status_writes;
2063
1976
mutex_exit(&srv_innodb_monitor_mutex);
2066
1979
/*********************************************************************//**
2067
A thread which prints the info output by various InnoDB monitors.
1980
A thread which wakes up threads whose lock wait may have lasted too long.
1981
This also prints the info output by various InnoDB monitors.
2068
1982
@return a dummy parameter */
2070
1984
os_thread_ret_t
1985
srv_lock_timeout_and_monitor_thread(
1986
/*================================*/
2073
1987
void* arg __attribute__((unused)))
2074
1988
/*!< in: a dummy parameter required by
2075
1989
os_thread_create */
2077
1992
double time_elapsed;
2078
1993
time_t current_time;
2079
1994
time_t last_table_monitor_time;
2080
1995
time_t last_tablespace_monitor_time;
2081
1996
time_t last_monitor_time;
2082
ulint mutex_skipped;
2083
ibool last_srv_print_monitor;
2085
2001
#ifdef UNIV_DEBUG_THREAD_CREATION
2086
2002
fprintf(stderr, "Lock timeout thread starts, id %lu\n",
2087
2003
os_thread_pf(os_thread_get_curr_id()));
2090
#ifdef UNIV_PFS_THREAD
2091
pfs_register_thread(srv_monitor_thread_key);
2094
2005
UT_NOT_USED(arg);
2095
2006
srv_last_monitor_time = time(NULL);
2096
2007
last_table_monitor_time = time(NULL);
2097
2008
last_tablespace_monitor_time = time(NULL);
2098
2009
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);
2011
srv_lock_timeout_and_monitor_active = TRUE;
2013
/* When someone is waiting for a lock, we wake up every second
2014
and check if a timeout has passed for a lock wait */
2016
os_thread_sleep(1000000);
2109
2018
current_time = time(NULL);
2114
2023
last_monitor_time = time(NULL);
2116
2025
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;
2026
srv_printf_innodb_monitor(stderr, NULL, NULL);
2140
2029
if (srv_innodb_status) {
2141
2030
mutex_enter(&srv_monitor_file_mutex);
2142
2031
rewind(srv_monitor_file);
2143
if (!srv_printf_innodb_monitor(srv_monitor_file,
2144
MUTEX_NOWAIT(mutex_skipped),
2032
srv_printf_innodb_monitor(srv_monitor_file, NULL,
2151
2034
os_file_set_eof(srv_monitor_file);
2152
2035
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
2086
mutex_enter(&kernel_mutex);
2259
2088
some_waits = FALSE;
2437
2266
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
2269
/*******************************************************************//**
2466
2270
Tells the InnoDB server that there has been activity in the database
2467
2271
and wakes up the master thread if it is suspended (not sleeping). Used
2468
2272
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). */
2273
thread stays suspended (we do not protect our operation with the kernel
2274
mutex, for performace reasons). */
2473
2277
srv_active_wake_master_thread(void)
2488
2292
/*******************************************************************//**
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
2293
Wakes up the master thread if it is suspended or being suspended. */
2525
2305
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
2308
/**********************************************************************
2548
2309
The master thread is tasked to ensure that flush of log file happens
2549
2310
once every second in the background. This is to ensure that not more
2561
2322
log_buffer_sync_in_background(TRUE);
2562
2323
srv_last_log_flush_time = current_time;
2563
2324
srv_log_writes_and_flush++;
2326
/* Actually we don't need to write logs here.
2327
We are just being extra safe here by forcing
2328
the log buffer to log file. */
2329
log_buffer_sync_in_background(FALSE);
2330
srv_log_buffer_writes++;
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
2334
/*********************************************************************//**
2596
2335
The master thread controlling the server.
2597
2336
@return a dummy parameter */
2664
2396
when there is database activity */
2666
2398
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
2401
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;
2402
n_ios_old = log_sys->n_log_ios + buf_pool->n_pages_read
2403
+ buf_pool->n_pages_written;
2679
2404
srv_main_thread_op_info = "sleeping";
2680
2405
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)
2409
os_thread_sleep(1000000);
2690
2410
srv_main_sleeps++;
2693
/* Each iteration should happen at 1 second interval. */
2694
next_itr_time = ut_time_ms() + 1000;
2696
2415
/* ALTER TABLE in MySQL requires on Unix that the table handler
2697
2416
can drop tables lazily after there no longer are SELECT
2715
2434
log_free_check();
2717
2436
/* 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. */
2437
capacity, we assume that there is free disk i/o capacity
2438
available, and it makes sense to do an insert buffer merge. */
2721
buf_get_total_stat(&buf_stat);
2722
2440
n_pend_ios = buf_get_n_pending_ios()
2723
2441
+ log_sys->n_pending_writes;
2724
n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2725
+ buf_stat.n_pages_written;
2442
n_ios = log_sys->n_log_ios + buf_pool->n_pages_read
2443
+ buf_pool->n_pages_written;
2726
2444
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2727
2445
&& (n_ios - n_ios_old < SRV_RECENT_IO_ACTIVITY)) {
2728
2446
srv_main_thread_op_info = "doing insert buffer merge";
2738
2456
/* Try to keep the number of modified pages in the
2739
2457
buffer pool under the limit wished by the user */
2741
srv_main_thread_op_info =
2742
"flushing buffer pool pages";
2743
n_pages_flushed = buf_flush_list(
2744
PCT_IO(100), IB_ULONGLONG_MAX);
2459
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2463
/* If we had to do the flush, it may have taken
2464
even more than 1 second, and also, there may be more
2465
to flush. Do not sleep 1 second during the next
2466
iteration of this loop. */
2746
2469
} else if (srv_adaptive_flushing) {
2748
2471
/* Try to keep the rate of flushing of dirty
2787
2510
loop above requests writes for that case. The writes done here
2788
2511
are not required, and may be disabled. */
2790
buf_get_total_stat(&buf_stat);
2791
2513
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;
2514
n_ios = log_sys->n_log_ios + buf_pool->n_pages_read
2515
+ buf_pool->n_pages_written;
2795
2517
srv_main_10_second_loops++;
2796
2518
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2797
2519
&& (n_ios - n_ios_very_old < SRV_PAST_IO_ACTIVITY)) {
2799
2521
srv_main_thread_op_info = "flushing buffer pool pages";
2800
buf_flush_list(PCT_IO(100), IB_ULONGLONG_MAX);
2522
buf_flush_batch(BUF_FLUSH_LIST, PCT_IO(100),
2802
2525
/* Flush logs if needed */
2803
2526
srv_sync_log_buffer_in_background();
2812
2535
/* Flush logs if needed */
2813
2536
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();
2538
/* We run a full purge every 10 seconds, even if the server
2820
2542
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2822
2544
goto background_loop;
2547
srv_main_thread_op_info = "purging";
2548
n_pages_purged = trx_purge();
2550
/* Flush logs if needed */
2551
srv_sync_log_buffer_in_background();
2553
} while (n_pages_purged);
2826
2555
srv_main_thread_op_info = "flushing buffer pool pages";
2833
2562
(> 70 %), we assume we can afford reserving the disk(s) for
2834
2563
the time it requires to flush 100 pages */
2836
n_pages_flushed = buf_flush_list(
2837
PCT_IO(100), IB_ULONGLONG_MAX);
2565
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2839
2569
/* Otherwise, we only flush a small number of pages so that
2840
2570
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);
2573
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2847
2578
srv_main_thread_op_info = "making checkpoint";
2888
2619
os_thread_sleep(100000);
2891
if (srv_n_purge_threads == 0) {
2892
srv_main_thread_op_info = "master purging";
2894
srv_master_do_purge();
2622
srv_main_thread_op_info = "purging";
2624
/* Run a full purge */
2626
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2631
srv_main_thread_op_info = "purging";
2632
n_pages_purged = trx_purge();
2634
/* Flush logs if needed */
2635
srv_sync_log_buffer_in_background();
2637
} while (n_pages_purged);
2897
2639
srv_main_thread_op_info = "reserving kernel mutex";
3048
2790
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);