Re: Add the replication origin name and commit-LSN to logical replication worker errcontext

Masahiko Sawada <sawada.mshk@gmail.com>

From: Masahiko Sawada <sawada.mshk@gmail.com>
To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Cc: amit.kapila16@gmail.com, pgsql-hackers@lists.postgresql.org
Date: 2022-03-02T08:11:44Z
Lists: pgsql-hackers
On Wed, Mar 2, 2022 at 4:07 PM Kyotaro Horiguchi
<horikyota.ntt@gmail.com> wrote:
>
> At Wed, 2 Mar 2022 14:39:54 +0900, Masahiko Sawada <sawada.mshk@gmail.com> wrote in
> > On Wed, Mar 2, 2022 at 11:55 AM Amit Kapila <amit.kapila16@gmail.com> wrote:
> > >
> > > On Mon, Feb 28, 2022 at 5:46 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> > > >
> > > > I've attached two patches: the first one changes
> > > > apply_error_callback() so that it uses complete sentences with if-else
> > > > blocks in order to have a translation work,
> > > >
> > >
> > > This is an improvement over what we have now but I think this is still
> > > not completely correct as per message translation rules:
> > > + else
> > > + errcontext("processing remote data during \"%s\" in transaction %u at %s",
> > > +    logicalrep_message_type(errarg->command),
> > > +    errarg->remote_xid,
> > > +    (errarg->ts != 0) ? timestamptz_to_str(errarg->ts) : "(not-set)");
> > >
> > > As per guidelines [1][2], we don't prefer to construct messages at
> > > run-time aka we can do better for the following part: +    (errarg->ts
> > > != 0) ? timestamptz_to_str(errarg->ts) : "(not-set)". I think we need
> > > to use if-else here to split it further. If you agree, then the same
> > > needs to be dealt with in other parts of the patch as well.
> >
> > I intended to use "(not-set)" as a value rather than a word in the
> > sentence so I think it doesn't violate the guidelines. We can split it
> > further as you suggested but we will end up having more if-else
> > branches.
>
> It seems to me exactly our way.  In the first place I doubt
> "(not-set)" fits the place for timestamp even in English.
>
> Moreover, if we (I?) translated the message into Japanese, it would
> look like;
>
> CONTEXT: (not-set)にトランザクション 2352314 内で "TRUNCATE" でのリモートデータの処理中
>
> I don't think that looks fine.  Translating "(not-set)" makes things
> even worse.
>
> CONTEXT: (非設定)にトランザクション 2352314 内で "TRUNCATE" でのリモートデータの処理中
>
> Yes, I can alleviate that strangeness a bit by modulating it, but it
> still looks odd.

Indeed. But the timestamp is removed in the latest version patch.

>
> CONTEXT: 時刻(非設定)、トランザクション 2352314 内で "TRUNCATE" でのリモートデータの処理中
>
> Rather, I'd prefer simply to list the attributes.
>
> CONTEXT: processing remote data during "MESSAGE". Transaction (unknown). Time (unknown), replication target relation (unknown), column (unknown)
> CONTEXT: "MESSAGE"でのリモートデータの処理中. トランザクション (不明). 時刻 (不明), レプリケーション対象リレーション (不明), column (不明)

Peter Smith also seems to prefer this style. Looking at existing error
context messages, we use this list style in logical.c:

static void
output_plugin_error_callback(void *arg)
{
    LogicalErrorCallbackState *state = (LogicalErrorCallbackState *) arg;

    /* not all callbacks have an associated LSN  */
    if (state->report_location != InvalidXLogRecPtr)
        errcontext("slot \"%s\", output plugin \"%s\", in the %s
callback, associated LSN %X/%X",
                   NameStr(state->ctx->slot->data.name),
                   NameStr(state->ctx->slot->data.plugin),
                   state->callback_name,
                   LSN_FORMAT_ARGS(state->report_location));
    else
        errcontext("slot \"%s\", output plugin \"%s\", in the %s callback",
                   NameStr(state->ctx->slot->data.name),
                   NameStr(state->ctx->slot->data.plugin),
                   state->callback_name);

}

Regards,

--
Masahiko Sawada
EDB:  https://www.enterprisedb.com/



Commits

  1. Add the additional information to the logical replication worker errcontext.

  2. Make the errcontext message in logical replication worker translation friendly.

  3. Add logical change details to logical replication worker errcontext.