~drizzle-trunk/drizzle/development

« back to all changes in this revision

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

  • Committer: Andrew Hutchings
  • Date: 2010-11-14 14:46:36 UTC
  • mto: (1931.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 1932.
  • Revision ID: andrew@linuxjedi.co.uk-20101114144636-bkttapbfpp20ccd2
Fix broken Global Status test
Fix some stats not reset
Cleanup code a little

Note: local session stats are not reset, they will be added to the global stats after flush if any query is executed on those sessions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
#include "sync0sync.h"
69
69
#include "thr0loc.h"
70
70
#include "que0que.h"
 
71
#include "srv0que.h"
71
72
#include "log0recv.h"
72
73
#include "pars0pars.h"
73
74
#include "usr0sess.h"
127
128
/** Whether to check file format during startup.  A value of
128
129
DICT_TF_FORMAT_MAX + 1 means no checking ie. FALSE.  The default is to
129
130
set it to the highest format we support. */
130
 
UNIV_INTERN ulint       srv_max_file_format_at_startup = DICT_TF_FORMAT_MAX;
 
131
UNIV_INTERN ulint       srv_check_file_format_at_startup = DICT_TF_FORMAT_MAX;
131
132
 
132
133
#if DICT_TF_FORMAT_51
133
134
# error "DICT_TF_FORMAT_51 must be 0!"
136
137
on duplicate key checking and foreign key checking */
137
138
UNIV_INTERN ibool       srv_locks_unsafe_for_binlog = FALSE;
138
139
 
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
140
UNIV_INTERN ulint       srv_n_data_files = 0;
161
141
UNIV_INTERN char**      srv_data_file_names = NULL;
162
142
/* size in database pages */
250
230
UNIV_INTERN my_bool     srv_use_sys_malloc      = TRUE;
251
231
/* requested size in kilobytes */
252
232
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
233
/* previously requested size */
256
234
UNIV_INTERN ulint       srv_buf_pool_old_size;
257
235
/* current size in kilobytes */
303
281
 
304
282
UNIV_INTERN ulong       srv_max_buf_pool_modified_pct   = 75;
305
283
 
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
284
/* variable counts amount of data read in total (in bytes) */
313
285
UNIV_INTERN ulint srv_data_read = 0;
314
286
 
463
435
UNIV_INTERN ib_int64_t  srv_n_lock_wait_time            = 0;
464
436
UNIV_INTERN ulint               srv_n_lock_max_wait_time        = 0;
465
437
 
466
 
UNIV_INTERN ulint               srv_truncated_status_writes     = 0;
467
438
 
468
439
/*
469
440
  Set the following to 0 if you want InnoDB to write messages on
487
458
 
488
459
/* Mutex for locking srv_monitor_file */
489
460
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
461
/* Temporary file for innodb monitor output */
505
462
UNIV_INTERN FILE*       srv_monitor_file;
506
463
/* Mutex for locking srv_dict_tmpfile.
761
718
static ulint    srv_meter_foreground[SRV_MASTER + 1];
762
719
#endif
763
720
 
 
721
/* The following values give info about the activity going on in
 
722
the database. They are protected by the server mutex. The arrays
 
723
are indexed by the type of the thread. */
 
724
 
 
725
UNIV_INTERN ulint       srv_n_threads_active[SRV_MASTER + 1];
 
726
UNIV_INTERN ulint       srv_n_threads[SRV_MASTER + 1];
 
727
 
764
728
/***********************************************************************
765
729
Prints counters for work done by srv_master_thread. */
766
730
static
778
742
                      srv_log_writes_and_flush);
779
743
}
780
744
 
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
745
/*********************************************************************//**
789
746
Sets the info describing an i/o thread current state. */
790
747
UNIV_INTERN
1016
973
        srv_sys = mem_alloc(sizeof(srv_sys_t));
1017
974
 
1018
975
        kernel_mutex_temp = mem_alloc(sizeof(mutex_t));
1019
 
        mutex_create(kernel_mutex_key, &kernel_mutex, SYNC_KERNEL);
 
976
        mutex_create(&kernel_mutex, SYNC_KERNEL);
1020
977
 
1021
 
        mutex_create(srv_innodb_monitor_mutex_key,
1022
 
                     &srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
 
978
        mutex_create(&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
1023
979
 
1024
980
        srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t));
