| From: | Yugo NAGATA <nagata(at)sraoss(dot)co(dot)jp> |
|---|---|
| To: | Kirk Wolak <wolakk(at)gmail(dot)com> |
| Cc: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
| Subject: | Re: pgbnech: allow to cancel queries during benchmark |
| Date: | 2023-06-27 07:48:45 |
| Message-ID: | 20230627164845.b6151e1740a4494dd1f21ab9@sraoss.co.jp |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Mon, 26 Jun 2023 12:59:21 -0400
Kirk Wolak <wolakk(at)gmail(dot)com> wrote:
> On Mon, Jun 26, 2023 at 9:46 AM Yugo NAGATA <nagata(at)sraoss(dot)co(dot)jp> wrote:
>
> > Hello,
> >
> > This attached patch enables pgbench to cancel queries during benchmark.
> >
> > Formerly, Ctrl+C during benchmark killed pgbench immediately, but backend
> > processes executing long queries remained for a while. You can simply
> > reproduce this problem by cancelling the pgbench running a custom script
> > executing "SELECT pg_sleep(10)".
> >
> > The patch fixes this so that cancel requests are sent for all connections
> > on
> > Ctrl+C, and all running queries are cancelled before pgbench exits.
> >
> > In thread #0, setup_cancel_handler is called before the loop, the
> > CancelRequested flag is set when Ctrl+C is issued. In the loop, cancel
> > requests are sent when the flag is set only in thread #0. SIGINT is
> > blocked in other threads, but the threads will exit after their query
> > are cancelled. If thread safety is disabled or OS is Windows, the signal
> > is not blocked because pthread_sigmask cannot be used.
> > (I didn't test the patch on WIndows yet, though.)
> >
> > I choose the design that the signal handler and the query cancel are
> > performed only in thread #0 because I wanted to make the behavior as
> > predicable as possible. However, another design that all thread can
> > received SIGINT and that the first thread that catches the signal is
> > responsible to sent cancel requests for all connections may also work.
> >
> > Also, the array of CState that contains all clients state is changed to
> > a global variable so that all connections can be accessed within a thread.
> >
> >
> > +1
> I also like the thread #0 handling design. I have NOT reviewed/tested
> this yet.
Thank you for your comment.
As a side note, actually I thought another design to create a special thread
for handling query cancelling in which SIGINT would be catched by sigwait,
I quit the idea because it would add complexity due to code for Windows and
--disabled-thread-safe.
I would appreciate it if you could kindly review and test the patch!
Regards,
Yugo Nagata
--
Yugo NAGATA <nagata(at)sraoss(dot)co(dot)jp>
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Peter Geoghegan | 2023-06-27 08:10:25 | Re: ReadRecentBuffer() doesn't scale well |
| Previous Message | Hayato Kuroda (Fujitsu) | 2023-06-27 07:42:49 | RE: [PATCH] Reuse Workers and Replication Slots during Logical Replication |