Fixing issue with planid and text not getting stored

PG-588
Hamid Akhtar 2023-02-14 19:57:06 +05:00
parent b7d90d8b32
commit a856a60cbd
1 changed files with 15 additions and 8 deletions

View File

@ -189,7 +189,7 @@ char *unpack_sql_state(int sql_state);
static pgssEntry *pgsm_create_hash_entry(MemoryContext context, uint64 bucket_id, uint64 queryid, PlanInfo *plan_info); static pgssEntry *pgsm_create_hash_entry(MemoryContext context, uint64 bucket_id, uint64 queryid, PlanInfo *plan_info);
static void pgsm_add_to_list(pgssEntry *entry, char *query_text, int query_len, bool should_dup); static void pgsm_add_to_list(pgssEntry *entry, char *query_text, int query_len, bool should_dup);
static pgssEntry* pgsm_get_entry_for_query(uint64 queryid, const char* query_text, int query_len, bool create); static pgssEntry* pgsm_get_entry_for_query(uint64 queryid, PlanInfo *plan_info, const char* query_text, int query_len, bool create);
static void pgsm_print_entrys_list(void); static void pgsm_print_entrys_list(void);
static void pgsm_cleanup_callback(void *arg); static void pgsm_cleanup_callback(void *arg);
static void pgsm_store_error(const char *query, ErrorData *edata); static void pgsm_store_error(const char *query, ErrorData *edata);
@ -742,13 +742,16 @@ pgsm_ExecutorEnd(QueryDesc *queryDesc)
if (queryId != UINT64CONST(0) && queryDesc->totaltime && pgsm_enabled(exec_nested_level)) if (queryId != UINT64CONST(0) && queryDesc->totaltime && pgsm_enabled(exec_nested_level))
{ {
// elog(NOTICE,"**Hoping for list entryof query: %s",queryDesc->sourceText); // elog(NOTICE,"**Hoping for list entryof query: %s",queryDesc->sourceText);
entry = pgsm_get_entry_for_query(queryId, queryDesc->sourceText, strlen(queryDesc->sourceText), true); entry = pgsm_get_entry_for_query(queryId, plan_ptr, queryDesc->sourceText, strlen(queryDesc->sourceText), true);
if(!entry) if(!entry)
{ {
elog(NOTICE,"Failed to find entry for [%lu] %s",queryId, queryDesc->sourceText); elog(NOTICE,"Failed to find entry for [%lu] %s",queryId, queryDesc->sourceText);
pgsm_print_entrys_list(); pgsm_print_entrys_list();
} }
if (entry->key.planid == 0)
entry->key.planid = (plan_ptr) ? plan_ptr->planid : 0;
/* /*
* Make sure stats accumulation is done. (Note: it's okay if several * Make sure stats accumulation is done. (Note: it's okay if several
* levels of hook all do this.) * levels of hook all do this.)
@ -878,7 +881,7 @@ pgsm_planner_hook(Query *parse, const char *query_string, int cursorOptions, Par
*/ */
// elog(NOTICE,"%s:%s",__FUNCTION__,query_string); // elog(NOTICE,"%s:%s",__FUNCTION__,query_string);
if (MemoryContextIsValid(MessageContext)) if (MemoryContextIsValid(MessageContext))
entry = pgsm_get_entry_for_query(parse->queryId, query_string, strlen(query_string), true); entry = pgsm_get_entry_for_query(parse->queryId, NULL, query_string, strlen(query_string), true);
if (pgsm_enabled(plan_nested_level + exec_nested_level) && if (pgsm_enabled(plan_nested_level + exec_nested_level) &&
@ -1450,12 +1453,16 @@ pgsm_update_entry(pgssEntry *entry,
} }
} }
if (plan_text_len > 0 && !e->counters.planinfo.plan_text[0])
{
e->counters.planinfo.planid = plan_info->planid;
e->counters.planinfo.plan_len = plan_text_len;
_snprintf(e->counters.planinfo.plan_text, plan_info->plan_text, plan_text_len + 1, PLAN_TEXT_LEN);
}
/* Only should process this once when storing the data */ /* Only should process this once when storing the data */
if (kind == PGSM_STORE) if (kind == PGSM_STORE)
{ {
if (plan_text_len > 0 && !e->counters.planinfo.plan_text[0])
_snprintf(e->counters.planinfo.plan_text, plan_info->plan_text, plan_text_len + 1, PLAN_TEXT_LEN);
app_name_len = pg_get_application_name(app_name, APPLICATIONNAME_LEN); app_name_len = pg_get_application_name(app_name, APPLICATIONNAME_LEN);
if (app_name_len > 0 && !e->counters.info.application_name[0]) if (app_name_len > 0 && !e->counters.info.application_name[0])
@ -1620,7 +1627,7 @@ pgsm_add_to_list(pgssEntry *entry, char *query_text, int query_len, bool should_
} }
static pgssEntry* static pgssEntry*
pgsm_get_entry_for_query(uint64 queryid, const char* query_text, int query_len, bool create) pgsm_get_entry_for_query(uint64 queryid, PlanInfo *plan_info, const char* query_text, int query_len, bool create)
{ {
pgssEntry *entry = NULL; pgssEntry *entry = NULL;
ListCell *lc = NULL; ListCell *lc = NULL;
@ -1651,7 +1658,7 @@ pgsm_get_entry_for_query(uint64 queryid, const char* query_text, int query_len,
* The correct bucket value will be needed then to search the hash table, or create * The correct bucket value will be needed then to search the hash table, or create
* the appropriate entry. * the appropriate entry.
*/ */
entry = pgsm_create_hash_entry(MessageContext, 0, queryid, NULL); entry = pgsm_create_hash_entry(MessageContext, 0, queryid, plan_info);
/* Update other member that are not counters, so that we don't have to worry about these. */ /* Update other member that are not counters, so that we don't have to worry about these. */
entry->pgsm_query_id = pgss_hash_string(query_text, query_len); entry->pgsm_query_id = pgss_hash_string(query_text, query_len);