summaryrefslogtreecommitdiff
path: root/storage/xtradb/srv
diff options
context:
space:
mode:
Diffstat (limited to 'storage/xtradb/srv')
-rw-r--r--storage/xtradb/srv/srv0conc.cc4
-rw-r--r--storage/xtradb/srv/srv0srv.cc136
-rw-r--r--storage/xtradb/srv/srv0start.cc57
3 files changed, 111 insertions, 86 deletions
diff --git a/storage/xtradb/srv/srv0conc.cc b/storage/xtradb/srv/srv0conc.cc
index cd73e5cd891..a8e7e2ab1aa 100644
--- a/storage/xtradb/srv/srv0conc.cc
+++ b/storage/xtradb/srv/srv0conc.cc
@@ -165,6 +165,10 @@ srv_conc_free(void)
{
#ifndef HAVE_ATOMIC_BUILTINS
os_fast_mutex_free(&srv_conc_mutex);
+
+ for (ulint i = 0; i < OS_THREAD_MAX_N; i++)
+ os_event_free(srv_conc_slots[i].event);
+
mem_free(srv_conc_slots);
srv_conc_slots = NULL;
#endif /* !HAVE_ATOMIC_BUILTINS */
diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc
index 58336924908..85e988e16b2 100644
--- a/storage/xtradb/srv/srv0srv.cc
+++ b/storage/xtradb/srv/srv0srv.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc.
Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved.
@@ -372,8 +372,6 @@ UNIV_INTERN ulong srv_read_ahead_threshold = 56;
#ifdef UNIV_LOG_ARCHIVE
UNIV_INTERN ibool srv_log_archive_on = FALSE;
-UNIV_INTERN ibool srv_archive_recovery = 0;
-UNIV_INTERN ib_uint64_t srv_archive_recovery_limit_lsn;
#endif /* UNIV_LOG_ARCHIVE */
/* This parameter is used to throttle the number of insert buffers that are
@@ -805,6 +803,10 @@ struct srv_sys_t{
srv_stats_t::ulint_ctr_1_t
activity_count; /*!< For tracking server
activity */
+ srv_stats_t::ulint_ctr_1_t
+ ibuf_merge_activity_count;/*!< For tracking change
+ buffer merge activity, a subset
+ of overall server activity */
};
#ifndef HAVE_ATOMIC_BUILTINS
@@ -1195,8 +1197,9 @@ srv_init(void)
srv_checkpoint_completed_event = os_event_create();
+ srv_redo_log_tracked_event = os_event_create();
+
if (srv_track_changed_pages) {
- srv_redo_log_tracked_event = os_event_create();
os_event_set(srv_redo_log_tracked_event);
}
@@ -1246,17 +1249,34 @@ srv_free(void)
{
srv_conc_free();
- /* The mutexes srv_sys->mutex and srv_sys->tasks_mutex should have
- been freed by sync_close() already. */
- mem_free(srv_sys);
- srv_sys = NULL;
+ if (!srv_read_only_mode) {
- trx_i_s_cache_free(trx_i_s_cache);
+ for (ulint i = 0; i < srv_sys->n_sys_threads; i++)
+ os_event_free(srv_sys->sys_threads[i].event);
- if (!srv_read_only_mode) {
+ os_event_free(srv_error_event);
+ os_event_free(srv_monitor_event);
os_event_free(srv_buf_dump_event);
- srv_buf_dump_event = NULL;
+ os_event_free(srv_checkpoint_completed_event);
+ os_event_free(srv_redo_log_tracked_event);
+ mutex_free(&srv_sys->mutex);
+ mutex_free(&srv_sys->tasks_mutex);
}
+
+#ifdef WITH_INNODB_DISALLOW_WRITES
+ os_event_free(srv_allow_writes_event);
+#endif /* WITH_INNODB_DISALLOW_WRITES */
+
+#ifndef HAVE_ATOMIC_BUILTINS
+ mutex_free(&server_mutex);
+#endif
+ mutex_free(&srv_innodb_monitor_mutex);
+ mutex_free(&page_zip_stat_per_index_mutex);
+
+ mem_free(srv_sys);
+ srv_sys = NULL;
+
+ trx_i_s_cache_free(trx_i_s_cache);
}
/*********************************************************************//**
@@ -2238,6 +2258,8 @@ exit_func:
/*********************************************************************//**
A thread which prints warnings about semaphore waits which have lasted
too long. These can be used to track bugs which cause hangs.
+Note: In order to make sync_arr_wake_threads_if_sema_free work as expected,
+we should avoid waiting any mutexes in this function!
@return a dummy parameter */
extern "C" UNIV_INTERN
os_thread_ret_t
@@ -2277,23 +2299,21 @@ loop:
/* Try to track a strange bug reported by Harald Fuchs and others,
where the lsn seems to decrease at times */
- /* We have to use nowait to ensure we don't block */
- new_lsn= log_get_lsn_nowait();
-
- if (new_lsn && new_lsn < old_lsn) {
- ut_print_timestamp(stderr);
- fprintf(stderr,
- " InnoDB: Error: old log sequence number " LSN_PF
- " was greater\n"
- "InnoDB: than the new log sequence number " LSN_PF "!\n"
- "InnoDB: Please submit a bug report"
- " to http://bugs.mysql.com\n",
- old_lsn, new_lsn);
- ut_ad(0);
- }
+ if (log_peek_lsn(&new_lsn)) {
+ if (new_lsn < old_lsn) {
+ ut_print_timestamp(stderr);
+ fprintf(stderr,
+ " InnoDB: Error: old log sequence number " LSN_PF
+ " was greater\n"
+ "InnoDB: than the new log sequence number " LSN_PF "!\n"
+ "InnoDB: Please submit a bug report"
+ " to http://bugs.mysql.com\n",
+ old_lsn, new_lsn);
+ ut_ad(0);
+ }
- if (new_lsn)
old_lsn = new_lsn;
+ }
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
/* We referesh InnoDB Monitor values so that averages are
@@ -2315,7 +2335,7 @@ loop:
if (sync_array_print_long_waits(&waiter, &sema)
&& sema == old_sema && os_thread_eq(waiter, old_waiter)) {
#if defined(WITH_WSREP) && defined(WITH_INNODB_DISALLOW_WRITES)
- if (srv_allow_writes_event->is_set) {
+ if (srv_allow_writes_event->is_set()) {
#endif /* WITH_WSREP */
fatal_cnt++;
#if defined(WITH_WSREP) && defined(WITH_INNODB_DISALLOW_WRITES)
@@ -2403,10 +2423,15 @@ rescan_idle:
Increment the server activity count. */
UNIV_INTERN
void
-srv_inc_activity_count(void)
-/*========================*/
+srv_inc_activity_count(
+/*===================*/
+ bool ibuf_merge_activity) /*!< whether this activity bump
+ is caused by the background
+ change buffer merge */
{
srv_sys->activity_count.inc();
+ if (ibuf_merge_activity)
+ srv_sys->ibuf_merge_activity_count.inc();
}
/**********************************************************************//**
@@ -2526,7 +2551,7 @@ DECLARE_THREAD(srv_redo_log_follow_thread)(
/* TODO: sync with I_S log tracking status? */
ib_logf(IB_LOG_LEVEL_ERROR,
"log tracking bitmap write failed, "
- "stopping log tracking thread!\n");
+ "stopping log tracking thread!");
break;
}
os_event_set(srv_redo_log_tracked_event);
@@ -2568,7 +2593,7 @@ purge_archived_logs(
if (!dir) {
ib_logf(IB_LOG_LEVEL_WARN,
"opening archived log directory %s failed. "
- "Purge archived logs are not available\n",
+ "Purge archived logs are not available",
srv_arch_dir);
/* failed to open directory */
return(DB_ERROR);
@@ -2656,7 +2681,7 @@ purge_archived_logs(
archived_log_filename)) {
ib_logf(IB_LOG_LEVEL_WARN,
- "can't delete archived log file %s.\n",
+ "can't delete archived log file %s.",
archived_log_filename);
mutex_exit(&log_sys->mutex);
@@ -2764,16 +2789,49 @@ srv_get_activity_count(void)
return(srv_sys->activity_count);
}
+/** Get current server ibuf merge activity count.
+@return ibuf merge activity count */
+static
+ulint
+srv_get_ibuf_merge_activity_count(void)
+{
+ return(srv_sys->ibuf_merge_activity_count);
+}
+
/*******************************************************************//**
-Check if there has been any activity.
+Check if there has been any activity. Considers background change buffer
+merge as regular server activity unless a non-default
+old_ibuf_merge_activity_count value is passed, in which case the merge will be
+treated as keeping server idle.
@return FALSE if no change in activity counter. */
UNIV_INTERN
ibool
srv_check_activity(
/*===============*/
- ulint old_activity_count) /*!< in: old activity count */
+ ulint old_activity_count, /*!< in: old activity count */
+ /*!< old change buffer merge
+ activity count, or
+ ULINT_UNDEFINED */
+ ulint old_ibuf_merge_activity_count)
{
- return(srv_sys->activity_count != old_activity_count);
+ ulint new_activity_count = srv_sys->activity_count;
+ if (old_ibuf_merge_activity_count == ULINT_UNDEFINED)
+ return(new_activity_count != old_activity_count);
+
+ /* If we care about ibuf merge activity, then the server is considered
+ idle if all activity, if any, was due to ibuf merge. */
+ ulint new_ibuf_merge_activity_count
+ = srv_sys->ibuf_merge_activity_count;
+
+ ut_ad(new_ibuf_merge_activity_count <= new_activity_count);
+ ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_activity_count);
+ ut_ad(new_activity_count >= old_activity_count);
+
+ ulint ibuf_merge_activity_delta =
+ new_ibuf_merge_activity_count - old_ibuf_merge_activity_count;
+ ulint activity_delta = new_activity_count - old_activity_count;
+
+ return (activity_delta > ibuf_merge_activity_delta);
}
/********************************************************************//**
@@ -3137,6 +3195,8 @@ DECLARE_THREAD(srv_master_thread)(
{
srv_slot_t* slot;
ulint old_activity_count = srv_get_activity_count();
+ ulint old_ibuf_merge_activity_count
+ = srv_get_ibuf_merge_activity_count();
ib_time_t last_print_time;
ut_ad(!srv_read_only_mode);
@@ -3174,8 +3234,12 @@ loop:
srv_current_thread_priority = srv_master_thread_priority;
- if (srv_check_activity(old_activity_count)) {
+ if (srv_check_activity(old_activity_count,
+ old_ibuf_merge_activity_count)) {
+
old_activity_count = srv_get_activity_count();
+ old_ibuf_merge_activity_count
+ = srv_get_ibuf_merge_activity_count();
srv_master_do_active_tasks();
} else {
srv_master_do_idle_tasks();
diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc
index 1db90b2eda5..6a3e756cb44 100644
--- a/storage/xtradb/srv/srv0start.cc
+++ b/storage/xtradb/srv/srv0start.cc
@@ -1975,7 +1975,7 @@ innobase_start_or_create_for_mysql(void)
}
} else {
srv_monitor_file_name = NULL;
- srv_monitor_file = os_file_create_tmpfile();
+ srv_monitor_file = os_file_create_tmpfile(NULL);
if (!srv_monitor_file) {
return(DB_ERROR);
@@ -1985,7 +1985,7 @@ innobase_start_or_create_for_mysql(void)
mutex_create(srv_dict_tmpfile_mutex_key,
&srv_dict_tmpfile_mutex, SYNC_DICT_OPERATION);
- srv_dict_tmpfile = os_file_create_tmpfile();
+ srv_dict_tmpfile = os_file_create_tmpfile(NULL);
if (!srv_dict_tmpfile) {
return(DB_ERROR);
@@ -1994,7 +1994,7 @@ innobase_start_or_create_for_mysql(void)
mutex_create(srv_misc_tmpfile_mutex_key,
&srv_misc_tmpfile_mutex, SYNC_ANY_LATCH);
- srv_misc_tmpfile = os_file_create_tmpfile();
+ srv_misc_tmpfile = os_file_create_tmpfile(NULL);
if (!srv_misc_tmpfile) {
return(DB_ERROR);
@@ -2458,40 +2458,6 @@ files_checked:
create_log_files_rename(logfilename, dirnamelen,
max_flushed_lsn, logfile0);
-#ifdef UNIV_LOG_ARCHIVE
- } else if (srv_archive_recovery) {
-
- ib_logf(IB_LOG_LEVEL_INFO,
- " Starting archive recovery from a backup...");
-
- err = recv_recovery_from_archive_start(
- min_flushed_lsn, srv_archive_recovery_limit_lsn,
- min_arch_log_no);
- if (err != DB_SUCCESS) {
-
- return(DB_ERROR);
- }
- /* Since ibuf init is in dict_boot, and ibuf is needed
- in any disk i/o, first call dict_boot */
-
- err = dict_boot();
-
- if (err != DB_SUCCESS) {
- return(err);
- }
-
- ib_bh = trx_sys_init_at_db_start();
- n_recovered_trx = UT_LIST_GET_LEN(trx_sys->rw_trx_list);
-
- /* The purge system needs to create the purge view and
- therefore requires that the trx_sys is inited. */
-
- trx_purge_sys_create(srv_n_purge_threads, ib_bh);
-
- srv_startup_is_before_trx_rollback_phase = FALSE;
-
- recv_recovery_from_archive_finish();
-#endif /* UNIV_LOG_ARCHIVE */
} else {
/* Check if we support the max format that is stamped
@@ -3188,15 +3154,13 @@ innobase_shutdown_for_mysql(void)
logs_empty_and_mark_files_at_shutdown() and should have
already quit or is quitting right now. */
-
if (srv_use_mtflush) {
/* g. Exit the multi threaded flush threads */
buf_mtflu_io_thread_exit();
}
- os_mutex_enter(os_sync_mutex);
-
+ os_rmb;
if (os_thread_count == 0) {
/* All the threads have exited or are just exiting;
NOTE that the threads may not have completed their
@@ -3206,15 +3170,11 @@ innobase_shutdown_for_mysql(void)
os_thread_exit(). Now we just sleep 0.1
seconds and hope that is enough! */
- os_mutex_exit(os_sync_mutex);
-
os_thread_sleep(100000);
break;
}
- os_mutex_exit(os_sync_mutex);
-
os_thread_sleep(100000);
}
@@ -3323,26 +3283,23 @@ innobase_shutdown_for_mysql(void)
que_close();
row_mysql_close();
srv_mon_free();
- sync_close();
srv_free();
fil_close();
- /* 4. Free the os_conc_mutex and all os_events and os_mutexes */
-
- os_sync_free();
-
- /* 5. Free all allocated memory */
+ /* 4. Free all allocated memory */
pars_lexer_close();
log_mem_free();
buf_pool_free(srv_buf_pool_instances);
mem_close();
+ sync_close();
/* ut_free_all_mem() frees all allocated memory not freed yet
in shutdown, and it will also free the ut_list_mutex, so it
should be the last one for all operation */
ut_free_all_mem();
+ os_rmb;
if (os_thread_count != 0
|| os_event_count != 0
|| os_mutex_count != 0