On Wed, 24 Jan 2024 22:17:44 +0900 Yugo NAGATA <nag...@sraoss.co.jp> wrote: > Attached is the updated patch, v6.
Currently, on non-Windows, SIGINT is received only by thread #0. CancelRequested is checked during the loop in the thread, and queries are cancelled if it is set. However, once thread #0 exits the loop due to some runtime error and starts waiting in pthread_join, there is no opportunity to cancel queries run by other threads. In addition, if -C option is specified, connections are created for each transaction, so cancel objects (PGcancel) also have to be recreated at each time in each thread. However, these cancel objects are used in a specific thread to perform cancel for all queries, which is not safe because a thread refers to objects updated by other threads. I think the first problem would be addressed by any of followings. (1a) Perform cancels in the signal handler. The signal handler will be called even while the thread 0 is blocked in pthread_join. This is safe because PQcancel is callable from a signal handler. (1b) Create an additional dedicated thread that calls sigwait on SIGINT and performs query cancel. As far as I studied, creating such dedicated thread calling sigwait is a typical way to handle signal in multi-threaded programming. (1c) Each thread performs cancel for queries run by each own, rather than that thread 0 cancels all queries. For the purpose, pthread_kill might be used to interrupt threads blocked in wait_on_socket_set. The second one would be addressed by any of followings. (2a) Use critical section when accessing PGcancel( e.g by using pthread_mutex (non-Windows) or EnterCriticalSection (Windows)). On non-Windows, we cannot use this way when calling PQcancel in a signal handler ((1a) above) because acquiring a lock is not re-entrant. (2b) Perform query cancel in each thread that has created the connection (same as (1c) above). Considering both, possible combination would be either (1b)&(2a) or (1c)&(2b). I would prefer the former way, because creating the dedicated thread handling SIGINT signal and canceling all queries seems simpler and safer than calling pthread_kill in the SIGINT signal handler to send another signal to other threads. I'll update the patch in this way soon. Regards, Yugo Nagata > > > Best reagards, > > -- > > Tatsuo Ishii > > SRA OSS LLC > > English: http://www.sraoss.co.jp/index_en/ > > Japanese:http://www.sraoss.co.jp > > > > > > > -- > Yugo NAGATA <nag...@sraoss.co.jp> -- Yugo NAGATA <nag...@sraoss.co.jp>