~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/innobase/srv/srv0srv.c

  • Committer: Monty Taylor
  • Date: 2010-10-08 17:32:00 UTC
  • mto: This revision was merged to the branch mainline in revision 1833.
  • Revision ID: mordred@inaugust.com-20101008173200-iq22jo2nic48noa3
Updated pandora-build files to version 0.157

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*****************************************************************************
2
2
 
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.
6
5
 
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.
12
11
 
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
18
 
COPYING.Percona.
19
 
 
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
31
23
 
32
24
*****************************************************************************/
 
25
/***********************************************************************
 
26
 
 
27
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
 
28
Copyright (c) 2009, Percona Inc.
 
29
 
 
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
 
35
COPYING.Percona.
 
36
 
 
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.
 
40
 
 
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.
 
45
 
 
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
 
49
 
 
50
***********************************************************************/
33
51
 
34
52
/**************************************************//**
35
53
@file srv/srv0srv.c
68
86
#include "sync0sync.h"
69
87
#include "thr0loc.h"
70
88
#include "que0que.h"
 
89
#include "srv0que.h"
71
90
#include "log0recv.h"
72
91
#include "pars0pars.h"
73
92
#include "usr0sess.h"
83
102
#include "row0mysql.h"
84
103
#include "ha_prototypes.h"
85
104
#include "trx0i_s.h"
86
 
#include "os0sync.h" /* for HAVE_ATOMIC_BUILTINS */
87
105
 
88
106
/* This is set to TRUE if the MySQL user has set it in MySQL; currently
89
107
affects only FOREIGN KEY definition parsing */
100
118
in microseconds, in order to reduce the lagging of the purge thread. */
101
119
UNIV_INTERN ulint       srv_dml_needed_delay = 0;
102
120
 
103
 
UNIV_INTERN ibool       srv_lock_timeout_active = FALSE;
104
 
UNIV_INTERN ibool       srv_monitor_active = FALSE;
 
121
UNIV_INTERN ibool       srv_lock_timeout_and_monitor_active = FALSE;
105
122
UNIV_INTERN ibool       srv_error_monitor_active = FALSE;
106
123
 
107
124
UNIV_INTERN const char* srv_main_thread_op_info = "";
127
144
/** Whether to check file format during startup.  A value of
128
145
DICT_TF_FORMAT_MAX + 1 means no checking ie. FALSE.  The default is to
129
146
set it to the highest format we support. */
130
 
UNIV_INTERN ulint       srv_max_file_format_at_startup = DICT_TF_FORMAT_MAX;
 
147
UNIV_INTERN ulint       srv_check_file_format_at_startup = DICT_TF_FORMAT_MAX;
131
148
 
132
149
#if DICT_TF_FORMAT_51
133
150
# error "DICT_TF_FORMAT_51 must be 0!"
136
153
on duplicate key checking and foreign key checking */
137
154
UNIV_INTERN ibool       srv_locks_unsafe_for_binlog = FALSE;
138
155
 
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;
144
 
 
145
 
#ifdef __WIN__
146
 
/* Windows native condition variables. We use runtime loading / function
147
 
pointers, because they are not available on Windows Server 2003 and
148
 
Windows XP/2000.
149
 
 
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;
158
 
#endif /* __WIN__ */
159
 
 
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;
193
189
 
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
197
 
 
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)
203
 
 
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
205
191
collation */
206
192
#if defined(BUILD_DRIZZLE)
207
193
UNIV_INTERN const byte  srv_latin1_ordering[256]        /* The sort order table of the latin1
250
236
UNIV_INTERN my_bool     srv_use_sys_malloc      = TRUE;
251
237
/* requested size in kilobytes */
252
238
UNIV_INTERN ulint       srv_buf_pool_size       = ULINT_MAX;
253
 
/* requested number of buffer pool instances */
254
 
UNIV_INTERN ulint       srv_buf_pool_instances  = 1;
255
239
/* previously requested size */
256
240
UNIV_INTERN ulint       srv_buf_pool_old_size;
257
241
/* current size in kilobytes */
303
287
 
304
288
UNIV_INTERN ulong       srv_max_buf_pool_modified_pct   = 75;
305
289
 
306
 
/* the number of purge threads to use from the worker pool (currently 0 or 1).*/
307
 
UNIV_INTERN ulong srv_n_purge_threads = 0;
308
 
 
309
 
/* the number of records to purge in one batch */
310
 
UNIV_INTERN ulong srv_purge_batch_size = 20;
311
 
 
312
290
/* variable counts amount of data read in total (in bytes) */
313
291
UNIV_INTERN ulint srv_data_read = 0;
314
292
 
355
333
reading of a disk page */
356
334
UNIV_INTERN ulint srv_buf_pool_reads = 0;
357
335
 
 
336
/** Number of sequential read-aheads */
 
337
UNIV_INTERN ulint srv_read_ahead_seq = 0;
 