1025
981
 
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) {
1770
1708
 
1771
1709
        log_refresh_stats();
1772
1710
 
1773
 
        buf_refresh_io_stats_all();
 
1711
        buf_refresh_io_stats();
1774
1712
 
1775
1713
        srv_n_rows_inserted_old = srv_n_rows_inserted;
1776
1714
        srv_n_rows_updated_old = srv_n_rows_updated;
1981
1919
srv_export_innodb_status(void)
1982
1920
/*==========================*/
1983
1921
{
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
1922
        mutex_enter(&srv_innodb_monitor_mutex);
1993
1923
 
1994
1924
        export_vars.innodb_data_pending_reads
2003
1933
        export_vars.innodb_data_reads = os_n_file_reads;
2004
1934
        export_vars.innodb_data_writes = os_n_file_writes;
2005
1935
        export_vars.innodb_data_written = srv_data_written;
2006
 
        export_vars.innodb_buffer_pool_read_requests = stat.n_page_gets;
 
1936
        export_vars.innodb_buffer_pool_read_requests = buf_pool->stat.n_page_gets;
2007
1937
        export_vars.innodb_buffer_pool_write_requests
2008
1938
                = srv_buf_pool_write_requests;
2009
1939
        export_vars.innodb_buffer_pool_wait_free = srv_buf_pool_wait_free;
2010
1940
        export_vars.innodb_buffer_pool_pages_flushed = srv_buf_pool_flushed;
2011
1941
        export_vars.innodb_buffer_pool_reads = srv_buf_pool_reads;
2012
1942
        export_vars.innodb_buffer_pool_read_ahead
2013
 
                = stat.n_ra_pages_read;
 
1943
                = buf_pool->stat.n_ra_pages_read;
2014
1944
        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;
 
1945
                = buf_pool->stat.n_ra_pages_evicted;
 
1946
        export_vars.innodb_buffer_pool_pages_data
 
1947
                = UT_LIST_GET_LEN(buf_pool->LRU);
 
1948
        export_vars.innodb_buffer_pool_pages_dirty
 
1949
                = UT_LIST_GET_LEN(buf_pool->flush_list);
 
1950
        export_vars.innodb_buffer_pool_pages_free
 
1951
                = UT_LIST_GET_LEN(buf_pool->free);
2019
1952
#ifdef UNIV_DEBUG
2020
1953
        export_vars.innodb_buffer_pool_pages_latched
2021
1954
                = buf_get_latched_pages_number();
2022
1955
#endif /* UNIV_DEBUG */
2023
 
        export_vars.innodb_buffer_pool_pages_total = buf_pool_get_n_pages();
 
1956
        export_vars.innodb_buffer_pool_pages_total = buf_pool->curr_size;
2024
1957
 
2025
 
        export_vars.innodb_buffer_pool_pages_misc
2026
 
                = buf_pool_get_n_pages() - LRU_len - free_len;
 
1958
        export_vars.innodb_buffer_pool_pages_misc = buf_pool->curr_size
 
1959
                - UT_LIST_GET_LEN(buf_pool->LRU)
 
1960
                - UT_LIST_GET_LEN(buf_pool->free);
2027
1961
#ifdef HAVE_ATOMIC_BUILTINS
2028
1962
        export_vars.innodb_have_atomic_builtins = 1;
2029
1963
#else
2039
1973
        export_vars.innodb_log_writes = srv_log_writes;
2040
1974
        export_vars.innodb_dblwr_pages_written = srv_dblwr_pages_written;
2041
1975
        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;
 
1976
        export_vars.innodb_pages_created = buf_pool->stat.n_pages_created;
 
1977
        export_vars.innodb_pages_read = buf_pool->stat.n_pages_read;
 
1978
        export_vars.innodb_pages_written = buf_pool->stat.n_pages_written;
2045
1979
        export_vars.innodb_row_lock_waits = srv_n_lock_wait_count;
2046
1980
        export_vars.innodb_row_lock_current_waits
2047
1981
                = srv_n_lock_wait_current_count;
2058
1992
        export_vars.innodb_rows_inserted = srv_n_rows_inserted;
2059
1993
        export_vars.innodb_rows_updated = srv_n_rows_updated;
2060
1994
        export_vars.innodb_rows_deleted = srv_n_rows_deleted;
2061
 
        export_vars.innodb_truncated_status_writes = srv_truncated_status_writes;
2062
1995
 
2063
1996
        mutex_exit(&srv_innodb_monitor_mutex);
2064
1997
}
2086
2019
        fprintf(stderr, "Lock timeout thread starts, id %lu\n",
2087
2020
                os_thread_pf(os_thread_get_curr_id()));
2088
2021
#endif
2089
 
 
2090
 
#ifdef UNIV_PFS_THREAD
2091
 
        pfs_register_thread(srv_monitor_thread_key);
2092
 
#endif
2093
 
 
2094
2022
        UT_NOT_USED(arg);
2095
2023
        srv_last_monitor_time = time(NULL);
2096
2024
        last_table_monitor_time = time(NULL);
2242
2170
        double          wait_time;
2243
2171
        ulint           i;
2244
2172
 
2245
 
#ifdef UNIV_PFS_THREAD
2246
 
        pfs_register_thread(srv_lock_timeout_thread_key);
2247
 
#endif
2248
 
 
2249
2173
loop:
2250
2174
        /* When someone is waiting for a lock, we wake up every second
2251
2175
        and check if a timeout has passed for a lock wait */
2352
2276
        fprintf(stderr, "Error monitor thread starts, id %lu\n",
2353
2277
                os_thread_pf(os_thread_get_curr_id()));
2354
2278
#endif
2355
 
 
2356
 
#ifdef UNIV_PFS_THREAD
2357
 
        pfs_register_thread(srv_error_monitor_thread_key);
2358
 
#endif
2359
 
 
2360
2279
loop:
2361
2280
        srv_error_monitor_active = TRUE;
2362
2281
 
2437
2356
        OS_THREAD_DUMMY_RETURN;
2438
2357
}
2439
2358
 
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
2359
/*******************************************************************//**
2466
2360
Tells the InnoDB server that there has been activity in the database
2467
2361
and wakes up the master thread if it is suspended (not sleeping). Used
2468
2362
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). */
 
