summaryrefslogtreecommitdiff
path: root/sql/table_cache.cc
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2017-08-10 15:45:03 +0400
committerSergey Vojtovich <svoj@mariadb.org>2017-10-31 19:13:20 +0400
commit613dd62a76b51df38b96e36bce5bd8b7be2ca73a (patch)
tree282dde02c308157ec86c051061c7ddfe669dba58 /sql/table_cache.cc
parent5d3ed9acdda80828f7f3be8f7322b3e8366eab5f (diff)
downloadmariadb-git-613dd62a76b51df38b96e36bce5bd8b7be2ca73a.tar.gz
MDEV-11153 - Introduce status variables for table cache monitoring and tuning
Status variables added: Table_open_cache_hits, Table_open_cache_misses, Table_open_cache_overflows, Table_open_cache_active_instances.
Diffstat (limited to 'sql/table_cache.cc')
-rw-r--r--sql/table_cache.cc35
1 files changed, 26 insertions, 9 deletions
diff --git a/sql/table_cache.cc b/sql/table_cache.cc
index 6067ecb059d..f55e24f3b04 100644
--- a/sql/table_cache.cc
+++ b/sql/table_cache.cc
@@ -56,7 +56,7 @@
ulong tdc_size; /**< Table definition cache threshold for LRU eviction. */
ulong tc_size; /**< Table cache threshold for LRU eviction. */
uint32 tc_instances;
-static uint32 tc_active_instances= 1;
+uint32 tc_active_instances= 1;
static uint32 tc_contention_warning_reported;
/** Data collections. */
@@ -369,18 +369,30 @@ void tc_add_table(THD *thd, TABLE *table)
mysql_mutex_unlock(&element->LOCK_table_share);
mysql_mutex_lock(&tc[i].LOCK_table_cache);
- if (tc[i].records == tc_size && (LRU_table= tc[i].free_tables.pop_front()))
+ if (tc[i].records == tc_size)
{
- LRU_table->s->tdc->free_tables[i].list.remove(LRU_table);
- /* Needed if MDL deadlock detector chimes in before tc_remove_table() */
- LRU_table->in_use= thd;
+ if ((LRU_table= tc[i].free_tables.pop_front()))
+ {
+ LRU_table->s->tdc->free_tables[i].list.remove(LRU_table);
+ /* Needed if MDL deadlock detector chimes in before tc_remove_table() */
+ LRU_table->in_use= thd;
+ mysql_mutex_unlock(&tc[i].LOCK_table_cache);
+ /* Keep out of locked LOCK_table_cache */
+ tc_remove_table(LRU_table);
+ }
+ else
+ {
+ tc[i].records++;
+ mysql_mutex_unlock(&tc[i].LOCK_table_cache);
+ }
+ /* Keep out of locked LOCK_table_cache */
+ status_var_increment(thd->status_var.table_open_cache_overflows);
}
else
+ {
tc[i].records++;
- mysql_mutex_unlock(&tc[i].LOCK_table_cache);
-
- if (LRU_table)
- tc_remove_table(LRU_table);
+ mysql_mutex_unlock(&tc[i].LOCK_table_cache);
+ }
}
@@ -841,7 +853,10 @@ retry:
tdc_purge(false);
if (out_table)
+ {
+ status_var_increment(thd->status_var.table_open_cache_misses);
*out_table= 0;
+ }
share->m_psi= PSI_CALL_get_table_share(false, share);
goto end;
}
@@ -858,8 +873,10 @@ retry:
DBUG_ASSERT(element->share);
DBUG_ASSERT(!element->share->error);
DBUG_ASSERT(!element->share->is_view);
+ status_var_increment(thd->status_var.table_open_cache_hits);
DBUG_RETURN(element->share);
}
+ status_var_increment(thd->status_var.table_open_cache_misses);
}
mysql_mutex_lock(&element->LOCK_table_share);