338
 
 
339
/** Number of random read-aheads */
 
340
UNIV_INTERN ulint srv_read_ahead_rnd = 0;
 
341
 
358
342
/* structure to pass status variables to MySQL */
359
343
UNIV_INTERN export_struc export_vars;
360
344
 
463
447
UNIV_INTERN ib_int64_t  srv_n_lock_wait_time            = 0;
464
448
UNIV_INTERN ulint               srv_n_lock_max_wait_time        = 0;
465
449
 
466
 
UNIV_INTERN ulint               srv_truncated_status_writes     = 0;
467
450
 
468
451
/*
469
452
  Set the following to 0 if you want InnoDB to write messages on
487
470
 
488
471
/* Mutex for locking srv_monitor_file */
489
472
UNIV_INTERN mutex_t     srv_monitor_file_mutex;
490
 
 
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 */
503
 
 
504
473
/* Temporary file for innodb monitor output */
505
474
UNIV_INTERN FILE*       srv_monitor_file;
506
475
/* Mutex for locking srv_dict_tmpfile.
533
502
static ulint   srv_main_flush_loops             = 0;
534
503
/* Log writes involving flush. */
535
504
static ulint   srv_log_writes_and_flush         = 0;
 
505
/* Log writes not including flush. */
 
506
static ulint   srv_log_buffer_writes            = 0;
536
507
 
537
508
/* This is only ever touched by the master thread. It records the
538
509
time when the last flush of log file has happened. The master
761
732
static ulint    srv_meter_foreground[SRV_MASTER + 1];
762
733
#endif
763
734
 
 
735
/* The following values give info about the activity going on in
 
736
the database. They are protected by the server mutex. The arrays
 
737
are indexed by the type of the thread. */
 
738
 
 
739
UNIV_INTERN ulint       srv_n_threads_active[SRV_MASTER + 1];
 
740
UNIV_INTERN ulint       srv_n_threads[SRV_MASTER + 1];
 
741
 
764
742
/***********************************************************************
765
743
Prints counters for work done by srv_master_thread. */
766
744
static
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);
779
758
}
780
759
 
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. */
784
 
 
785
 
UNIV_INTERN ulint       srv_n_threads_active[SRV_MASTER + 1];
786
 
UNIV_INTERN ulint       srv_n_threads[SRV_MASTER + 1];
787
 
 
788
760
/*********************************************************************//**
789
761
Sets the info describing an i/o thread current state. */
790
762
UNIV_INTERN
1016
988
        srv_sys = mem_alloc(sizeof(srv_sys_t));
1017
989
 
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);
1020
992
 
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);
1023
994
 
1024
995
        srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t));
1025
996
 
1081
1052
}
1082
1053
 
1083
1054
/*********************************************************************//**
1084
 
Frees the data structures created in srv_init(). */
 
1055
Frees the OS fast mutex created in srv_init(). */
1085
1056
UNIV_INTERN
1086
1057
void
1087
1058
srv_free(void)
1088
1059
/*==========*/
1089
1060
{
1090
1061
        os_fast_mutex_free(&srv_conc_mutex);
1091
 
        mem_free(srv_conc_slots);
1092
 
        srv_conc_slots = NULL;
1093
 
 
1094
 
        mem_free(srv_sys->threads);
1095
 
        mem_free(srv_sys);
1096
 
        srv_sys = NULL;
1097
 
 
1098
 
        mem_free(kernel_mutex_temp);
1099
 
        kernel_mutex_temp = NULL;
1100
 
        mem_free(srv_mysql_table);
1101
 
        srv_mysql_table = NULL;
1102
 
 
1103
 
        trx_i_s_cache_free(trx_i_s_cache);
1104
1062
}
1105
1063
 
1106
1064
/*********************************************************************//**
1112
1070
/*==================*/
1113
1071
{
1114
1072
        ut_mem_init();
1115
 
        /* Reset the system variables in the recovery module. */
1116
 
        recv_sys_var_init();
1117
1073
        os_sync_init();
1118
1074
        sync_init();
1119
1075
        mem_init(srv_mem_pool_size);
1620
1576
                row_mysql_unfreeze_data_dictionary(trx);
1621
1577
                break;
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
1628
 
                transactions. */
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);
1637
1581
                break;
1651
1595
                row_mysql_freeze_data_dictionary(trx);
1652
1596
                break;
1653
1597
        case RW_X_LATCH:
1654
 
                /* This should never occur. This incorrect handling
1655
 
                was added in the early development of
1656
 
                ha_innobase::add_index() in InnoDB Plugin 1.0. */
1657
1598
                row_mysql_lock_data_dictionary(trx);
1658
1599
                break;
1659
1600
        }
1690
1631
                    start_time != -1 && finish_time != -1) {
1691
1632
                        srv_n_lock_max_wait_time = diff_time;
1692
1633
                }
