summaryrefslogtreecommitdiff
path: root/storage/innobase/srv/srv0srv.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/srv/srv0srv.cc')
-rw-r--r--storage/innobase/srv/srv0srv.cc280
1 files changed, 131 insertions, 149 deletions
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index c4e20c973a0..c7823d2e2d8 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -586,23 +586,17 @@ static srv_sys_t srv_sys;
*/
struct purge_coordinator_state
{
- /* Snapshot of the last history length before the purge call.*/
- uint32 m_history_length;
- Atomic_counter<int> m_running;
- purge_coordinator_state() :
- m_history_length(), m_running(0)
- {}
+ /** Snapshot of the last history length before the purge call.*/
+ uint32 m_history_length;
+ Atomic_counter<int> m_running;
+ purge_coordinator_state() : m_history_length(), m_running(0) {}
};
static purge_coordinator_state purge_state;
extern tpool::waitable_task purge_coordinator_task;
/** @return whether the purge coordinator thread is active */
-bool purge_sys_t::running()
-{
- return purge_coordinator_task.is_running();
-}
-
+bool purge_sys_t::running() { return purge_coordinator_task.is_running(); }
/** threadpool timer for srv_error_monitor_task(). */
std::unique_ptr<tpool::timer> srv_error_monitor_timer;
@@ -726,30 +720,29 @@ static void thread_pool_thread_end()
void srv_thread_pool_init()
{
- DBUG_ASSERT(!srv_thread_pool);
+ DBUG_ASSERT(!srv_thread_pool);
#if defined (_WIN32)
- srv_thread_pool = tpool::create_thread_pool_win();
+ srv_thread_pool= tpool::create_thread_pool_win();
#else
- srv_thread_pool = tpool::create_thread_pool_generic();
+ srv_thread_pool= tpool::create_thread_pool_generic();
#endif
- srv_thread_pool->set_thread_callbacks(thread_pool_thread_init, thread_pool_thread_end);
+ srv_thread_pool->set_thread_callbacks(thread_pool_thread_init,
+ thread_pool_thread_end);
}
void srv_thread_pool_end()
{
- ut_a(!srv_master_timer);
- delete srv_thread_pool;
- srv_thread_pool = nullptr;
+ ut_ad(!srv_master_timer);
+ delete srv_thread_pool;
+ srv_thread_pool= nullptr;
}
static bool need_srv_free;
/** Initialize the server. */
-static
-void
-srv_init()
+static void srv_init()
{
mutex_create(LATCH_ID_SRV_INNODB_MONITOR, &srv_innodb_monitor_mutex);
srv_thread_pool_init();
@@ -1407,16 +1400,14 @@ srv_export_innodb_status(void)
struct srv_monitor_state_t
{
- time_t last_monitor_time;
- ulint mutex_skipped;
- bool last_srv_print_monitor;
- srv_monitor_state_t()
- {
- srv_last_monitor_time = time(NULL);
- last_monitor_time = srv_last_monitor_time;
- mutex_skipped = 0;
- last_srv_print_monitor = false;
- }
+ time_t last_monitor_time;
+ ulint mutex_skipped;
+ bool last_srv_print_monitor;
+ srv_monitor_state_t() : mutex_skipped(0), last_srv_print_monitor(false)
+ {
+ srv_last_monitor_time = time(NULL);
+ last_monitor_time= srv_last_monitor_time;
+ }
};
static srv_monitor_state_t monitor_state;
@@ -1558,18 +1549,18 @@ srv_inc_activity_count(void)
srv_sys.activity_count.inc();
}
-/**
-Check whether purge or master are still active.
-@return true if something is active, false if not.
-*/
+#ifdef UNIV_DEBUG
+/** @return whether purge or master task is active */
bool srv_any_background_activity()
{
- if (purge_sys.enabled() || srv_master_timer.get()) {
- ut_ad(!srv_read_only_mode);
- return true;
- }
- return false;
+ if (purge_sys.enabled() || srv_master_timer.get())
+ {
+ ut_ad(!srv_read_only_mode);
+ return true;
+ }
+ return false;
}
+#endif /* UNIV_DEBUG */
/** Wake up the InnoDB master thread if it was suspended (not sleeping). */
void
@@ -1582,17 +1573,19 @@ srv_active_wake_master_thread_low()
}
-void purge_worker_callback(void*);
-void purge_coordinator_callback(void*);
-void purge_coordinator_timer_callback(void*);
+static void purge_worker_callback(void*);
+static void purge_coordinator_callback(void*);
+static void purge_coordinator_timer_callback(void*);
-tpool::task_group purge_task_group;
-tpool::waitable_task purge_worker_task(purge_worker_callback, nullptr, &purge_task_group);
+static tpool::task_group purge_task_group;
+tpool::waitable_task purge_worker_task(purge_worker_callback, nullptr,
+ &purge_task_group);
+static tpool::task_group purge_coordinator_task_group(1);
+tpool::waitable_task purge_coordinator_task(purge_coordinator_callback,
+ nullptr,
+ &purge_coordinator_task_group);
-tpool::task_group purge_coordinator_task_group(1);
-tpool::waitable_task purge_coordinator_task(purge_coordinator_callback, nullptr, &purge_coordinator_task_group);
-
-tpool::timer* purge_coordinator_timer;
+static tpool::timer *purge_coordinator_timer;
/** Wake up the purge threads if there is work to do. */
void
@@ -1965,10 +1958,7 @@ srv_shutdown(bool ibuf_merge)
} while (n_bytes_merged || n_tables_to_drop);
}
-/*********************************************************************//**
-The periodic master controlling the server.
-@return a dummy parameter */
-
+/** The periodic master task controlling the server. */
void srv_master_callback(void*)
{
static ulint old_activity_count;
@@ -2117,17 +2107,16 @@ static uint32_t srv_do_purge(ulint* n_total_purged)
}
-std::queue<THD*> purge_thds;
-std::mutex purge_thd_mutex;
+static std::queue<THD*> purge_thds;
+static std::mutex purge_thd_mutex;
-void purge_create_background_thds(int n)
+static void purge_create_background_thds(int n)
{
- THD* thd = current_thd;
- std::unique_lock<std::mutex> lk(purge_thd_mutex);
- for (int i = 0; i < n; i++) {
- purge_thds.push(innobase_create_background_thd("InnoDB purge worker"));
- }
- set_current_thd(thd);
+ THD *thd= current_thd;
+ std::unique_lock<std::mutex> lk(purge_thd_mutex);
+ while (n--)
+ purge_thds.push(innobase_create_background_thd("InnoDB purge worker"));
+ set_current_thd(thd);
}
extern void* thd_attach_thd(THD*);
@@ -2162,103 +2151,98 @@ void release_thd(THD *thd, void *ctx)
Called by timer when purge coordinator decides
to delay processing of purge records.
*/
-void purge_coordinator_timer_callback(void *)
+static void purge_coordinator_timer_callback(void *)
{
- if (!purge_sys.enabled() || purge_sys.paused() ||
- purge_state.m_running || !trx_sys.rseg_history_len) {
- return;
- }
-
- if (purge_state.m_history_length < 5000 &&
- purge_state.m_history_length == trx_sys.rseg_history_len) {
-
- /* No new records were added since wait started.
- Simply wait for new records.The magic number 5000 is an
- approximation for the case where we have cached UNDO
- log records which prevent truncate of the UNDO segments.*/
-
- return;
- }
-
- srv_wake_purge_thread_if_not_active();
+ if (!purge_sys.enabled() || purge_sys.paused() ||
+ purge_state.m_running || !trx_sys.rseg_history_len)
+ return;
+
+ if (purge_state.m_history_length < 5000 &&
+ purge_state.m_history_length == trx_sys.rseg_history_len)
+ /* No new records were added since wait started.
+ Simply wait for new records. The magic number 5000 is an
+ approximation for the case where we have cached UNDO
+ log records which prevent truncate of the UNDO segments.*/
+ return;
+ srv_wake_purge_thread_if_not_active();
}
-void purge_worker_callback(void*)
+static void purge_worker_callback(void*)
{
- ut_ad(!current_thd);
- ut_ad(!srv_read_only_mode);
- ut_ad(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
- void* ctx;
- THD* thd = acquire_thd(&ctx);
- while (srv_task_execute()){}
- release_thd(thd,ctx);
+ ut_ad(!current_thd);
+ ut_ad(!srv_read_only_mode);
+ ut_ad(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
+ void *ctx;
+ THD *thd= acquire_thd(&ctx);
+ while (srv_task_execute()) {}
+ release_thd(thd,ctx);
}
-
-void purge_coordinator_callback_low()
+static void purge_coordinator_callback_low()
{
- ulint n_total_purged = ULINT_UNDEFINED;
- purge_state.m_history_length = 0;
-
- if (!purge_sys.enabled() || purge_sys.paused()) {
- return;
- }
- do {
- n_total_purged = 0;
-
- int sigcount = purge_state.m_running;
-
- purge_state.m_history_length = srv_do_purge(&n_total_purged);
-
- /* Check if purge was woken by srv_wake_purge_thread_if_not_active() */
-
- bool woken_during_purge = purge_state.m_running > sigcount;
-
- /*If last purge batch processed less that 1 page and there is still work to do,
- delay the next batch by 10ms. Unless someone added work and woke us up. */
- if (n_total_purged == 0){
-
- if(trx_sys.rseg_history_len == 0) {
- return;
- }
-
- if (!woken_during_purge) {
- /* Delay next purge round*/
- purge_coordinator_timer->set_time(10, 0);
- return;
- }
- }
- } while((purge_sys.enabled() && !purge_sys.paused()) || !srv_purge_should_exit());
+ ulint n_total_purged= ULINT_UNDEFINED;
+ purge_state.m_history_length= 0;
+
+ if (!purge_sys.enabled() || purge_sys.paused())
+ return;
+ do
+ {
+ n_total_purged = 0;
+ int sigcount= purge_state.m_running;
+
+ purge_state.m_history_length= srv_do_purge(&n_total_purged);
+
+ /* Check if purge was woken by srv_wake_purge_thread_if_not_active() */
+
+ bool woken_during_purge= purge_state.m_running > sigcount;
+
+ /* If last purge batch processed less than 1 page and there is
+ still work to do, delay the next batch by 10ms. Unless
+ someone added work and woke us up. */
+ if (n_total_purged == 0)
+ {
+ if (trx_sys.rseg_history_len == 0)
+ return;
+ if (!woken_during_purge)
+ {
+ /* Delay next purge round*/
+ purge_coordinator_timer->set_time(10, 0);
+ return;
+ }
+ }
+ }
+ while ((purge_sys.enabled() && !purge_sys.paused()) ||
+ !srv_purge_should_exit());
}
-void purge_coordinator_callback(void*)
+static void purge_coordinator_callback(void*)
{
- void* ctx;
- THD* thd = acquire_thd(&ctx);
- purge_coordinator_callback_low();
- release_thd(thd,ctx);
- purge_state.m_running = 0;
+ void *ctx;
+ THD *thd= acquire_thd(&ctx);
+ purge_coordinator_callback_low();
+ release_thd(thd,ctx);
+ purge_state.m_running= 0;
}
void srv_init_purge_tasks(uint n_tasks)
{
- purge_task_group.set_max_tasks(n_tasks-1);
- purge_create_background_thds(n_tasks);
- purge_coordinator_timer =
- srv_thread_pool->create_timer(purge_coordinator_timer_callback,
- nullptr);
+ purge_task_group.set_max_tasks(n_tasks - 1);
+ purge_create_background_thds(n_tasks);
+ purge_coordinator_timer= srv_thread_pool->create_timer
+ (purge_coordinator_timer_callback, nullptr);
}
-void srv_shutdown_purge_tasks()
+static void srv_shutdown_purge_tasks()
{
- purge_coordinator_task.wait();
- delete purge_coordinator_timer;
- purge_coordinator_timer = nullptr;
- purge_worker_task.wait();
- while (!purge_thds.empty()) {
- innobase_destroy_background_thd(purge_thds.front());
- purge_thds.pop();
- }
+ purge_coordinator_task.wait();
+ delete purge_coordinator_timer;
+ purge_coordinator_timer= nullptr;
+ purge_worker_task.wait();
+ while (!purge_thds.empty())
+ {
+ innobase_destroy_background_thd(purge_thds.front());
+ purge_thds.pop();
+ }
}
/**********************************************************************//**
@@ -2277,12 +2261,9 @@ srv_que_task_enqueue_low(
mutex_exit(&srv_sys.tasks_mutex);
}
-/**********************************************************************//**
-Get count of tasks in the queue.
-@return number of tasks in queue */
-ulint
-srv_get_task_queue_length(void)
-/*===========================*/
+#ifdef UNIV_DEBUG
+/** @return number of tasks in queue */
+ulint srv_get_task_queue_length()
{
ulint n_tasks;
@@ -2296,6 +2277,7 @@ srv_get_task_queue_length(void)
return(n_tasks);
}
+#endif
/** Wake up the purge coordinator. */
void
@@ -2324,4 +2306,4 @@ void srv_purge_shutdown()
purge_sys.coordinator_shutdown();
srv_shutdown_purge_tasks();
}
-} \ No newline at end of file
+}