Re: [HACKERS] [PATCH] New command to monitor progression of longrunning queries - Mailing list pgsql-hackers

From Maksim Milyutin
Subject Re: [HACKERS] [PATCH] New command to monitor progression of longrunning queries
Date
Msg-id 50972bf9-e509-4e56-bd51-a7beae3af1b3@postgrespro.ru
Whole thread Raw
In response to Re: [HACKERS] [PATCH] New command to monitor progression of longrunning queries  (Remi Colinet <remi.colinet@gmail.com>)
Responses Re: [HACKERS] [PATCH] New command to monitor progression of longrunning queries  (Remi Colinet <remi.colinet@gmail.com>)
List pgsql-hackers
On 18.04.2017 17:39, Remi Colinet wrote:
> Hello Maksim,
>
> The core implementation I suggested for the new PROGRESS command uses
> different functions from the one used by EXPLAIN for its core
> implementation.
> Some source code is shared with EXPLAIN command. But this shared code is
> only related to quals, properties, children, subPlans and few other nodes.
>
> All other code for PROGRESS is new code.
>
> I don't believe explain.c code can be fully shared with the one of the
> new PROGRESS command. These 2 commands have different purposes.
> The core code used for the new PROGRESS command is very different from
> the core code used for EXPLAIN.
>

Perhaps you will be forced to duplicate significant snippets of 
functionality from explain.c into your progress.c.

>
> Regarding the queryDesc state of SQL query upon receiving a request to
> report its execution progress, it does not bring any issue. The request
> is noted when the signal is received by the monitored backend. Then, the
> backend continues its execution code path. When interrupts are checked
> in the executor code, the request will be dealt.
>

Yes, interrupts are checked in the CHECK_FOR_INTERRUPTS entries.

> When the request is being dealt, the monitored backend will stop its
> execution and report the progress of the SQL query. Whatever is the
> status of the SQL query, progress.c code checks the status and report
> either that the SQL query does not have a valid status, or otherwise the
> current execution state of the SQL query.
>
> SQL query status checking is about:
> - idle transaction
> - out of transaction status
> - null planned statement
> - utility command
> - self monitoring
>
> Other tests can be added if needed to exclude some SQL query state. Such
> checking is done in void HandleProgressRequest(void).
> I do not see why a SQL query progression would not be possible in this
> context. Even when the queryDescc is NULL, we can just report a <idle
> transaction> output. This is currently the case with the patch suggested.
>

It's interesting question - how much the active query is in a usable 
state on the stage of execution. Tom Lane noticed that 
CHECK_FOR_INTERRUPTS doesn't give us 100% guarantee about full 
consistency [1].

> So far, I've found this new command very handy. It allows to evaluate
> the time needed to complete a SQL query.
>

Could you explain how you get the percent of execution for nodes of plan 
tree and overall for query?

> A further improvement would be to report the memory, disk and time
> resources used by the monitored backend. An overuse of memory, disk and
> time resources can prevent the SQL query to complete.
>

This functionality is somehow implemented in explain.c. You can see my 
patch to this file [2]. I only manipulate runtime statistics (data in 
the structure 'Instrumentation') to achieve the printing state of 
running query.


1. https://www.postgresql.org/message-id/24182.1472745492%40sss.pgh.pa.us
2. 
https://github.com/postgrespro/pg_query_state/blob/master/runtime_explain.patch

-- 
Maksim Milyutin
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company



pgsql-hackers by date:

Previous
From: Fujii Masao
Date:
Subject: Re: [HACKERS] Quorum commit for multiple synchronous replication.
Next
From: Petr Jelinek
Date:
Subject: Re: [HACKERS] Why does logical replication launcher setapplication_name?