1693
 
 
1694
 
                /* Record the lock wait time for this thread */
1695
 
                thd_set_lock_wait_time(trx->mysql_thd, diff_time);
1696
1634
        }
1697
1635
 
1698
1636
        if (trx->was_chosen_as_deadlock_victim) {
1714
1652
 
1715
1653
                trx->error_state = DB_LOCK_WAIT_TIMEOUT;
1716
1654
        }
1717
 
 
1718
 
        if (trx_is_interrupted(trx)) {
1719
 
 
1720
 
                trx->error_state = DB_INTERRUPTED;
1721
 
        }
1722
1655
}
1723
1656
 
1724
1657
/********************************************************************//**
1770
1703
 
1771
1704
        log_refresh_stats();
1772
1705
 
1773
 
        buf_refresh_io_stats_all();
 
1706
        buf_refresh_io_stats();
1774
1707
 
1775
1708
        srv_n_rows_inserted_old = srv_n_rows_inserted;
1776
1709
        srv_n_rows_updated_old = srv_n_rows_updated;
1781
1714
}
1782
1715
 
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. */
1787
1718
UNIV_INTERN
1788
 
ibool
 
1719
void
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
1798
1728
        double  time_elapsed;
1799
1729
        time_t  current_time;
1800
1730
        ulint   n_reserved;
1801
 
        ibool   ret;
1802
1731
 
1803
1732
        mutex_enter(&srv_innodb_monitor_mutex);
1804
1733
 
1822
1751
                "Per second averages calculated from the last %lu seconds\n",
1823
1752
                (ulong)time_elapsed);
1824
1753
 
1825
 
        fputs("-----------------\n"
1826
 
              "BACKGROUND THREAD\n"
1827
 
              "-----------------\n", file);
 
1754
        fputs("----------\n"
 
1755
                "BACKGROUND THREAD\n"
 
1756
                "----------\n", file);
1828
1757
        srv_print_master_thread_info(file);
1829
1758
 
1830
1759
        fputs("----------\n"
1848
1777
 
1849
1778
        mutex_exit(&dict_foreign_err_mutex);
1850
1779
 
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);
1855
 
 
1856
 
        if (ret) {
1857
 
                if (trx_start) {
1858
 
                        long    t = ftell(file);
1859
 
                        if (t < 0) {
1860
 
                                *trx_start = ULINT_UNDEFINED;
1861
 
                        } else {
1862
 
                                *trx_start = (ulint) t;
1863
 
                        }
1864
 
                }
1865
 
                lock_print_info_all_transactions(file);
1866
 
                if (trx_end) {
1867
 
                        long    t = ftell(file);
1868
 
                        if (t < 0) {
1869
 
                                *trx_end = ULINT_UNDEFINED;
1870
 
                        } else {
1871
 
                                *trx_end = (ulint) t;
1872
 
                        }
1873
 
                }
1874
 
        }
1875
 
 
 
1780
        lock_print_info_summary(file);
 
1781
        if (trx_start) {
 
1782
                long    t = ftell(file);
 
1783
                if (t < 0) {
 
1784
                        *trx_start = ULINT_UNDEFINED;
 
1785
                } else {
 
1786
                        *trx_start = (ulint) t;
 
1787
                }
 
1788
        }
 
1789
        lock_print_info_all_transactions(file);
 
1790
        if (trx_end) {
 
1791
                long    t = ftell(file);
 
1792
                if (t < 0) {
 
1793
                        *trx_end = ULINT_UNDEFINED;
 
1794
                } else {
 
1795
                        *trx_end = (ulint) t;
 
1796
                }
 
1797
        }
1876
1798
        fputs("--------\n"
1877
1799
              "FILE I/O\n"
1878
1800
              "--------\n", file);
1970
1892
              "============================\n", file);
1971
1893
        mutex_exit(&srv_innodb_monitor_mutex);
1972
1894
        fflush(file);
1973
 
 
1974
 
        return(ret);
1975
1895
}
1976
1896
 
1977
1897
/******************************************************************//**
1981
1901
srv_export_innodb_status(void)
1982
1902
/*==========================*/
1983
1903
{
1984
 
        buf_pool_stat_t stat;
1985
 
        ulint           LRU_len;
1986
 
        ulint           free_len;
1987
 
        ulint           flush_list_len;
1988
 
 
1989
 
        buf_get_total_stat(&stat);
1990
 
        buf_get_total_list_len(&LRU_len, &free_len, &flush_list_len);
1991
 
 
1992
1904
        mutex_enter(&srv_innodb_monitor_mutex);
1993
1905
 
1994
1906
        export_vars.innodb_data_pending_reads
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;
2024
1937
 
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;
2029
1943
#else
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;
2062
1975
 
2063
1976
        mutex_exit(&srv_innodb_monitor_mutex);
2064
1977
}
2065
1978
 
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 */
2069
1983
UNIV_INTERN
2070
1984
os_thread_ret_t
2071
 
