[HACKERS] libpqrcv_PQexec() seems to violate latch protocol
От | Andres Freund |
---|---|
Тема | [HACKERS] libpqrcv_PQexec() seems to violate latch protocol |
Дата | |
Msg-id | 20170606210405.sim3yl6vpudhmufo@alap3.anarazel.de обсуждение исходный текст |
Ответы |
Re: [HACKERS] libpqrcv_PQexec() seems to violate latch protocol
|
Список | pgsql-hackers |
Hi, The function in $subject does: while (PQisBusy(streamConn)) { int rc; /* * We don't need to break down the sleep into smaller increments, * since we'll get interruptedby signals and can either handle * interrupts here or elog(FATAL) within SIGTERM signal handler if * the signal arrives in the middle of establishment of * replication connection. */ ResetLatch(&MyProc->procLatch); rc = WaitLatchOrSocket(&MyProc->procLatch, WL_POSTMASTER_DEATH | WL_SOCKET_READABLE | WL_LATCH_SET, PQsocket(streamConn), 0, WAIT_EVENT_LIBPQWALRECEIVER); if (rc & WL_POSTMASTER_DEATH) exit(1); /* interrupted */ if (rc & WL_LATCH_SET) { CHECK_FOR_INTERRUPTS(); continue; } Doing ResetLatch();WaitLatch() like that makes it possible to miss a the latch being set, e.g. if it happens just after WaitLatchOrSocket() returns. Afaict, the ResetLatch() really should just instead be in the if (rc & WL_LATCH_SET) block. Unless somebody protests, I'll make it so. Greetings, Andres Freund
В списке pgsql-hackers по дате отправления: