1
1
/*****************************************************************************
3
Copyright (C) 1995, 2010, Innobase Oy. All Rights Reserved.
4
Copyright (C) 2008, 2009 Google Inc.
5
Copyright (C) 2009, Percona Inc.
3
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
4
Copyright (c) 2008, 2009 Google 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
26
18
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
28
20
You should have received a copy of the GNU General Public License along with
29
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
30
St, Fifth Floor, Boston, MA 02110-1301 USA
21
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22
Place, Suite 330, Boston, MA 02111-1307 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
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
50
***********************************************************************/
34
52
/**************************************************//**
35
53
@file srv/srv0srv.c
103
118
in microseconds, in order to reduce the lagging of the purge thread. */
104
119
UNIV_INTERN ulint srv_dml_needed_delay = 0;
106
UNIV_INTERN ibool srv_lock_timeout_active = FALSE;
107
UNIV_INTERN ibool srv_monitor_active = FALSE;
121
UNIV_INTERN ibool srv_lock_timeout_and_monitor_active = FALSE;
108
122
UNIV_INTERN ibool srv_error_monitor_active = FALSE;
110
124
UNIV_INTERN const char* srv_main_thread_op_info = "";
126
/** Prefix used by MySQL to indicate pre-5.1 table name encoding */
127
UNIV_INTERN const char srv_mysql50_table_name_prefix[9] = "#mysql50#";
112
129
/* Server parameters which are read from the initfile */
114
131
/* The following three are dir paths which are catenated before file
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
const byte srv_latin1_ordering[256] /* The sort order table of the latin1
193
UNIV_INTERN const byte srv_latin1_ordering[256] /* The sort order table of the latin1
208
194
character set. The following table is
209
195
the MySQL order as of Feb 10th, 2002 */
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 protect writing the commit_id to the sys header */
495
UNIV_INTERN mysql_pfs_key_t commit_id_mutex_key;
496
/* Key to register srv_innodb_monitor_mutex with performance schema */
497
UNIV_INTERN mysql_pfs_key_t srv_innodb_monitor_mutex_key;
498
/* Key to register srv_monitor_file_mutex with performance schema */
499
UNIV_INTERN mysql_pfs_key_t srv_monitor_file_mutex_key;
500
/* Key to register srv_dict_tmpfile_mutex with performance schema */
501
UNIV_INTERN mysql_pfs_key_t srv_dict_tmpfile_mutex_key;
502
/* Key to register the mutex with performance schema */
503
UNIV_INTERN mysql_pfs_key_t srv_misc_tmpfile_mutex_key;
504
#endif /* UNIV_PFS_MUTEX */
506
473
/* Temporary file for innodb monitor output */
507
474
UNIV_INTERN FILE* srv_monitor_file;
508
475
/* Mutex for locking srv_dict_tmpfile.
785
752
srv_main_1_second_loops, srv_main_sleeps,
786
753
srv_main_10_second_loops, srv_main_background_loops,
787
754
srv_main_flush_loops);
788
fprintf(file, "srv_master_thread log flush and writes: %lu\n",
789
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);
792
/* The following values give info about the activity going on in
793
the database. They are protected by the server mutex. The arrays
794
are indexed by the type of the thread. */
796
UNIV_INTERN ulint srv_n_threads_active[SRV_MASTER + 1];
797
UNIV_INTERN ulint srv_n_threads[SRV_MASTER + 1];
799
760
/*********************************************************************//**
800
761
Sets the info describing an i/o thread current state. */
1026
985
srv_slot_t* slot;
1029
srv_sys = static_cast<srv_sys_t *>(mem_alloc(sizeof(srv_sys_t)));
1031
kernel_mutex_temp = static_cast<ib_mutex_t *>(mem_alloc(sizeof(mutex_t)));
1032
mutex_create(kernel_mutex_key, &kernel_mutex, SYNC_KERNEL);
1034
commit_id_mutex_temp = static_cast<ib_mutex_t *>(mem_alloc(sizeof(mutex_t)));
1035
mutex_create(commit_id_mutex_key, &commit_id_mutex, SYNC_COMMIT_ID_LOCK);
1037
mutex_create(srv_innodb_monitor_mutex_key,
1038
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
1040
srv_sys->threads = static_cast<srv_table_t *>(mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t)));
988
srv_sys = mem_alloc(sizeof(srv_sys_t));
990
kernel_mutex_temp = mem_alloc(sizeof(mutex_t));
991
mutex_create(&kernel_mutex, SYNC_KERNEL);
993
mutex_create(&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
995
srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t));
1042
997
for (i = 0; i < OS_THREAD_MAX_N; i++) {
1043
998
slot = srv_table_get_nth_slot(i);
1105
1054
/*********************************************************************//**
1106
Frees the data structures created in srv_init(). */
1055
Frees the OS fast mutex created in srv_init(). */
1112
1061
os_fast_mutex_free(&srv_conc_mutex);
1113
mem_free(srv_conc_slots);
1114
srv_conc_slots = NULL;
1116
mem_free(srv_sys->threads);
1120
mem_free(kernel_mutex_temp);
1121
kernel_mutex_temp = NULL;
1122
mem_free(srv_mysql_table);
1123
srv_mysql_table = NULL;
1125
mem_free(commit_id_mutex_temp);
1126
commit_id_mutex_temp = NULL;
1128
trx_i_s_cache_free(trx_i_s_cache);
1131
1064
/*********************************************************************//**
1645
1576
row_mysql_unfreeze_data_dictionary(trx);
1647
1578
case RW_X_LATCH:
1648
/* There should never be a lock wait when the
1649
dictionary latch is reserved in X mode. Dictionary
1650
transactions should only acquire locks on dictionary
1651
tables, not other tables. All access to dictionary
1652
tables should be covered by dictionary
1654
ut_print_timestamp(stderr);
1655
fputs(" InnoDB: Error: dict X latch held in "
1656
"srv_suspend_mysql_thread\n", stderr);
1657
/* This should never occur. This incorrect handling
1658
was added in the early development of
1659
ha_innobase::add_index() in InnoDB Plugin 1.0. */
1660
1579
/* Release fast index creation latch */
1661
1580
row_mysql_unlock_data_dictionary(trx);
1808
1716
/******************************************************************//**
1809
Outputs to a file the output of the InnoDB Monitor.
1810
@return FALSE if not all information printed
1811
due to failure to obtain necessary mutex */
1717
Outputs to a file the output of the InnoDB Monitor. */
1814
1720
srv_printf_innodb_monitor(
1815
1721
/*======================*/
1816
1722
FILE* file, /*!< in: output stream */
1817
ibool nowait, /*!< in: whether to wait for kernel mutex */
1818
1723
ulint* trx_start, /*!< out: file position of the start of
1819
1724
the list of active transactions */
1820
1725
ulint* trx_end) /*!< out: file position of the end of
1874
1778
mutex_exit(&dict_foreign_err_mutex);
1876
/* Only if lock_print_info_summary proceeds correctly,
1877
before we call the lock_print_info_all_transactions
1878
to print all the lock information. */
1879
ret = lock_print_info_summary(file, nowait);
1883
long t = ftell(file);
1885
*trx_start = ULINT_UNDEFINED;
1887
*trx_start = (ulint) t;
1890
lock_print_info_all_transactions(file);
1892
long t = ftell(file);
1894
*trx_end = ULINT_UNDEFINED;
1896
*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;
1901
1798
fputs("--------\n"
1903
1800
"--------\n", file);
2028
1915
export_vars.innodb_data_reads = os_n_file_reads;
2029
1916
export_vars.innodb_data_writes = os_n_file_writes;
2030
1917
export_vars.innodb_data_written = srv_data_written;
2031
export_vars.innodb_buffer_pool_read_requests = stat.n_page_gets;
1918
export_vars.innodb_buffer_pool_read_requests = buf_pool->n_page_gets;
2032
1919
export_vars.innodb_buffer_pool_write_requests
2033
1920
= srv_buf_pool_write_requests;
2034
1921
export_vars.innodb_buffer_pool_wait_free = srv_buf_pool_wait_free;
2035
1922
export_vars.innodb_buffer_pool_pages_flushed = srv_buf_pool_flushed;
2036
1923
export_vars.innodb_buffer_pool_reads = srv_buf_pool_reads;
2037
export_vars.innodb_buffer_pool_read_ahead
2038
= stat.n_ra_pages_read;
2039
export_vars.innodb_buffer_pool_read_ahead_evicted
2040
= stat.n_ra_pages_evicted;
2041
export_vars.innodb_buffer_pool_pages_data = LRU_len;
2042
export_vars.innodb_buffer_pool_pages_dirty = flush_list_len;
2043
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);
2044
1932
#ifdef UNIV_DEBUG
2045
1933
export_vars.innodb_buffer_pool_pages_latched
2046
1934
= buf_get_latched_pages_number();
2047
1935
#endif /* UNIV_DEBUG */
2048
export_vars.innodb_buffer_pool_pages_total = buf_pool_get_n_pages();
1936
export_vars.innodb_buffer_pool_pages_total = buf_pool->curr_size;
2050
export_vars.innodb_buffer_pool_pages_misc
2051
= 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);
2052
1941
#ifdef HAVE_ATOMIC_BUILTINS
2053
1942
export_vars.innodb_have_atomic_builtins = 1;
2064
1953
export_vars.innodb_log_writes = srv_log_writes;
2065
1954
export_vars.innodb_dblwr_pages_written = srv_dblwr_pages_written;
2066
1955
export_vars.innodb_dblwr_writes = srv_dblwr_writes;
2067
export_vars.innodb_pages_created = stat.n_pages_created;
2068
export_vars.innodb_pages_read = stat.n_pages_read;
2069
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;
2070
1959
export_vars.innodb_row_lock_waits = srv_n_lock_wait_count;
2071
1960
export_vars.innodb_row_lock_current_waits
2072
1961
= srv_n_lock_wait_current_count;
2083
1972
export_vars.innodb_rows_inserted = srv_n_rows_inserted;
2084
1973
export_vars.innodb_rows_updated = srv_n_rows_updated;
2085
1974
export_vars.innodb_rows_deleted = srv_n_rows_deleted;
2086
export_vars.innodb_truncated_status_writes = srv_truncated_status_writes;
2088
1976
mutex_exit(&srv_innodb_monitor_mutex);
2091
1979
/*********************************************************************//**
2092
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.
2093
1982
@return a dummy parameter */
2095
1984
os_thread_ret_t
2098
void* /*arg __attribute__((unused))*/)
1985
srv_lock_timeout_and_monitor_thread(
1986
/*================================*/
1987
void* arg __attribute__((unused)))
2099
1988
/*!< in: a dummy parameter required by
2100
1989
os_thread_create */
2102
ib_int64_t sig_count;
2103
1992
double time_elapsed;
2104
1993
time_t current_time;
2105
1994
time_t last_table_monitor_time;
2106
1995
time_t last_tablespace_monitor_time;
2107
1996
time_t last_monitor_time;
2108
ulint mutex_skipped;
2109
ibool last_srv_print_monitor;
2111
2001
#ifdef UNIV_DEBUG_THREAD_CREATION
2112
2002
fprintf(stderr, "Lock timeout thread starts, id %lu\n",
2113
2003
os_thread_pf(os_thread_get_curr_id()));
2116
#ifdef UNIV_PFS_THREAD
2117
pfs_register_thread(srv_monitor_thread_key);
2120
srv_last_monitor_time = ut_time();
2121
last_table_monitor_time = ut_time();
2122
last_tablespace_monitor_time = ut_time();
2123
last_monitor_time = ut_time();
2125
last_srv_print_monitor = srv_print_innodb_monitor;
2006
srv_last_monitor_time = time(NULL);
2007
last_table_monitor_time = time(NULL);
2008
last_tablespace_monitor_time = time(NULL);
2009
last_monitor_time = time(NULL);
2127
srv_monitor_active = TRUE;
2129
/* Wake up every 5 seconds to see if we need to print
2130
monitor information or if signalled at shutdown. */
2132
sig_count = os_event_reset(srv_monitor_event);
2134
os_event_wait_time_low(srv_monitor_event, 5000000, sig_count);
2136
current_time = ut_time();
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);
2018
current_time = time(NULL);
2138
2020
time_elapsed = difftime(current_time, last_monitor_time);
2140
2022
if (time_elapsed > 15) {
2141
last_monitor_time = ut_time();
2023
last_monitor_time = time(NULL);
2143
2025
if (srv_print_innodb_monitor) {
2144
/* Reset mutex_skipped counter everytime
2145
srv_print_innodb_monitor changes. This is to
2146
ensure we will not be blocked by kernel_mutex
2147
for short duration information printing,
2148
such as requested by sync_array_print_long_waits() */
2149
if (!last_srv_print_monitor) {
2151
last_srv_print_monitor = TRUE;
2154
if (!srv_printf_innodb_monitor(stderr,
2155
MUTEX_NOWAIT(mutex_skipped),
2159
/* Reset the counter */
2163
last_srv_print_monitor = FALSE;
2026
srv_printf_innodb_monitor(stderr, NULL, NULL);
2167
2029
if (srv_innodb_status) {
2168
2030
mutex_enter(&srv_monitor_file_mutex);
2169
2031
rewind(srv_monitor_file);
2170
if (!srv_printf_innodb_monitor(srv_monitor_file,
2171
MUTEX_NOWAIT(mutex_skipped),
2032
srv_printf_innodb_monitor(srv_monitor_file, NULL,
2178
2034
os_file_set_eof(srv_monitor_file);
2179
2035
mutex_exit(&srv_monitor_file_mutex);
2230
if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) {
2234
if (srv_print_innodb_monitor
2235
|| srv_print_innodb_lock_monitor
2236
|| srv_print_innodb_tablespace_monitor
2237
|| srv_print_innodb_table_monitor) {
2241
srv_monitor_active = FALSE;
2246
srv_monitor_active = FALSE;
2248
/* We count the number of threads in os_thread_exit(). A created
2249
thread should always use that to exit and not use return() to exit. */
2251
os_thread_exit(NULL);
2253
OS_THREAD_DUMMY_RETURN;
2256
/*********************************************************************//**
2257
A thread which wakes up threads whose lock wait may have lasted too long.
2258
@return a dummy parameter */
2261
srv_lock_timeout_thread(
2262
/*====================*/
2263
void* /*arg __attribute__((unused))*/)
2264
/* in: a dummy parameter required by
2271
ib_int64_t sig_count;
2273
#ifdef UNIV_PFS_THREAD
2274
pfs_register_thread(srv_lock_timeout_thread_key);
2279
/* When someone is waiting for a lock, we wake up every second
2280
and check if a timeout has passed for a lock wait */
2282
sig_count = os_event_reset(srv_timeout_event);
2284
os_event_wait_time_low(srv_timeout_event, 1000000, sig_count);
2286
srv_lock_timeout_active = TRUE;
2288
2086
mutex_enter(&kernel_mutex);
2290
2088
some_waits = FALSE;
2467
2266
OS_THREAD_DUMMY_RETURN;
2470
/**********************************************************************//**
2471
Check whether any background thread is active.
2472
@return FALSE if all are are suspended or have exited. */
2475
srv_is_any_background_thread_active(void)
2476
/*=====================================*/
2481
mutex_enter(&kernel_mutex);
2483
for (i = SRV_COM; i <= SRV_MASTER; ++i) {
2484
if (srv_n_threads_active[i] != 0) {
2490
mutex_exit(&kernel_mutex);
2495
2269
/*******************************************************************//**
2496
2270
Tells the InnoDB server that there has been activity in the database
2497
2271
and wakes up the master thread if it is suspended (not sleeping). Used
2498
2272
in the MySQL interface. Note that there is a small chance that the master
2499
thread stays suspended (we do not protect our operation with the
2500
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). */
2503
2277
srv_active_wake_master_thread(void)
2518
2292
/*******************************************************************//**
2519
Tells the purge thread that there has been activity in the database
2520
and wakes up the purge thread if it is suspended (not sleeping). Note
2521
that there is a small chance that the purge thread stays suspended
2522
(we do not protect our operation with the kernel mutex, for
2523
performace reasons). */
2526
srv_wake_purge_thread_if_not_active(void)
2527
/*=====================================*/
2529
ut_ad(!mutex_own(&kernel_mutex));
2531
if (srv_n_purge_threads > 0
2532
&& srv_n_threads_active[SRV_WORKER] == 0) {
2534
mutex_enter(&kernel_mutex);
2536
srv_release_threads(SRV_WORKER, 1);
2538
mutex_exit(&kernel_mutex);
2542
/*******************************************************************//**
2543
2293
Wakes up the master thread if it is suspended or being suspended. */
2555
2305
mutex_exit(&kernel_mutex);
2558
/*******************************************************************//**
2559
Wakes up the purge thread if it's not already awake. */
2562
srv_wake_purge_thread(void)
2563
/*=======================*/
2565
ut_ad(!mutex_own(&kernel_mutex));
2567
if (srv_n_purge_threads > 0) {
2569
mutex_enter(&kernel_mutex);
2571
srv_release_threads(SRV_WORKER, 1);
2573
mutex_exit(&kernel_mutex);
2577
2308
/**********************************************************************
2578
2309
The master thread is tasked to ensure that flush of log file happens
2579
2310
once every second in the background. This is to ensure that not more
2591
2322
log_buffer_sync_in_background(TRUE);
2592
2323
srv_last_log_flush_time = current_time;
2593
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++;
2597
/********************************************************************//**
2598
Do a full purge, reconfigure the purge sub-system if a dynamic
2599
change is detected. */
2602
srv_master_do_purge(void)
2603
/*=====================*/
2605
ulint n_pages_purged;
2607
ut_ad(!mutex_own(&kernel_mutex));
2609
ut_a(srv_n_purge_threads == 0);
2612
/* Check for shutdown and change in purge config. */
2613
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2614
/* Nothing to purge. */
2617
n_pages_purged = trx_purge(srv_purge_batch_size);
2620
srv_sync_log_buffer_in_background();
2622
} while (n_pages_purged > 0);
2625
2334
/*********************************************************************//**
2626
2335
The master thread controlling the server.
2627
2336
@return a dummy parameter */
2694
2396
when there is database activity */
2696
2398
srv_last_log_flush_time = time(NULL);
2698
/* Sleep for 1 second on entrying the for loop below the first time. */
2699
next_itr_time = ut_time_ms() + 1000;
2701
2401
for (i = 0; i < 10; i++) {
2702
ulint cur_time = ut_time_ms();
2402
n_ios_old = log_sys->n_log_ios + buf_pool->n_pages_read
2403
+ buf_pool->n_pages_written;
2404
srv_main_thread_op_info = "sleeping";
2405
srv_main_1_second_loops++;
2409
os_thread_sleep(1000000);
2704
2415
/* ALTER TABLE in MySQL requires on Unix that the table handler
2705
2416
can drop tables lazily after there no longer are SELECT
2716
2427
goto background_loop;
2719
buf_get_total_stat(&buf_stat);
2721
n_ios_old = log_sys->n_log_ios + buf_stat.n_pages_read
2722
+ buf_stat.n_pages_written;
2724
srv_main_thread_op_info = "sleeping";
2725
srv_main_1_second_loops++;
2727
if (next_itr_time > cur_time
2728
&& srv_shutdown_state == SRV_SHUTDOWN_NONE) {
2730
/* Get sleep interval in micro seconds. We use
2731
ut_min() to avoid long sleep in case of
2733
os_thread_sleep(ut_min(1000000,
2734
(next_itr_time - cur_time)
2739
/* Each iteration should happen at 1 second interval. */
2740
next_itr_time = ut_time_ms() + 1000;
2742
2430
/* Flush logs if needed */
2743
2431
srv_sync_log_buffer_in_background();
2746
2434
log_free_check();
2748
2436
/* If i/os during one second sleep were less than 5% of
2749
capacity, we assume that there is free disk i/o capacity
2750
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. */
2752
buf_get_total_stat(&buf_stat);
2753
2440
n_pend_ios = buf_get_n_pending_ios()
2754
2441
+ log_sys->n_pending_writes;
2755
n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2756
+ buf_stat.n_pages_written;
2442
n_ios = log_sys->n_log_ios + buf_pool->n_pages_read
2443
+ buf_pool->n_pages_written;
2757
2444
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2758
2445
&& (n_ios - n_ios_old < SRV_RECENT_IO_ACTIVITY)) {
2759
2446
srv_main_thread_op_info = "doing insert buffer merge";
2769
2456
/* Try to keep the number of modified pages in the
2770
2457
buffer pool under the limit wished by the user */
2772
srv_main_thread_op_info =
2773
"flushing buffer pool pages";
2774
n_pages_flushed = buf_flush_list(
2775
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. */
2777
2469
} else if (srv_adaptive_flushing) {
2779
2471
/* Try to keep the rate of flushing of dirty
2818
2510
loop above requests writes for that case. The writes done here
2819
2511
are not required, and may be disabled. */
2821
buf_get_total_stat(&buf_stat);
2822
2513
n_pend_ios = buf_get_n_pending_ios() + log_sys->n_pending_writes;
2823
n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2824
+ buf_stat.n_pages_written;
2514
n_ios = log_sys->n_log_ios + buf_pool->n_pages_read
2515
+ buf_pool->n_pages_written;
2826
2517
srv_main_10_second_loops++;
2827
2518
if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2828
2519
&& (n_ios - n_ios_very_old < SRV_PAST_IO_ACTIVITY)) {
2830
2521
srv_main_thread_op_info = "flushing buffer pool pages";
2831
buf_flush_list(PCT_IO(100), IB_ULONGLONG_MAX);
2522
buf_flush_batch(BUF_FLUSH_LIST, PCT_IO(100),
2833
2525
/* Flush logs if needed */
2834
2526
srv_sync_log_buffer_in_background();
2843
2535
/* Flush logs if needed */
2844
2536
srv_sync_log_buffer_in_background();
2846
if (srv_n_purge_threads == 0) {
2847
srv_main_thread_op_info = "master purging";
2849
srv_master_do_purge();
2538
/* We run a full purge every 10 seconds, even if the server
2851
2542
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2853
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);
2857
2555
srv_main_thread_op_info = "flushing buffer pool pages";
2864
2562
(> 70 %), we assume we can afford reserving the disk(s) for
2865
2563
the time it requires to flush 100 pages */
2867
n_pages_flushed = buf_flush_list(
2868
PCT_IO(100), IB_ULONGLONG_MAX);
2565
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2870
2569
/* Otherwise, we only flush a small number of pages so that
2871
2570
we do not unnecessarily use much disk i/o capacity from
2874
n_pages_flushed = buf_flush_list(
2875
PCT_IO(10), IB_ULONGLONG_MAX);
2573
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
2878
2578
srv_main_thread_op_info = "making checkpoint";
2916
2616
MySQL tries to drop a table while there are still open handles
2917
2617
to it and we had to put it to the background drop queue.) */
2919
if (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
2920
os_thread_sleep(100000);
2619
os_thread_sleep(100000);
2622
srv_main_thread_op_info = "purging";
2624
/* Run a full purge */
2626
if (srv_fast_shutdown && srv_shutdown_state > 0) {
2924
if (srv_n_purge_threads == 0) {
2925
srv_main_thread_op_info = "master purging";
2927
srv_master_do_purge();
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);
2930
2639
srv_main_thread_op_info = "reserving kernel mutex";
3080
#if !defined(__SUNPRO_C)
2789
#if (!defined(__SUNPRO_C) && !defined(__SUNPRO_CC))
3081
2790
OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3085
/*********************************************************************//**
3086
Asynchronous purge thread.
3087
@return a dummy parameter */
3092
void* /*arg __attribute__((unused))*/) /*!< in: a dummy parameter
3093
required by os_thread_create */
3096
ulint slot_no = ULINT_UNDEFINED;
3097
ulint n_total_purged = ULINT_UNDEFINED;
3099
ut_a(srv_n_purge_threads == 1);
3101
#ifdef UNIV_DEBUG_THREAD_CREATION
3102
fprintf(stderr, "InnoDB: Purge thread running, id %lu\n",
3103
os_thread_pf(os_thread_get_curr_id()));
3104
#endif /* UNIV_DEBUG_THREAD_CREATION */
3106
mutex_enter(&kernel_mutex);
3108
slot_no = srv_table_reserve_slot(SRV_WORKER);
3110
slot = srv_table_get_nth_slot(slot_no);
3112
++srv_n_threads_active[SRV_WORKER];
3114
mutex_exit(&kernel_mutex);
3116
while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS) {
3118
ulint n_pages_purged;
3120
/* If there are very few records to purge or the last
3121
purge didn't purge any records then wait for activity.
3122
We peek at the history len without holding any mutex
3123
because in the worst case we will end up waiting for
3124
the next purge event. */
3125
if (trx_sys->rseg_history_len < srv_purge_batch_size
3126
|| n_total_purged == 0) {
3130
mutex_enter(&kernel_mutex);
3132
event = srv_suspend_thread();
3134
mutex_exit(&kernel_mutex);
3136
os_event_wait(event);
3139
/* Check for shutdown and whether we should do purge at all. */
3140
if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND
3141
|| srv_shutdown_state != 0
3142
|| srv_fast_shutdown) {
3149
/* Purge until there are no more records to purge and there is
3150
no change in configuration or server state. */
3152
n_pages_purged = trx_purge(srv_purge_batch_size);
3154
n_total_purged += n_pages_purged;
3156
} while (n_pages_purged > 0 && !srv_fast_shutdown);
3158
srv_sync_log_buffer_in_background();
3161
mutex_enter(&kernel_mutex);
3163
ut_ad(srv_table_get_nth_slot(slot_no) == slot);
3165
/* Decrement the active count. */
3166
srv_suspend_thread();
3168
slot->in_use = FALSE;
3170
/* Free the thread local memory. */
3171
thr_local_free(os_thread_get_curr_id());
3173
mutex_exit(&kernel_mutex);
3175
#ifdef UNIV_DEBUG_THREAD_CREATION
3176
fprintf(stderr, "InnoDB: Purge thread exiting, id %lu\n",
3177
os_thread_pf(os_thread_get_curr_id()));
3178
#endif /* UNIV_DEBUG_THREAD_CREATION */
3180
/* We count the number of threads in os_thread_exit(). A created
3181
thread should always use that to exit and not use return() to exit. */
3182
os_thread_exit(NULL);
3184
OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3187
/**********************************************************************//**
3188
Enqueues a task to server task queue and releases a worker thread, if there
3189
is a suspended one. */
3192
srv_que_task_enqueue_low(
3193
/*=====================*/
3194
que_thr_t* thr) /*!< in: query thread */
3198
mutex_enter(&kernel_mutex);
3200
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
3202
srv_release_threads(SRV_WORKER, 1);
3204
mutex_exit(&kernel_mutex);