srv_monitor_thread(
2072
 
/*===============*/
 
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 */
2076
1990
{
 
1991
        srv_slot_t*     slot;
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;
 
1997
        ibool           some_waits;
 
1998
        double          wait_time;
 
1999
        ulint           i;
2084
2000
 
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()));
2088
2004
#endif
2089
 
 
2090
 
#ifdef UNIV_PFS_THREAD
2091
 
        pfs_register_thread(srv_monitor_thread_key);
2092
 
#endif
2093
 
 
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);
2099
 
        mutex_skipped = 0;
2100
 
        last_srv_print_monitor = srv_print_innodb_monitor;
2101
2010
loop:
2102
 
        srv_monitor_active = TRUE;
2103
 
 
2104
 
        /* Wake up every 5 seconds to see if we need to print
2105
 
        monitor information. */
2106
 
 
2107
 
        os_thread_sleep(5000000);
 
2011
        srv_lock_timeout_and_monitor_active = TRUE;
 
2012
 
 
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 */
 
2015
 
 
2016
        os_thread_sleep(1000000);
2108
2017
 
2109
2018
        current_time = time(NULL);
2110
2019
 
2114
2023
                last_monitor_time = time(NULL);
2115
2024
 
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) {
2123
 
                                mutex_skipped = 0;
2124
 
                                last_srv_print_monitor = TRUE;
2125
 
                        }
2126
 
 
2127
 
                        if (!srv_printf_innodb_monitor(stderr,
2128
 
                                                MUTEX_NOWAIT(mutex_skipped),
2129
 
                                                NULL, NULL)) {
2130
 
                                mutex_skipped++;
2131
 
                        } else {
2132
 
                                /* Reset the counter */
2133
 
                                mutex_skipped = 0;
2134
 
                        }
2135
 
                } else {
2136
 
                        last_srv_print_monitor = FALSE;
 
2026
                        srv_printf_innodb_monitor(stderr, NULL, NULL);
2137
2027
                }
2138
2028
 
2139
 
 
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),
2145
 
                                                NULL, NULL)) {
2146
 
                                mutex_skipped++;
2147
 
                        } else {
2148
 
                                mutex_skipped = 0;
2149
 
                        }
2150
 
 
 
2032
                        srv_printf_innodb_monitor(srv_monitor_file, NULL,
 
2033
                                                  NULL);
2151
2034
                        os_file_set_eof(srv_monitor_file);
2152
2035
                        mutex_exit(&srv_monitor_file_mutex);
2153
2036
                }
2200
2083
                }
2201
2084
        }
2202
2085
 
2203
 
        if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) {
2204
 
                goto exit_func;
2205
 
        }
2206
 
 
2207
 
        if (srv_print_innodb_monitor
2208
 
            || srv_print_innodb_lock_monitor
2209
 
            || srv_print_innodb_tablespace_monitor
2210
 
            || srv_print_innodb_table_monitor) {
2211
 
                goto loop;
2212
 
        }
2213
 
 
2214
 
        srv_monitor_active = FALSE;
2215
 
 
2216
 
        goto loop;
2217
 
 
2218
 
exit_func:
2219
 
        srv_monitor_active = FALSE;
2220
 
 
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. */
2223
 
 
2224
 
        os_thread_exit(NULL);
2225
 
 
2226
 
        OS_THREAD_DUMMY_RETURN;
2227
 
}
2228
 
 
2229
 
/*********************************************************************//**
2230
 
A thread which wakes up threads whose lock wait may have lasted too long.
2231
 
@return a dummy parameter */
2232
 
UNIV_INTERN
2233
 
os_thread_ret_t
2234
 
srv_lock_timeout_thread(
2235
 
/*====================*/
2236
 
        void*   arg __attribute__((unused)))
2237
 
                        /* in: a dummy parameter required by
2238
 
                        os_thread_create */
2239
 