2363
thread stays suspended (we do not protect our operation with the kernel
 
2364
mutex, for performace reasons). */
2471
2365
UNIV_INTERN
2472
2366
void
2473
2367
srv_active_wake_master_thread(void)
2486
2380
}
2487
2381
 
2488
2382
/*******************************************************************//**
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
2383
Wakes up the master thread if it is suspended or being suspended. */
2514
2384
UNIV_INTERN
2515
2385
void
2525
2395
        mutex_exit(&kernel_mutex);
2526
2396
}
2527
2397
 
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
2398
/**********************************************************************
2548
2399
The master thread is tasked to ensure that flush of log file happens
2549
2400
once every second in the background. This is to ensure that not more
2564
2415
        }
2565
2416
}
2566
2417
 
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
2418
/*********************************************************************//**
2596
2419
The master thread controlling the server.
2597
2420
@return a dummy parameter */
2603
2426
                        /*!< in: a dummy parameter required by
2604
2427
                        os_thread_create */
2605
2428
{
2606
 
        buf_pool_stat_t buf_stat;
2607
2429
        os_event_t      event;
2608
2430
        ulint           old_activity_count;
2609
2431
        ulint           n_pages_purged  = 0;
2615
2437
        ulint           n_ios_old;
2616
2438
        ulint           n_ios_very_old;
2617
2439
        ulint           n_pend_ios;
2618
 
        ulint           next_itr_time;
 
2440
        ibool           skip_sleep      = FALSE;
2619
2441
        ulint           i;
2620
2442
 
2621
2443
#ifdef UNIV_DEBUG_THREAD_CREATION
2622
2444
        fprintf(stderr, "Master thread starts, id %lu\n",
2623
2445
                os_thread_pf(os_thread_get_curr_id()));
2624
2446
#endif
2625
 
 
2626
 
#ifdef UNIV_PFS_THREAD
2627
 
        pfs_register_thread(srv_master_thread_key);
2628
 
#endif
2629
 
 
2630
2447
        srv_main_thread_process_no = os_proc_get_number();
2631
2448
        srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
2632
2449
 
2645
2462
 
2646
2463
        srv_main_thread_op_info = "reserving kernel mutex";
2647
2464
 
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;
 
2465
        n_ios_very_old = log_sys->n_log_ios + buf_pool->stat.n_pages_read
 
2466
                + buf_pool->stat.n_pages_written;
2651
2467
        mutex_enter(&kernel_mutex);
2652
2468
 
2653
2469
        /* Store the user activity counter at the start of this loop */
2664
2480
        when there is database activity */
2665
2481
 
2666
2482
        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;
 
2483
        skip_sleep = FALSE;
2670
2484
 
2671
2485
        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
 
 
 
2486
                n_ios_old = log_sys->n_log_ios + buf_pool->stat.n_pages_read
 
2487
                        + buf_pool->stat.n_pages_written;
2679
2488
                srv_main_thread_op_info = "sleeping";
2680
2489
                srv_main_1_second_loops++;
2681
2490
 
2682
 
                if (next_itr_time > cur_time) {
 
2491
                if (!skip_sleep) {
2683
2492
 
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));
 
2493
                        os_thread_sleep(1000000);
2690
2494
                        srv_main_sleeps++;
2691
2495
                }
