[pgpool-hackers: 3900] sigusr1_interrupt_processor() does not	process all pending requests
    Tatsuo Ishii 
    ishii at sraoss.co.jp
       
    Tue May 18 15:51:38 JST 2021
    
    
  
sigusr1_interrupt_processor() is a routine used by watchdog. When a
process sends SIGUSR1 signal to the parent pgpool process, it
associates the request details in an array in the shared memory.
typedef enum
{
	SIG_FAILOVER_INTERRUPT,		/* signal main to start failover */
	SIG_WATCHDOG_STATE_CHANGED, /* notify main about local watchdog node state
								 * changed */
	SIG_BACKEND_SYNC_REQUIRED,	/* notify main about local backend state sync
								 * required */
	SIG_WATCHDOG_QUORUM_CHANGED,	/* notify main about cluster quorum change
									 * of watchdog cluster */
	SIG_INFORM_QUARANTINE_NODES, /* notify main about send degenerate requests
								 * for all quarantine nodes */
	MAX_INTERRUPTS				/* Must be last! */
}			User1SignalReason;
typedef struct User1SignalSlot
{
	sig_atomic_t signalFlags[MAX_INTERRUPTS];
}			User1SignalSlot;
And sigusr1_interrupt_processor() is called in the initialize phase
and while SIGUSR1 is fired.
#define CHECK_REQUEST \
	do { \
		if (wakeup_request) \
		{ \
			wakeup_children(); \
			wakeup_request = 0; \
		} \
		if (sigusr1_request) \
		{ \
Looking into the code of sigusr1_interrupt_processor(), it seems
sigusr1_interrupt_processor() is assumed that it processes all the
request details in sigalFlags array even if there are multiple details
in the array. But actually it's not. I have added a small routine to
verify whether non processed value remains in the array and ran
regression test 18. It appeared that after execution of
sigusr1_interrupt_processor() still the array holds remaining pending
request:
t-ishii$ grep signalFlags pgpool[0-2]/log/pgpool.log
pgpool1/log/pgpool.log:2021-05-18 15:25:58: main pid 12696: LOG:  signalFlags: 3 is true
pgpool2/log/pgpool.log:2021-05-18 15:25:58: main pid 12700: LOG:  signalFlags: 3 is true
pgpool2/log/pgpool.log:2021-05-18 15:26:04: main pid 12700: LOG:  signalFlags: 3 is true
Note that "3" is SIG_WATCHDOG_QUORUM_CHANGED.
I don't know if this actually gives some bad effects to pgpool or not
but I think at least we need to confirm that.
Comments?
Patch for the test attached.
Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: check.diff
Type: text/x-patch
Size: 1504 bytes
Desc: not available
URL: <http://www.pgpool.net/pipermail/pgpool-hackers/attachments/20210518/6cd03ba3/attachment.bin>
    
    
More information about the pgpool-hackers
mailing list