{
2240
 
        srv_slot_t*     slot;
2241
 
        ibool           some_waits;
2242
 
        double          wait_time;
2243
 
        ulint           i;
2244
 
 
2245
 
#ifdef UNIV_PFS_THREAD
2246
 
        pfs_register_thread(srv_lock_timeout_thread_key);
2247
 
#endif
2248
 
 
2249
 
loop:
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 */
2252
 
 
2253
 
        os_thread_sleep(1000000);
2254
 
 
2255
 
        srv_lock_timeout_active = TRUE;
2256
 
 
2257
2086
        mutex_enter(&kernel_mutex);
2258
2087
 
2259
2088
        some_waits = FALSE;
2277
2106
                        lock_wait_timeout = thd_lock_wait_timeout(
2278
2107
                                trx->mysql_thd);
2279
2108
 
2280
 
                        if (trx_is_interrupted(trx)
2281
 
                            || (lock_wait_timeout < 100000000
2282
 
                                && (wait_time > (double) lock_wait_timeout
2283
 
                                    || wait_time < 0))) {
 
2109
                        if (lock_wait_timeout < 100000000
 
2110
                            && (wait_time > (double) lock_wait_timeout
 
2111
                                || wait_time < 0)) {
2284
2112
 
2285
2113
                                /* Timeout exceeded or a wrap-around in system
2286
2114
                                time counter: cancel the lock request queued
2305
2133
                goto exit_func;
2306
2134
        }
2307
2135
 
2308
 
        if (some_waits) {
 
2136
        if (some_waits || srv_print_innodb_monitor
 
2137
            || srv_print_innodb_lock_monitor
 
2138
            || srv_print_innodb_tablespace_monitor
 
2139
            || srv_print_innodb_table_monitor) {
2309
2140
                goto loop;
2310
2141
        }
2311
2142
 
2312
 
        srv_lock_timeout_active = FALSE;
 
2143
        /* No one was waiting for a lock and no monitor was active:
 
2144
        suspend this thread */
 
2145
 
 
2146
        srv_lock_timeout_and_monitor_active = FALSE;
2313
2147
 
2314
2148
#if 0
2315
2149
        /* The following synchronisation is disabled, since
2319
2153
        goto loop;
2320
2154
 
2321
2155
exit_func:
2322
 
        srv_lock_timeout_active = FALSE;
 
2156
        srv_lock_timeout_and_monitor_active = FALSE;
2323
2157
 
2324
2158
        /* We count the number of threads in os_thread_exit(). A created
2325
2159
        thread should always use that to exit and not use return() to exit. */
2352
2186
        fprintf(stderr, "Error monitor thread starts, id %lu\n",
2353
2187
                os_thread_pf(os_thread_get_curr_id()));
2354
2188
#endif
2355
 
 
2356
 
#ifdef UNIV_PFS_THREAD
2357
 
        pfs_register_thread(srv_error_monitor_thread_key);
2358
 
#endif
2359
 
 
2360
2189
loop:
2361
2190
        srv_error_monitor_active = TRUE;
2362
2191
 
2437
2266
        OS_THREAD_DUMMY_RETURN;
2438
2267
}
2439
2268
 
2440
 
/**********************************************************************//**
2441
 
Check whether any background thread is active.
2442
 
@return FALSE if all are are suspended or have exited. */
2443
 
UNIV_INTERN
2444
 
ibool
2445
 
srv_is_any_background_thread_active(void)
2446
 
/*=====================================*/
2447
 
{
2448
 
        ulint   i;
2449
 
        ibool   ret = FALSE;
2450
 
 
2451
 
        mutex_enter(&kernel_mutex);
2452
 
 
2453
 
        for (i = SRV_COM; i <= SRV_MASTER; ++i) {
2454
 
                if (srv_n_threads_active[i] != 0) {
2455
 
                        ret = TRUE;
2456
 
                        break;
2457
 
                }
2458
 
        }
2459
 
 
2460
 
        mutex_exit(&kernel_mutex);
2461
 
 
2462
 
        return(ret);
2463
 
}
2464
 
 
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). */
2471
2275
UNIV_INTERN
2472
2276
void
2473
2277
srv_active_wake_master_thread(void)
2486
2290
}
2487
2291
 
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). */
2494
 
UNIV_INTERN
2495
 
void
2496
 
srv_wake_purge_thread_if_not_active(void)
2497
 
/*=====================================*/
2498
 
{
2499
 
        ut_ad(!mutex_own(&kernel_mutex));
2500
 
 
2501
 
        if (srv_n_purge_threads > 0
2502
 
            && srv_n_threads_active[SRV_WORKER] == 0) {
2503
 
 
2504
 
                mutex_enter(&kernel_mutex);
2505
 
 
2506
 
                srv_release_threads(SRV_WORKER, 1);
2507
 
 
2508
 
                mutex_exit(&kernel_mutex);
2509
 
        }
2510
 
}
2511
 
 
2512
 
/*******************************************************************//**
2513
2293
Wakes up the master thread if it is suspended or being suspended. */
2514
2294
UNIV_INTERN
2515
2295
void
2525
2305
        mutex_exit(&kernel_mutex);
2526
2306
}
2527
2307
 
2528
 
/*******************************************************************//**
2529
 
Wakes up the purge thread if it's not already awake. */
2530
 
UNIV_INTERN
2531
 
void
2532
 
srv_wake_purge_thread(void)
2533
 
/*=======================*/
2534
 
{
2535
 
        ut_ad(!mutex_own(&kernel_mutex));
2536
 
 
2537
 
        if (srv_n_purge_threads > 0) {
2538
 
 
2539
 
                mutex_enter(&kernel_mutex);
2540
 
 
2541
 
                srv_release_threads(SRV_WORKER, 1);
2542
 
 
2543
 
                mutex_exit(&kernel_mutex);
2544
 
        }
2545
 
}
2546
 
 
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++;
 