2692
2496
 
2693
 
                /* Each iteration should happen at 1 second interval. */
2694
 
                next_itr_time = ut_time_ms() + 1000;
 
2497
                skip_sleep = FALSE;
2695
2498
 
2696
2499
                /* ALTER TABLE in MySQL requires on Unix that the table handler
2697
2500
                can drop tables lazily after there no longer are SELECT
2715
2518
                log_free_check();
2716
2519
 
2717
2520
                /* 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. */
 
2521
                capacity, we assume that there is free disk i/o capacity
 
2522
                available, and it makes sense to do an insert buffer merge. */
2720
2523
 
2721
 
                buf_get_total_stat(&buf_stat);
2722
2524
                n_pend_ios = buf_get_n_pending_ios()
2723
2525
                        + log_sys->n_pending_writes;
2724
 
                n_ios = log_sys->n_log_ios + buf_stat.n_pages_read
2725
 
                        + buf_stat.n_pages_written;
 
2526
                n_ios = log_sys->n_log_ios + buf_pool->stat.n_pages_read
 
2527
                        + buf_pool->stat.n_pages_written;
2726
2528
                if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2727
2529
                    && (n_ios - n_ios_old < SRV_RECENT_IO_ACTIVITY)) {
2728
2530
                        srv_main_thread_op_info = "doing insert buffer merge";
2740
2542
 
2741
2543
                        srv_main_thread_op_info =
2742
2544
                                "flushing buffer pool pages";
2743
 
                        n_pages_flushed = buf_flush_list(
2744
 
                                PCT_IO(100), IB_ULONGLONG_MAX);
2745
 
 
 
2545
                        n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2546
                                                          PCT_IO(100),
 
2547
                                                          IB_ULONGLONG_MAX);
 
2548
 
 
2549
                        /* If we had to do the flush, it may have taken
 
2550
                        even more than 1 second, and also, there may be more
 
2551
                        to flush. Do not sleep 1 second during the next
 
2552
                        iteration of this loop. */
 
2553
 
 
2554
                        skip_sleep = TRUE;
2746
2555
                } else if (srv_adaptive_flushing) {
2747
2556
 
2748
2557
                        /* Try to keep the rate of flushing of dirty
2755
2564
                                        "flushing buffer pool pages";
2756
2565
                                n_flush = ut_min(PCT_IO(100), n_flush);
2757
2566
                                n_pages_flushed =
2758
 
                                        buf_flush_list(
 
2567
                                        buf_flush_batch(
 
2568
                                                BUF_FLUSH_LIST,
2759
2569
                                                n_flush,
2760
2570
                                                IB_ULONGLONG_MAX);
 
2571
 
 
2572
                                if (n_flush == PCT_IO(100)) {
 
2573
                                        skip_sleep = TRUE;
 
2574
                                }
2761
2575
                        }
2762
2576
                }
2763
2577
 
2787
2601
        loop above requests writes for that case. The writes done here
2788
2602
        are not required, and may be disabled. */
2789
2603
 
2790
 
        buf_get_total_stat(&buf_stat);
2791
2604
        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;
 
2605
        n_ios = log_sys->n_log_ios + buf_pool->stat.n_pages_read
 
2606
                + buf_pool->stat.n_pages_written;
2794
2607
 
2795
2608
        srv_main_10_second_loops++;
2796
2609
        if (n_pend_ios < SRV_PEND_IO_THRESHOLD
2797
2610
            && (n_ios - n_ios_very_old < SRV_PAST_IO_ACTIVITY)) {
2798
2611
 
2799
2612
                srv_main_thread_op_info = "flushing buffer pool pages";
2800
 
                buf_flush_list(PCT_IO(100), IB_ULONGLONG_MAX);
 
2613
                buf_flush_batch(BUF_FLUSH_LIST, PCT_IO(100),
 
2614
                                IB_ULONGLONG_MAX);
2801
2615
 
2802
2616
                /* Flush logs if needed */
2803
2617
                srv_sync_log_buffer_in_background();
2812
2626
        /* Flush logs if needed */
2813
2627
        srv_sync_log_buffer_in_background();
2814
2628
 
2815
 
        if (srv_n_purge_threads == 0) {
2816
 
                srv_main_thread_op_info = "master purging";
2817
 
 
2818
 
                srv_master_do_purge();
 
2629
        /* We run a full purge every 10 seconds, even if the server
 
2630
        were active */
 
2631
        do {
2819
2632
 
2820
2633
                if (srv_fast_shutdown && srv_shutdown_state > 0) {
2821
2634
 
2822
2635
                        goto background_loop;
2823
2636
                }
2824
 
        }
 
2637
 
 
2638
                srv_main_thread_op_info = "purging";
 
2639
                n_pages_purged = trx_purge();
 
2640
 
 
2641
                /* Flush logs if needed */
 
2642
                srv_sync_log_buffer_in_background();
 
2643
 
 
2644
        } while (n_pages_purged);
2825
2645
 
2826
2646
        srv_main_thread_op_info = "flushing buffer pool pages";
2827
2647
 
2833
2653
                (> 70 %), we assume we can afford reserving the disk(s) for
2834
2654
                the time it requires to flush 100 pages */
2835
2655
 
2836
 
                n_pages_flushed = buf_flush_list(
2837
 
                        PCT_IO(100), IB_ULONGLONG_MAX);
 
2656
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2657
                                                  PCT_IO(100),
 
2658
                                                  IB_ULONGLONG_MAX);
2838
2659
        } else {
2839
2660
                /* Otherwise, we only flush a small number of pages so that
2840
2661
                we do not unnecessarily use much disk i/o capacity from
2841
2662
                other work */
2842
2663
 
2843
 
                n_pages_flushed = buf_flush_list(
2844
 
                          PCT_IO(10), IB_ULONGLONG_MAX);
 
2664
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2665
                                                  PCT_IO(10),
 
2666
                                                  IB_ULONGLONG_MAX);
