From 4d660fbc149370e903cea7112f0b935829848414 Mon Sep 17 00:00:00 2001 From: Jiachen1018 Date: Fri, 19 Apr 2024 16:30:25 +0800 Subject: [PATCH] fix get cbo stats for part table when cantian_in_mysql --- storage/tianchi/ha_tse.cc | 4 +-- storage/tianchi/ha_tsepart.cc | 9 ++++-- storage/tianchi/srv_mq_msg.h | 3 ++ storage/tianchi/tse_srv.h | 4 +-- storage/tianchi/tse_srv_mq_stub.cc | 50 +++++++++++++++--------------- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/storage/tianchi/ha_tse.cc b/storage/tianchi/ha_tse.cc index 07e70b2..d013587 100644 --- a/storage/tianchi/ha_tse.cc +++ b/storage/tianchi/ha_tse.cc @@ -5225,7 +5225,7 @@ int ha_tse::initialize_cbo_stats() tse_log_error("alloc shm mem failed, m_share->cbo_stats size(%lu)", sizeof(tianchi_cbo_stats_t)); return ERR_ALLOC_MEMORY; } - *m_share->cbo_stats = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr}; + *m_share->cbo_stats = {0, 0, 0, 0, 0, nullptr, nullptr, nullptr}; m_share->cbo_stats->tse_cbo_stats_table.columns = (tse_cbo_stats_column_t*)my_malloc(PSI_NOT_INSTRUMENTED, table->s->fields * sizeof(tse_cbo_stats_column_t), MYF(MY_WME)); @@ -5260,7 +5260,7 @@ int ha_tse::get_cbo_stats_4share() } } update_member_tch(m_tch, tse_hton, thd); - ret = tse_get_cbo_stats(&m_tch, m_share->cbo_stats, 0, 0); + ret = tse_get_cbo_stats(&m_tch, m_share->cbo_stats, &m_share->cbo_stats->tse_cbo_stats_table, 0, 0); update_sess_ctx_by_tch(m_tch, tse_hton, thd); if (ret == CT_SUCCESS && m_share->cbo_stats->is_updated) { m_share->need_fetch_cbo = false; diff --git a/storage/tianchi/ha_tsepart.cc b/storage/tianchi/ha_tsepart.cc index 0a93cb3..92da799 100644 --- a/storage/tianchi/ha_tsepart.cc +++ b/storage/tianchi/ha_tsepart.cc @@ -973,7 +973,7 @@ int ha_tsepart::initialize_cbo_stats() { tse_log_error("alloc shm mem failed, m_part_share->cbo_stats size(%lu)", sizeof(tianchi_cbo_stats_t)); return ERR_ALLOC_MEMORY; } - *m_part_share->cbo_stats = {0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr}; + *m_part_share->cbo_stats = {0, 0, 0, 0, 0, nullptr, nullptr, nullptr}; m_part_share->cbo_stats->part_cnt = part_num; @@ -1023,7 +1023,7 @@ int ha_tsepart::get_cbo_stats_4share() for (uint32_t i = 0; icbo_stats, first_partid, num_part_fetch); + ret = tse_get_cbo_stats(&m_tch, m_part_share->cbo_stats, &m_part_share->cbo_stats->tse_cbo_stats_part_table[first_partid], first_partid, num_part_fetch); if (ret != CT_SUCCESS) { return ret; } @@ -1031,7 +1031,10 @@ int ha_tsepart::get_cbo_stats_4share() } num_part_fetch = part_cnt - first_partid; - ret = tse_get_cbo_stats(&m_tch, m_part_share->cbo_stats, first_partid, num_part_fetch); + if (num_part_fetch > 0) { + ret = tse_get_cbo_stats(&m_tch, m_part_share->cbo_stats, &m_part_share->cbo_stats->tse_cbo_stats_part_table[first_partid], first_partid, num_part_fetch); + } + update_sess_ctx_by_tch(m_tch, get_tse_hton(), thd); if (ret == CT_SUCCESS && m_part_share->cbo_stats->is_updated) { m_part_share->need_fetch_cbo = false; diff --git a/storage/tianchi/srv_mq_msg.h b/storage/tianchi/srv_mq_msg.h index 04fa788..8508c54 100644 --- a/storage/tianchi/srv_mq_msg.h +++ b/storage/tianchi/srv_mq_msg.h @@ -339,6 +339,9 @@ struct get_cbo_stats_request { int result; tianchi_handler_t tch; tianchi_cbo_stats_t *stats; + tse_cbo_stats_table_t *tse_cbo_stats_table; + uint16_t first_partid; + uint16_t num_part_fetch; }; struct get_serial_val_request { diff --git a/storage/tianchi/tse_srv.h b/storage/tianchi/tse_srv.h index 1922adb..e503406 100644 --- a/storage/tianchi/tse_srv.h +++ b/storage/tianchi/tse_srv.h @@ -152,8 +152,6 @@ typedef struct { * expand this struct if need more cbo stats */ typedef struct { - uint16_t first_partid; - uint16_t num_part_fetch; uint32_t part_cnt; uint32_t msg_len; uint32_t key_len; @@ -554,7 +552,7 @@ int tse_srv_release_savepoint(tianchi_handler_t *tch, const char *name); /* Optimizer Related Interface */ int tse_analyze_table(tianchi_handler_t *tch, const char *db_name, const char *table_name, double sampling_ratio); -int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32_t first_partid, uint32_t num_part_fetch); +int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, tse_cbo_stats_table_t *tse_cbo_stats_table, uint32_t first_partid, uint32_t num_part_fetch); int tse_get_index_name(tianchi_handler_t *tch, char *index_name); /* Datatype Related Interface */ diff --git a/storage/tianchi/tse_srv_mq_stub.cc b/storage/tianchi/tse_srv_mq_stub.cc index 4d2d98d..ba4a25a 100644 --- a/storage/tianchi/tse_srv_mq_stub.cc +++ b/storage/tianchi/tse_srv_mq_stub.cc @@ -740,7 +740,7 @@ int tse_analyze_table(tianchi_handler_t *tch, const char *db_name, const char *t return result; } -int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32_t first_partid, uint32_t num_part_fetch) { +int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, tse_cbo_stats_table_t *tse_cbo_stats_table, uint32_t first_partid, uint32_t num_part_fetch) { void *shm_inst_4_req = get_one_shm_inst(tch); get_cbo_stats_request *req = (get_cbo_stats_request*)alloc_share_mem(shm_inst_4_req, sizeof(get_cbo_stats_request)); @@ -759,33 +759,33 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 bool is_part_table = stats->tse_cbo_stats_part_table != nullptr ? true : false; req->stats->msg_len = stats->msg_len; req->stats->part_cnt = stats->part_cnt; + req->first_partid = first_partid; + req->num_part_fetch = num_part_fetch; void *shm_inst_4_columns = get_one_shm_inst(tch); void *shm_inst_4_keys = get_one_shm_inst(tch); void *shm_inst_4_part_table = get_one_shm_inst(tch); tse_cbo_stats_column_t* part_columns; uint32_t *part_ndv_keys; if (!is_part_table) { - req->stats->tse_cbo_stats_table.columns = (tse_cbo_stats_column_t*)alloc_share_mem(shm_inst_4_columns, req->stats->msg_len); - if (req->stats->tse_cbo_stats_table.columns == NULL) { + req->tse_cbo_stats_table.columns = (tse_cbo_stats_column_t*)alloc_share_mem(shm_inst_4_columns, req->stats->msg_len); + if (req->tse_cbo_stats_table.columns == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_columns, req->stats->msg_len); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } - req->stats->tse_cbo_stats_table.ndv_keys = (uint32_t*)alloc_share_mem(shm_inst_4_keys, stats->key_len); - if (req->stats->tse_cbo_stats_table.ndv_keys == NULL) { + req->tse_cbo_stats_table.ndv_keys = (uint32_t*)alloc_share_mem(shm_inst_4_keys, stats->key_len); + if (req->tse_cbo_stats_table.ndv_keys == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_keys, stats->key_len); - free_share_mem(shm_inst_4_columns, req->stats->tse_cbo_stats_table.columns); + free_share_mem(shm_inst_4_columns, req->tse_cbo_stats_table.columns); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } } else { - req->stats->first_partid = first_partid; - req->stats->num_part_fetch = num_part_fetch; - req->stats->tse_cbo_stats_part_table = + req->tse_cbo_stats_part_table = (tse_cbo_stats_table_t*)alloc_share_mem(shm_inst_4_part_table, num_part_fetch * sizeof(tse_cbo_stats_table_t)); - if (req->stats->tse_cbo_stats_part_table == NULL) { + if (req->tse_cbo_stats_part_table == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%lu)", shm_inst_4_part_table, num_part_fetch * sizeof(tse_cbo_stats_table_t)); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); @@ -794,7 +794,7 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 part_columns = (tse_cbo_stats_column_t*)alloc_share_mem(shm_inst_4_columns, stats->msg_len * num_part_fetch); if (part_columns == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_columns, stats->msg_len * num_part_fetch); - free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); + free_share_mem(shm_inst_4_part_table, req->tse_cbo_stats_part_table); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; @@ -803,14 +803,14 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 if (part_ndv_keys == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_keys, stats->key_len * num_part_fetch); free_share_mem(shm_inst_4_columns, part_columns); - free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); + free_share_mem(shm_inst_4_part_table, req->tse_cbo_stats_part_table); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } for (uint i = 0; i < num_part_fetch; i++) { - req->stats->tse_cbo_stats_part_table[i].columns = part_columns + i * (stats->msg_len / sizeof(tse_cbo_stats_column_t)); - req->stats->tse_cbo_stats_part_table[i].ndv_keys = part_ndv_keys + i * (stats->key_len / sizeof(uint32_t)); + req->tse_cbo_stats_part_table[i].columns = part_columns + i * (stats->msg_len / sizeof(tse_cbo_stats_column_t)); + req->tse_cbo_stats_part_table[i].ndv_keys = part_ndv_keys + i * (stats->key_len / sizeof(uint32_t)); } } @@ -819,30 +819,30 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 int ret = tse_mq_deal_func(shm_inst_4_req, TSE_FUNC_TYPE_GET_CBO_STATS, req, tch->msg_buf); if (ret == CT_SUCCESS) { if (req->result == CT_SUCCESS) { + stats->is_updated = req->stats->is_updated; if (!is_part_table) { *tch = req->tch; - memcpy(stats->tse_cbo_stats_table.columns, req->stats->tse_cbo_stats_table.columns, stats->msg_len); - memcpy(stats->tse_cbo_stats_table.ndv_keys, req->stats->tse_cbo_stats_table.ndv_keys, stats->key_len); - stats->is_updated = req->stats->is_updated; - stats->tse_cbo_stats_table.estimate_rows = req->stats->tse_cbo_stats_table.estimate_rows; + memcpy(tse_cbo_stats_table->columns, req->tse_cbo_stats_table.columns, stats->msg_len); + memcpy(tse_cbo_stats_table->ndv_keys, req->tse_cbo_stats_table.ndv_keys, stats->key_len); + + tse_cbo_stats_table->estimate_rows = req->tse_cbo_stats_table.estimate_rows; } else { - stats->is_updated = req->stats->is_updated; for (uint i = 0; i < num_part_fetch; i++) { - stats->tse_cbo_stats_part_table[i+first_partid].estimate_rows = req->stats->tse_cbo_stats_part_table[i].estimate_rows; - memcpy(stats->tse_cbo_stats_part_table[i+first_partid].columns, req->stats->tse_cbo_stats_part_table[i].columns, stats->msg_len); - memcpy(stats->tse_cbo_stats_part_table[i+first_partid].ndv_keys, req->stats->tse_cbo_stats_part_table[i].ndv_keys, stats->key_len); + tse_cbo_stats_table[i].estimate_rows = req->tse_cbo_stats_part_table[i].estimate_rows; + memcpy(tse_cbo_stats_table[i].columns, req->tse_cbo_stats_part_table[i].columns, stats->msg_len); + memcpy(tse_cbo_stats_table[i].ndv_keys, req->tse_cbo_stats_part_table[i].ndv_keys, stats->key_len); } } } result = req->result; } if (!is_part_table) { - free_share_mem(shm_inst_4_columns, req->stats->tse_cbo_stats_table.columns); - free_share_mem(shm_inst_4_keys, req->stats->tse_cbo_stats_table.ndv_keys); + free_share_mem(shm_inst_4_columns, req->tse_cbo_stats_table.columns); + free_share_mem(shm_inst_4_keys, req->tse_cbo_stats_table.ndv_keys); } else { free_share_mem(shm_inst_4_columns, part_columns); free_share_mem(shm_inst_4_keys, part_ndv_keys); - free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); + free_share_mem(shm_inst_4_part_table, req->tse_cbo_stats_part_table); } free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); -- Gitee