2325
        } else {
 
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++;
2564
2331
        }
2565
2332
}
2566
2333
 
2567
 
/********************************************************************//**
2568
 
Do a full purge, reconfigure the purge sub-system if a dynamic
2569
 
change is detected. */
2570
 
static
2571
 
void
2572
 
srv_master_do_purge(void)
2573
 
/*=====================*/
2574
 
{
2575
 
        ulint   n_pages_purged;
2576
 
 
2577
 
        ut_ad(!mutex_own(&kernel_mutex));
2578
 
 
2579
 
        ut_a(srv_n_purge_threads == 0);
2580
 
 
2581
 
        do {
2582
 
                /* Check for shutdown and change in purge config. */
2583
 
                if (srv_fast_shutdown && srv_shutdown_state > 0) {
2584
 
                        /* Nothing to purge. */
2585
 
                        n_pages_purged = 0;
2586
 
                } else {
2587
 
                        n_pages_purged = trx_purge(srv_purge_batch_size);
2588
 
                }
2589
 
 
2590
 
                srv_sync_log_buffer_in_background();
2591
 
 
2592
 
        } while (n_pages_purged > 0);
2593
 
}
2594
 
 
2595
2334
/*********************************************************************//**
2596
2335
The master thread controlling the server.
2597
2336
@return a dummy parameter */
2603
2342
                        /*!< in: a dummy parameter required by
2604
2343
                        os_thread_create */
2605
2344
{
2606
 
        buf_pool_stat_t buf_stat;
2607
2345
        os_event_t      event;
2608
2346
        ulint           old_activity_count;
2609
2347
        ulint           n_pages_purged  = 0;
2615
2353
        ulint           n_ios_old;
2616
2354
        ulint           n_ios_very_old;
2617
2355
        ulint           n_pend_ios;
2618
 
        ulint           next_itr_time;
 
2356
        ibool           skip_sleep      = FALSE;
2619
2357
        ulint           i;
2620
2358
 
2621
2359
#ifdef UNIV_DEBUG_THREAD_CREATION
2622
2360
        fprintf(stderr, "Master thread starts, id %lu\n",
2623
2361
                os_thread_pf(os_thread_get_curr_id()));
2624
2362
#endif
2625
 
 
2626
 
#ifdef UNIV_PFS_THREAD
2627
 
        pfs_register_thread(srv_master_thread_key);
2628
 
#endif
2629
 
 
2630
2363
        srv_main_thread_process_no = os_proc_get_number();
2631
2364
        srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
2632
2365
 
2645
2378
 
2646
2379
        srv_main_thread_op_info = "reserving kernel mutex";
2647
2380
 
2648
 
        buf_get_total_stat(&buf_stat);
2649
 
        n_ios_very_old = log_sys->n_log_ios + buf_stat.n_pages_read
2650
 
                + buf_stat.n_pages_written;
 
2381
        n_ios_very_old = log_sys->n_log_ios + buf_pool->n_pages_read
 
2382
                + buf_pool->n_pages_written;
2651
2383
        mutex_enter(&kernel_mutex);
2652
2384
 
2653
2385
        /* Store the user activity counter at the start of this loop */
2664
2396
        when there is database activity */
2665
2397
 
2666
2398
        srv_last_log_flush_time = time(NULL);
2667
 
 
2668
 
        /* Sleep for 1 second on entrying the for loop below the first time. */
2669
 
        next_itr_time = ut_time_ms() + 1000;
 
2399
        skip_sleep = FALSE;
2670
2400
 
2671
2401
        for (i = 0; i < 10; i++) {
2672
 
                ulint   cur_time = ut_time_ms();
2673
 
 
2674
 
                buf_get_total_stat(&buf_stat);
2675
 
 
2676
 
                n_ios_old = log_sys->n_log_ios + buf_stat.n_pages_read
2677
 
                        + buf_stat.n_pages_written;
2678
 
 
 
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++;
2681
2406
 
2682
 
                if (next_itr_time > cur_time) {
 
2407
                if (!skip_sleep) {
2683
2408
 
2684
 
                        /* Get sleep interval in micro seconds. We use
2685
 
                        ut_min() to avoid long sleep in case of
2686
 
                        wrap around. */
2687
 
                        os_thread_sleep(ut_min(1000000,
2688
 
                                        (next_itr_time - cur_time)
2689
 
                                         * 1000));
 
2409
                        os_thread_sleep(1000000);
2690
2410
                        srv_main_sleeps++;
2691
2411
                }
2692
2412
 
2693
 
                /* Each iteration should happen at 1 second interval. */
2694
 
                next_itr_time = ut_time_ms() + 1000;
 
2413
                skip_sleep = FALSE;
2695
2414
 
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();
2716
2435
 
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. */
2720
2439
 
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 */
2740
2458
 
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);
2745
 
 
 
2459
                        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2460
                                                          PCT_IO(100),
 
2461
                                                          IB_ULONGLONG_MAX);
 
2462
 
 
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. */
 
2467
 
 
2468
                        skip_sleep = TRUE;
2746
2469
                } else if (srv_adaptive_flushing) {
2747
2470
 
2748
2471
                        /* Try to keep the rate of flushing of dirty
2751
2474
                        ulint n_flush = buf_flush_get_desired_flush_rate();
2752
2475
 
2753
2476
                        if (n_flush) {
2754
 
                                srv_main_thread_op_info =
2755
 
                                        "flushing buffer pool pages";
2756
2477
                                n_flush = ut_min(PCT_IO(100), n_flush);
2757
2478
                                n_pages_flushed =
2758
 
                                        buf_flush_list(
 
2479
                                        buf_flush_batch(
 
2480
                                                BUF_FLUSH_LIST,
2759
2481
                                                n_flush,
2760
2482
                                                IB_ULONGLONG_MAX);
 
2483
                                skip_sleep = TRUE;
2761
2484
                        }
2762
2485
                }
2763
2486
 
2787
2510
        loop above requests writes for that case. The writes done here
2788
2511
        are not required, and may be disabled. */
2789
2512
 
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;
2794
2516
 
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)) {
2798
2520
 
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),
 