2845
2667
        }
2846
2668
 
2847
2669
        srv_main_thread_op_info = "making checkpoint";
2888
2710
                os_thread_sleep(100000);
2889
2711
        }
2890
2712
 
2891
 
        if (srv_n_purge_threads == 0) {
2892
 
                srv_main_thread_op_info = "master purging";
2893
 
 
2894
 
                srv_master_do_purge();
2895
 
        }
 
2713
        srv_main_thread_op_info = "purging";
 
2714
 
 
2715
        /* Run a full purge */
 
2716
        do {
 
2717
                if (srv_fast_shutdown && srv_shutdown_state > 0) {
 
2718
 
 
2719
                        break;
 
2720
                }
 
2721
 
 
2722
                srv_main_thread_op_info = "purging";
 
2723
                n_pages_purged = trx_purge();
 
2724
 
 
2725
                /* Flush logs if needed */
 
2726
                srv_sync_log_buffer_in_background();
 
2727
 
 
2728
        } while (n_pages_purged);
2896
2729
 
2897
2730
        srv_main_thread_op_info = "reserving kernel mutex";
2898
2731
 
2910
2743
        } else {
2911
2744
                /* This should do an amount of IO similar to the number of
2912
2745
                dirty pages that will be flushed in the call to
2913
 
                buf_flush_list below. Otherwise, the system favors
 
2746
                buf_flush_batch below. Otherwise, the system favors
2914
2747
                clean pages over cleanup throughput. */
2915
2748
                n_bytes_merged = ibuf_contract_for_n_pages(FALSE,
2916
2749
                                                           PCT_IO(100));
2929
2762
        srv_main_thread_op_info = "flushing buffer pool pages";
2930
2763
        srv_main_flush_loops++;
2931
2764
        if (srv_fast_shutdown < 2) {
2932
 
                n_pages_flushed = buf_flush_list(
2933
 
                          PCT_IO(100), IB_ULONGLONG_MAX);
 
2765
                n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST,
 
2766
                                                  PCT_IO(100),
 
2767
                                                  IB_ULONGLONG_MAX);
2934
2768
        } else {
2935
2769
                /* In the fastest shutdown we do not flush the buffer pool
2936
2770
                to data files: we set n_pages_flushed to 0 artificially. */
2948
2782
        mutex_exit(&kernel_mutex);
2949
2783
 
2950
2784
        srv_main_thread_op_info = "waiting for buffer pool flush to end";
2951
 
        buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
 
2785
        buf_flush_wait_batch_end(BUF_FLUSH_LIST);
2952
2786
 
2953
2787
        /* Flush logs if needed */
2954
2788
        srv_sync_log_buffer_in_background();
3035
2869
                already when the event wait ends */
3036
2870
 
3037
2871
                os_thread_exit(NULL);
3038
 
 
3039
2872
        }
3040
2873
 
3041
2874
        /* When there is user activity, InnoDB will set the event and the
3048
2881
        OS_THREAD_DUMMY_RETURN; /* Not reached, avoid compiler warning */
3049
2882
#endif
3050
2883
}
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
 
}