diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 97218f2f9..29db38603 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -1077,15 +1077,19 @@ int ProxySQL_Test___GetDigestTable_v2(bool reset, bool copy, bool use_resultset) int r = 0; if (!GloQPro) return 0; std::pair res; - if (reset==true) { + if (reset == true) { res = GloQPro->get_query_digests_reset_v2(use_resultset); } else { res = GloQPro->get_query_digests_v2(use_resultset); } - if (res.first == NULL) return res.second; - r = res.first->rows_count; + + if (res.first == NULL) + return res.second; + + int num_rows = GloAdmin->stats___save_mysql_query_digest_to_sqlite(reset, copy, res.first, NULL, NULL); delete res.first; - return r; + + return num_rows; } int ProxySQL_Test___GetDigestTable(bool reset, bool use_swap) { @@ -9503,11 +9507,11 @@ int ProxySQL_Admin::stats___save_mysql_query_digest_to_sqlite( int num_rows = resultset ? resultset->rows_count : digest_umap->size(); int max_bulk_row_idx = num_rows/32; max_bulk_row_idx=max_bulk_row_idx*32; - auto it = digest_umap->cbegin(); + auto it = resultset ? (std::unordered_map::iterator)NULL : digest_umap->cbegin(); int i = 0; // If the function do not receives a resultset, it gets the values directly from the digest_umap while (resultset ? i != resultset->rows_count : it != digest_umap->end()) { - QP_query_digest_stats *qds = (QP_query_digest_stats *)it->second; + QP_query_digest_stats *qds = (QP_query_digest_stats *)(resultset ? NULL : it->second); SQLite3_row *row = resultset ? resultset->rows[i] : NULL; string digest_hex_str; if (!resultset) { diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index 992401f3a..42e03ec5c 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -1201,6 +1201,7 @@ std::pair Query_Processor::get_query_digests_v2(const boo 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; unsigned long long curtime2; size_t map_size = digest_umap_aux.size(); @@ -1258,10 +1259,11 @@ std::pair Query_Processor::get_query_digests_v2(const boo free(a); } } + } else { + num_rows = GloAdmin->stats___save_mysql_query_digest_to_sqlite( + false, false, NULL, &digest_umap_aux, &digest_text_umap_aux + ); } - int num_rows = GloAdmin->stats___save_mysql_query_digest_to_sqlite( - false, false, result, &digest_umap_aux, &digest_text_umap_aux - ); if (map_size >= DIGEST_STATS_FAST_MINSIZE) { curtime2=monotonic_time(); curtime1 = curtime1/1000; @@ -1373,6 +1375,7 @@ std::pair Query_Processor::get_query_digests_reset_v2(con 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; unsigned long long curtime2; size_t map_size = digest_umap_aux.size(); // we need to use the new map @@ -1438,10 +1441,11 @@ std::pair Query_Processor::get_query_digests_reset_v2(con delete qds; } } + } else { + num_rows = GloAdmin->stats___save_mysql_query_digest_to_sqlite( + false, false, result, &digest_umap_aux, &digest_text_umap_aux + ); } - int num_rows = GloAdmin->stats___save_mysql_query_digest_to_sqlite( - false, false, result, &digest_umap_aux, &digest_text_umap_aux - ); digest_umap_aux.clear(); // this part is always single-threaded for (std::unordered_map::iterator it=digest_text_umap_aux.begin(); it!=digest_text_umap_aux.end(); ++it) {