2523
                                IB_ULONGLONG_MAX);
2801
2524
 
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();
2814
2537
 
2815
 
        if (srv_n_purge_threads == 0) {
2816
 
                srv_main_thread_op_info = "master purging";
2817
 
 
2818
 
                srv_master_do_purge();
 
2538
        /* We run a full purge every 10 seconds, even if the server
 
2539
        were active */
 
2540
        do {
2819
2541
 
2820
2542
                if (srv_fast_shutdown && srv_shutdown_state > 0) {
2821
2543
 
2822
2544
                        goto background_loop;
2823
2545
                }
2824
 
        }
 
2546
 
 
2547
                srv_main_thread_op_info = "purging";
 
2548
                n_pages_purged = trx_purge();
 
2549
 
 
2550
                /* Flush logs if needed */
 
2551
                srv_sync_log_buffer_in_background();
 
2552
 
 
2553
        } while (n_pages_purged);
2825
2554
 
2826
2555
        srv_main_thread_op_info = "flushing buffer pool pages";
2827
2556
 
2833
2562
                (> 70 %), we assume we can afford reserving the disk(s) for
2834
2563
                the time it requires to flush 100 pages */
2835
2564
 
2836
 
                n_pages_flushed = buf_flush_list(
2837
 
                        PCT_IO(100), IB_ULONGLONG_MAX);
 
2565
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2566
                                                  PCT_IO(100),
 
2567
                                                  IB_ULONGLONG_MAX);
2838
2568
        } else {
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
2841
2571
                other work */
2842
2572
 
2843
 
                n_pages_flushed = buf_flush_list(
2844
 
                          PCT_IO(10), IB_ULONGLONG_MAX);
 
2573
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2574
                                                  PCT_IO(10),
 
2575
                                                  IB_ULONGLONG_MAX);
2845
2576
        }
2846
2577
 
2847
2578
        srv_main_thread_op_info = "making checkpoint";
2888
2619
                os_thread_sleep(100000);
2889
2620
        }
2890
2621
 
2891
 
        if (srv_n_purge_threads == 0) {
2892
 
                srv_main_thread_op_info = "master purging";
2893
 
 
2894
 
                srv_master_do_purge();
2895
 
        }
 
2622
        srv_main_thread_op_info = "purging";
 
2623
 
 
2624
        /* Run a full purge */
 
2625
        do {
 
2626
                if (srv_fast_shutdown && srv_shutdown_state > 0) {
 
2627
 
 
2628
                        break;
 
2629
                }
 
2630
 
 
2631
                srv_main_thread_op_info = "purging";
 
2632
                n_pages_purged = trx_purge();
 
2633
 
 
2634
                /* Flush logs if needed */
 
2635
                srv_sync_log_buffer_in_background();
 
2636
 
 
2637
        } while (n_pages_purged);
2896
2638
 
2897
2639
        srv_main_thread_op_info = "reserving kernel mutex";
2898
2640
 
