From 4c3dab1496470f9181f19f4d8c8c233a084fca55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 16 Apr 2023 22:09:56 +0000 Subject: [PATCH] Speed up on purge_query_digests_async() Responsible for the various TRUNCATE commands on stats_mysql_query_digest(_reset) --- lib/Query_Processor.cpp | 65 +++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index 1856ec94a..22cc0367d 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -1049,51 +1049,46 @@ unsigned long long Query_Processor::purge_query_digests(bool async_purge, bool p unsigned long long Query_Processor::purge_query_digests_async(char **msg) { unsigned long long ret = 0; pthread_rwlock_wrlock(&digest_rwlock); + + + umap_query_digest digest_umap_aux; + umap_query_digest_text digest_text_umap_aux; + pthread_rwlock_wrlock(&digest_rwlock); + digest_umap.swap(digest_umap_aux); + digest_text_umap.swap(digest_text_umap_aux); + pthread_rwlock_unlock(&digest_rwlock); + int num_rows = 0; unsigned long long curtime1=monotonic_time(); - size_t map1_size = digest_umap.size(); - size_t map2_size = digest_text_umap.size(); + size_t map1_size = digest_umap_aux.size(); + size_t map2_size = digest_text_umap_aux.size(); ret = map1_size + map2_size; - unsigned long long i = 0; - QP_query_digest_stats **array1 = (QP_query_digest_stats **)malloc(sizeof(QP_query_digest_stats *)*map1_size); - char **array2 = (char **)malloc(sizeof(char *)*map2_size); - i=0; - for (std::unordered_map::iterator it=digest_umap.begin(); it!=digest_umap.end(); ++it) { - array1[i]=(QP_query_digest_stats *)it->second; - i++; - //delete qds; + + for ( + std::unordered_map::iterator it = digest_umap_aux.begin(); + it != digest_umap_aux.end(); + ++it + ) { + QP_query_digest_stats *qds = (QP_query_digest_stats *)it->second; + delete qds; } - i=0; - for (std::unordered_map::iterator it=digest_text_umap.begin(); it!=digest_text_umap.end(); ++it) { - array2[i] = it->second; - //free(it->second); - i++; + digest_umap_aux.clear(); + for (std::unordered_map::iterator it=digest_text_umap_aux.begin(); it!=digest_text_umap_aux.end(); ++it) { + free(it->second); } - digest_umap.erase(digest_umap.begin(),digest_umap.end()); - digest_text_umap.erase(digest_text_umap.begin(),digest_text_umap.end()); - pthread_rwlock_unlock(&digest_rwlock); - unsigned long long curtime2=monotonic_time(); - curtime1 = curtime1/1000; - curtime2 = curtime2/1000; + digest_text_umap_aux.clear(); + + if (map1_size >= DIGEST_STATS_FAST_MINSIZE) { - proxy_info("Purging stats_mysql_query_digest: locked for %llums to remove %lu entries\n", curtime2-curtime1, map1_size); - } - char buf[128]; - sprintf(buf, "Query digest map locked for %llums", curtime2-curtime1); - *msg = strdup(buf); - for (i=0; i