Re: exactly what is COPY BOTH mode supposed to do in case of an error?

Поиск
Список
Период
Сортировка
От Robert Haas
Тема Re: exactly what is COPY BOTH mode supposed to do in case of an error?
Дата
Msg-id CA+TgmoY7Gwy0b2Cdc4rf_0_nF24roROMPdAmEiDsmZO+dcxW-w@mail.gmail.com
обсуждение исходный текст
Ответ на Re: exactly what is COPY BOTH mode supposed to do in case of an error?  (Simon Riggs <simon@2ndQuadrant.com>)
Ответы Re: exactly what is COPY BOTH mode supposed to do in case of an error?  (Simon Riggs <simon@2ndQuadrant.com>)
Список pgsql-hackers
On Sat, Apr 27, 2013 at 6:02 AM, Simon Riggs <simon@2ndquadrant.com> wrote:
> On 27 April 2013 03:22, Robert Haas <robertmhaas@gmail.com> wrote:
>> It seems the backend and libpq don't agree.  The backend makes no
>> special provision to wait for a CopyDone message if an error occurs
>> during copy-both.  It simply sends an ErrorResponse and that's it.
>> libpq, on the other hand, treats either CopyDone or ErrorResponse as a
>> cue to transition to PGASYNC_COPY_IN (see pqGetCopyData3).
>
> Well spotted, and good detective work.

Thanks.

>> I'm attaching a patch which adopts the position that the backend is
>> right and libpq is wrong.  The opposite approach is also possible, but
>> I haven't tried to implement it.  Or maybe there's a third way which
>> is better still.
>
> I guess if we assume this only affects replication we could change it
> at either end, not sure about that.
>
> libpq updates are much harder to roll out, so it would be better to
> assume that it is correct and the backend is wrong if we want to
> backpatch the fix.
>
> Not sure if that is a lot of work?

My feeling is that it would be better not to back-patch this, but just
fix it in master.  Given the present uses of COPY-BOTH mode, the
problems seem to be limited to bad error messages, so it's arguably
not a critical bug fix.  Also, I think that no matter which way we fix
it, people who upgrade the master to a new point release, but not
pg_receivexlog, would in some unlikely cases actually experience a
regression in the quality of error messages.  I would say we have to
live with that if the consequences were any worse than bad error
messages in the first place, but as far as I can tell they're not.  If
someone can contrive a scenario where this causes outright breakage,
that would tip the balance for me, but I don't at present see such a
hazard.

On a practical level, the main thing I didn't like about trying to fix
the server was the same issue that Tom mentioned: we'd need code in
the server to track whether COPY-BOTH mode is active and skip client
messages until we hit a CopyDone or CopyFail message.  And I suspect
that code would be somewhat fragile, because having sent an
ErrorResponse already, we'd have no straightforward way to report a
further error - we'd need to report follow-on errors via NOTICE or
FATAL.  Now this is not a disaster, but it's not great, either,
because there's a lot of code (including, notably, palloc) which
assumes that it can throw an ERROR whenever it likes.  And in this
case, it couldn't.

The second thing I didn't like about that approach was that it would
make COPY-BOTH quite asymmetrical with both COPY-OUT and COPY-IN.
That didn't seem like a great idea, either.

A further point is that the problems in the back branches are less
serious anyway, because the timeline-switching code is the only thing
that ever tries to exit COPY-BOTH mode without closing the connection,
and that's new in 9.3.

So for all those reasons, my vote is for a client-side, master-only fix.

...Robert



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: pg_ctl non-idempotent behavior change
Следующее
От: Robert Haas
Дата:
Сообщение: Re: Remaining beta blockers