2910
2652
        } else {
2911
2653
                /* This should do an amount of IO similar to the number of
2912
2654
                dirty pages that will be flushed in the call to
2913
 
                buf_flush_list below. Otherwise, the system favors
 
2655
                buf_flush_batch below. Otherwise, the system favors
2914
2656
                clean pages over cleanup throughput. */
2915
2657
                n_bytes_merged = ibuf_contract_for_n_pages(FALSE,
2916
2658
                                                           PCT_IO(100));
2929
2671
        srv_main_thread_op_info = "flushing buffer pool pages";
2930
2672
        srv_main_flush_loops++;
2931
2673
        if (srv_fast_shutdown < 2) {
2932
 
                n_pages_flushed = buf_flush_list(
2933
 
                          PCT_IO(100), IB_ULONGLONG_MAX);
 
2674
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2675
                                                  PCT_IO(100),
 
2676
                                                  IB_ULONGLONG_MAX);
2934
2677
        } else {
2935
2678
                /* In the fastest shutdown we do not flush the buffer pool
2936
2679
                to data files: we set n_pages_flushed to 0 artificially. */
2948
2691
        mutex_exit(&kernel_mutex);
2949
2692
 
2950
2693
        srv_main_thread_op_info = "waiting for buffer pool flush to end";
2951
 
        buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
 
2694
        buf_flush_wait_batch_end(BUF_FLUSH_LIST);
2952
2695
 
2953
2696
        /* Flush logs if needed */
2954
2697
        srv_sync_log_buffer_in_background();
3035
2778
                already when the event wait ends */
3036
2779
 
3037
2780
                os_thread_exit(NULL);
3038
 
 
3039
2781
        }
3040
2782
 
3041
2783
        /* When there is user activity, InnoDB will set the event and the
3048
2790
        OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3049
2791
#endif
3050
2792
}
3051
 
 
3052
 
/*********************************************************************//**
3053
 
Asynchronous purge thread.
3054
 
@return a dummy parameter */
3055
 
UNIV_INTERN
3056
 
os_thread_ret_t
3057
 
srv_purge_thread(
3058
 
/*=============*/
3059
 
        void*   arg __attribute__((unused)))    /*!< in: a dummy parameter
3060
 
                                                required by os_thread_create */
3061
 
{
3062
 
        srv_slot_t*     slot;
3063
 
        ulint           slot_no = ULINT_UNDEFINED;
3064
 
        ulint           n_total_purged = ULINT_UNDEFINED;
3065
 
 
3066
 
        ut_a(srv_n_purge_threads == 1);
3067
 
 
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 */
3072
 
 
3073
 
        mutex_enter(&kernel_mutex);
3074
 
 
3075
 
        slot_no = srv_table_reserve_slot(SRV_WORKER);
3076
 
 
3077
 
        slot = srv_table_get_nth_slot(slot_no);
3078
 
 
3079
 
        ++srv_n_threads_active[SRV_WORKER];
3080
 
 
3081
 
        mutex_exit(&kernel_mutex);
3082
 
 
3083
 
        while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS) {
3084
 
 
3085
 
                ulint   n_pages_purged;
3086
 
 
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) {
3094
 
 
3095
 
                        os_event_t      event;
3096
 
 
3097
 
                        mutex_enter(&kernel_mutex);
3098
 
 
3099
 
                        event = srv_suspend_thread();
3100
 
 
3101
 
                        mutex_exit(&kernel_mutex);
3102
 
 
3103
 
                        os_event_wait(event);
3104
 
                }
3105
 
 
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) {
3110
 
 
3111
 
                        break;
3112
 
                }
3113
 
 
3114
 
                n_total_purged = 0;
3115
 
 
3116
 
                /* Purge until there are no more records to purge and there is
3117
 
                no change in configuration or server state. */
3118
 
                do {
3119
 
                        n_pages_purged = trx_purge(srv_purge_batch_size);
3120
 
 
3121
 
                        n_total_purged += n_pages_purged;
3122
 
 
3123
 
                } while (n_pages_purged > 0 && !srv_fast_shutdown);
3124
 
 
3125
 
                srv_sync_log_buffer_in_background();
3126
 
        }
3127
 
 
3128
 
        mutex_enter(&kernel_mutex);
3129
 
 
3130
 
        ut_ad(srv_table_get_nth_slot(slot_no) == slot);
3131
 
 
3132
 
        /* Decrement the active count. */
3133
 
        srv_suspend_thread();
3134
 
 
3135
 
        slot->in_use = FALSE;
3136
 
 
3137
 
        /* Free the thread local memory. */
3138
 
        thr_local_free(os_thread_get_curr_id());
3139
 
 
3140
 
        mutex_exit(&kernel_mutex);
3141
 
 
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 */
3146
 
 
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);
3150
 
 
3151
 
        OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3152
 
}
3153
 
 
3154
 
/**********************************************************************//**
3155
 
Enqueues a task to server task queue and releases a worker thread, if there
3156
 
is a suspended one. */
3157
 
UNIV_INTERN
3158
 
void
3159
 
srv_que_task_enqueue_low(
3160
 
/*=====================*/
3161
 
        que_thr_t*      thr)    /*!< in: query thread */
3162
 
{
3163
 
        ut_ad(thr);
3164
 
 
3165
 
        mutex_enter(&kernel_mutex);
3166
 
 
3167
 
        UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
3168
 
 
3169
 
        srv_release_threads(SRV_WORKER, 1);
3170
 
 
3171
 
        mutex_exit(&kernel_mutex);
3172
 
}