Re: parallel workers and client encoding
От | Robert Haas |
---|---|
Тема | Re: parallel workers and client encoding |
Дата | |
Msg-id | CA+TgmoZa7LjnUG5EOEaSWBqPzRpPbwnCZPDjJzyvQ38TMNNGCg@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: parallel workers and client encoding (Robert Haas <robertmhaas@gmail.com>) |
Ответы |
Re: parallel workers and client encoding
|
Список | pgsql-hackers |
On Mon, Jun 27, 2016 at 12:53 PM, Robert Haas <robertmhaas@gmail.com> wrote: > On Mon, Jun 13, 2016 at 10:27 PM, Peter Eisentraut > <peter.eisentraut@2ndquadrant.com> wrote: >> Modulo that last point, here is a patch that shows how I think this could >> work, in combination with the patch I posted previously that sets the >> "client encoding" in the parallel worker to the server encoding. >> >> This patch disassembles the NotificationResponse message with a temporary >> client encoding, and then sends it off to the real frontend using the real >> client encoding. >> >> Doing it this way also takes care of a few special cases that >> NotifyMyFrontEnd() handles, such as a client with protocol version 2 that >> doesn't expect a payload in the message. > > How does this address the concern raised in the last sentence of > https://www.postgresql.org/message-id/CA+TgmoaAAEXmjVMB4nM=znF_5b9JhUim6q3aFrO4SpT23TiN8g@mail.gmail.com > ? It seems that if an error occurs between the two SetClientEncoding > calls, the change will persist for the rest of the session, resulting > in chaos. Please find attached an a patch for a proposed alternative approach. This does the following: 1. When the client_encoding GUC is changed in the worker, SetClientEncoding() is not called. Thus, GetClientEncoding() in the worker always returns the database encoding, regardless of how the client encoding is set. This is better than your approach of calling SetClientEncoding() during worker startup, I think, because the worker could call a parallel-safe function with SET clause, and one of the GUCs temporarily set could be client_encoding. That would be stupid, but somebody could do it. 2. A new function pq_getmsgrawstring() is added. This is like pq_getmsgstring() but it does no encoding conversion. pq_parse_errornotice() is changed to use pq_getmsgrawstring() instead of pq_getmsgstring(). Because of (1), when the leader receives an ErrorResponse or NoticeResponse from the worker, it will not have been subject to encoding conversion; because of this item, the leader will not try to convert it either when initially parsing it. So the extra encoding round-trip is avoided. 3. The changes for NotifyResponse which you proposed are included here, but with the modification that pq_getmsgrawstring() is used. This seems to fix your original test case for me, and hopefully all of the related cases also. Review is appreciated. The main thing about this is that it doesn't rely on being able to make temporary changes to global variables, thus hopefully making it robust in the face of non-local transfer of control. (Official status update: I'll commit this on Thursday unless anyone reports a problem with it before then.) -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Вложения
В списке pgsql-hackers по дате отправления: