Re: RFC: Logging plan of the running query - Mailing list pgsql-hackers
From | Bharath Rupireddy |
---|---|
Subject | Re: RFC: Logging plan of the running query |
Date | |
Msg-id | CALj2ACUpznbsLbOg9mauSQZfU2eDxnNLYXcBHaAp1yWxMKLK9g@mail.gmail.com Whole thread Raw |
In response to | Re: RFC: Logging plan of the running query (torikoshia <torikoshia@oss.nttdata.com>) |
Responses |
Re: RFC: Logging plan of the running query
|
List | pgsql-hackers |
On Wed, Jun 9, 2021 at 1:14 PM torikoshia <torikoshia@oss.nttdata.com> wrote: > Updated the patch. Thanks for the patch. Here are some comments on v3 patch: 1) We could just say "Requests to log query plan of the presently running query of a given backend along with an untruncated query string in the server logs." Instead of + They will be logged at <literal>LOG</literal> message level and + will appear in the server log based on the log + configuration set (See <xref linkend="runtime-config-logging"/> 2) It's better to do below, for reference see how pg_backend_pid, pg_terminate_backend, pg_relpages and so on are used in the tests. +SELECT pg_log_current_plan(pg_backend_pid()); rather than using the function in the FROM clause. +SELECT * FROM pg_log_current_plan(pg_backend_pid()); If okay, also change it for pg_log_backend_memory_contexts. 3) Since most of the code looks same in pg_log_backend_memory_contexts and pg_log_current_plan, I think we can have a common function something like below: bool SendProcSignalForLogInfo(ProcSignalReason reason) { Assert(reason == PROCSIG_LOG_MEMORY_CONTEXT || reason == PROCSIG_LOG_CURRENT_PLAN); if (!superuser()) { if (reason == PROCSIG_LOG_MEMORY_CONTEXT) errmsg("must be a superuser to log memory contexts") else if (reason == PROCSIG_LOG_CURRENT_PLAN) errmsg("must be a superuser to log plan of the running query") } if (SendProcSignal(pid, reason, proc->backendId) < 0) { } } Then we could just do: Datum pg_log_backend_memory_contexts(PG_FUNCTION_ARGS) { PG_RETURN_BOOL(SendProcSignalForLogInfo(PROCSIG_LOG_MEMORY_CONTEXT)); } Datum pg_log_current_plan(PG_FUNCTION_ARGS) { PG_RETURN_BOOL(SendProcSignalForLogInfo(PROCSIG_LOG_CURRENT_PLAN)); } We can have SendProcSignalForLogInfo function defined in procsignal.c and procsignal.h 4) I think we can have a sample function usage and how it returns true value, how the plan looks for a simple query(select 1 or some other simple/complex generic query or simply select pg_log_current_plan(pg_backend_pid());) in the documentation, much like pg_log_backend_memory_contexts. 5) Instead of just showing the true return value of the function pg_log_current_plan in the sql test, which just shows that the signal is sent, but it doesn't mean that the backend has processed that signal and logged the plan. I think we can add the test using TAP framework, one 6) Do we unnecessarily need to signal the processes such as autovacuum launcher/workers, logical replication launcher/workers, wal senders, wal receivers and so on. only to emit a "PID %d is not executing queries now" message? Moreover, those processes will be waiting in loops for timeouts to occur, then as soon as they wake up do they need to process this extra uninformative signal? We could choose to not signal those processes at all which might or might not be possible. Otherwise, we could just emit messages like "XXXX process cannot run a query" in ProcessInterrupts. 7)Instead of (errmsg("logging plan of the running query on PID %d\n%s", how about below? (errmsg("plan of the query running on backend with PID %d is:\n%s", 8) Instead of errmsg("PID %d is not executing queries now") how about below? errmsg("Backend with PID %d is not running a query") 9) We could just do: void ProcessLogCurrentPlanInterrupt(void) { ExplainState *es; LogCurrentPlanPending = false; if (!ActivePortal || !ActivePortal->queryDesc) errmsg("PID %d is not executing queries now"); es = NewExplainState(); ExplainQueryText(); ExplainPrintPlan(); 10) How about renaming the function pg_log_current_plan to pg_log_query_plan or pg_log_current_query_plan? 11) What happens if pg_log_current_plan is called for a parallel worker? With Regards, Bharath Rupireddy.
pgsql-hackers by date: