@@ -110,6 +110,7 @@ struct DmqSharedState
110
110
dsm_handle dsm_h ;
111
111
int procno ;
112
112
bool active ;
113
+ pid_t pid ;
113
114
} receivers [DMQ_MAX_RECEIVERS ];
114
115
115
116
} * dmq_state ;
@@ -317,6 +318,23 @@ fe_send(PGconn *conn, char *msg, size_t len)
317
318
return 0 ;
318
319
}
319
320
321
+ static void
322
+ dmq_sender_at_exit (int status , Datum arg )
323
+ {
324
+ int i ;
325
+
326
+ LWLockAcquire (dmq_state -> lock , LW_SHARED );
327
+ for (i = 0 ; i < dmq_state -> n_receivers ; i ++ )
328
+ {
329
+ if (dmq_state -> receivers [i ].active &&
330
+ dmq_state -> receivers [i ].pid > 0 )
331
+ {
332
+ kill (dmq_state -> receivers [i ].pid , SIGTERM );
333
+ }
334
+ }
335
+ LWLockRelease (dmq_state -> lock );
336
+ }
337
+
320
338
void
321
339
dmq_sender_main (Datum main_arg )
322
340
{
@@ -329,6 +347,8 @@ dmq_sender_main(Datum main_arg)
329
347
330
348
double prev_timer_at = dmq_now ();
331
349
350
+ on_shmem_exit (dmq_sender_at_exit , (Datum ) 0 );
351
+
332
352
/* init this worker */
333
353
pqsignal (SIGHUP , dmq_sighup_handler );
334
354
pqsignal (SIGTERM , die );
@@ -662,12 +682,10 @@ dmq_sender_main(Datum main_arg)
662
682
}
663
683
else if (nevents > 0 && event .events & WL_POSTMASTER_DEATH )
664
684
{
665
- exit (1 );
685
+ proc_exit (1 );
666
686
}
667
687
668
688
CHECK_FOR_INTERRUPTS ();
669
-
670
- // XXX: handle WL_POSTMASTER_DEATH ?
671
689
}
672
690
FreeWaitEventSet (set );
673
691
@@ -997,6 +1015,7 @@ dmq_receiver_loop(PG_FUNCTION_ARGS)
997
1015
dmq_state -> receivers [receiver_id ].dsm_h = dsm_segment_handle (seg );
998
1016
dmq_state -> receivers [receiver_id ].procno = MyProc -> pgprocno ;
999
1017
dmq_state -> receivers [receiver_id ].active = true;
1018
+ dmq_state -> receivers [receiver_id ].pid = MyProcPid ;
1000
1019
LWLockRelease (dmq_state -> lock );
1001
1020
1002
1021
on_shmem_exit (dmq_receiver_at_exit , Int32GetDatum (receiver_id ));
@@ -1075,6 +1094,13 @@ dmq_receiver_loop(PG_FUNCTION_ARGS)
1075
1094
ResetLatch (MyLatch );
1076
1095
}
1077
1096
1097
+ if (nevents > 0 && event .events & WL_POSTMASTER_DEATH )
1098
+ {
1099
+ ereport (FATAL ,
1100
+ (errcode (ERRCODE_ADMIN_SHUTDOWN ),
1101
+ errmsg ("[DMQ] exit receiver due to unexpected postmaster exit" )));
1102
+ }
1103
+
1078
1104
// XXX: is it enough?
1079
1105
CHECK_FOR_INTERRUPTS ();
1080
1106
0 commit comments