From: | "Drouvot, Bertrand" <bertranddrouvot(dot)pg(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Andres Freund <andres(at)anarazel(dot)de> |
Cc: | Robert Haas <robertmhaas(at)gmail(dot)com>, Jeff Davis <pgsql(at)j-davis(dot)com>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, Amit Khandekar <amitdkhan(dot)pg(at)gmail(dot)com>, fabriziomello(at)gmail(dot)com, tushar <tushar(dot)ahuja(at)enterprisedb(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Melanie Plageman <melanieplageman(at)gmail(dot)com> |
Subject: | Re: Minimal logical decoding on standbys |
Date: | 2023-04-04 16:54:33 |
Message-ID: | 925827e9-828f-a65c-a62d-eb95a7685be4@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
On 4/4/23 1:21 PM, Alvaro Herrera wrote:
> Hi,
>
> On 2023-Apr-03, Andres Freund wrote:
>
>> Hm? That's what the _'s do. We build strings in parts in other places too.
>
> No, what _() does is mark each piece for translation separately. But a
> translation cannot be done on string pieces, and later have all the
> pieces appended together to form a full sentence. Let me show the
> "!terminating" case as example and grab some translations for it from
> src/backend/po/de.po:
>
> "invalidating" -> "... wird ungültig gemacht" (?)
>
> (if logical) " obsolete replication" -> " obsolete Replikation"
>
> " slot \"%s\" because it conflicts with recovery" -> " Slot \"%s\", weil sie in Konflikt mit Wiederherstellung steht"
>
> If you just concatenate all the translated phrases together, the
> resulting string will make no sense; keep in mind the "obsolete
> replication" part may or not may not be there. And there's no way to
> make that work: even if you found an ordering of the English parts that
> allows you to translate each piece separately and have it make sense for
> German, the same won't work for Spanish or Japanese.
>
> You have to give the translator a complete phrase and let them turn into
> a complete translated phrases. Building from parts doesn't work. We're
> very good at avoiding string building; we have a couple of cases, but
> they are *very* minor.
>
> string 1 "invalidating slot \"%s\" because it conflicts with recovery"
>
> string 2 "invalidating obsolete replication slot \"%s\" because it conflicts with recovery"
>
Thanks for looking at it and the explanations!
> (I'm not clear on why did Bertrand omitted the word "replication" in the
> case where the slot is not logical)
It makes more sense to add it, will do thanks!
>
> I think the errdetail() are okay, it's the errmsg() bits that are bogus.
> And yes, well caught on having to use errmsg_internal and
> errdetail_internal() to avoid double translation.
>
So, IIUC having something like this would be fine?
"
if (check_on_xid)
{
if (terminating)
appendStringInfo(&err_msg, _("terminating process %d to release replication slot \"%s\" because it conflicts with recovery"),
pid,
NameStr(slotname));
else
appendStringInfo(&err_msg, _("invalidating replication slot \"%s\" because it conflicts with recovery"),
NameStr(slotname));
if (TransactionIdIsValid(*xid))
appendStringInfo(&err_detail, _("The slot conflicted with xid horizon %u."), *xid);
else
appendStringInfo(&err_detail, _("Logical decoding on standby requires wal_level to be at least logical on the primary server"));
}
else
{
if (terminating)
appendStringInfo(&err_msg, _("terminating process %d to release replication slot \"%s\""),
pid,
NameStr(slotname));
else
appendStringInfo(&err_msg, _("invalidating obsolete replication slot \"%s\""),
NameStr(slotname));
appendStringInfo(&err_detail, _("The slot's restart_lsn %X/%X exceeds the limit by %llu bytes."),
LSN_FORMAT_ARGS(restart_lsn),
(unsigned long long) (oldestLSN - restart_lsn));
hint = true;
}
ereport(LOG,
errmsg_internal("%s", err_msg.data),
errdetail_internal("%s", err_detail.data),
hint ? errhint("You might need to increase max_slot_wal_keep_size.") : 0);
"
as err_msg is not concatenated anymore (I mean it's just one sentence build one time)
and this make use of errmsg_internal() and errdetail_internal().
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
From | Date | Subject | |
---|---|---|---|
Next Message | Pavel Stehule | 2023-04-04 16:57:12 | Re: possible proposal plpgsql GET DIAGNOSTICS oid = PG_ROUTINE_OID |
Previous Message | Hayato Kuroda (Fujitsu) | 2023-04-04 16:51:51 | RE: [Proposal] Add foreign-server health checks infrastructure |