Re: Add a hook for handling logical decoding messages on subscribers. - Mailing list pgsql-hackers

From Chao Li
Subject Re: Add a hook for handling logical decoding messages on subscribers.
Date
Msg-id 9C6AC94E-135C-47D4-A9C6-6668E5BA14DA@gmail.com
Whole thread
In response to Re: Add a hook for handling logical decoding messages on subscribers.  (Masahiko Sawada <sawada.mshk@gmail.com>)
List pgsql-hackers

> On Aug 6, 2026, at 02:55, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>
> On Wed, Aug 5, 2026 at 9:32 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>>
>> On Tue, Aug 4, 2026 at 1:05 AM Chao Li <li.evan.chao@gmail.com> wrote:
>>>
>>>
>>>
>>>> On Aug 4, 2026, at 08:41, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>>>>
>>>> On Thu, Jul 9, 2026 at 5:14 AM Fujii Masao <masao.fujii@gmail.com> wrote:
>>>>>
>>>>> On Wed, Jun 24, 2026 at 3:02 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>>>>>> Right. I'm implementing a basic DDL replication solution using this
>>>>>> hook as a sample implementation. Other than that, this feature can be
>>>>>> used to add additional information for the replicated transaction that
>>>>>> is not replicated via logical replication protocol, such as the
>>>>>> executed user or context-specific information, which can then be
>>>>>> dispatched to a CDC system connected to the subscriber.
>>>>>
>>>>> +1 for the proposed hook, although I haven't read the patch yet.
>>>>>
>>>>> I know of a system that uses logical decoding messages to propagate data
>>>>> to external systems. In that system, the application writes the data to
>>>>> be propagated as logical decoding messages, and a CDC pipeline consumes
>>>>> them via logical decoding and sends them to other systems, for example
>>>>> through Kafka.
>>>>>
>>>>> In that system, when the remote site is maintained by physical replication,
>>>>> the same logical decoding messages can be decoded on the standby
>>>>> at the remote site to deliver them to external systems there. However,
>>>>> if the remote site uses logical replication instead, those messages are
>>>>> currently neither delivered to nor processed on the subscriber at
>>>>> the remote site. As a result, the CDC pipeline at the remote site cannot
>>>>> consume the data they carry.
>>>>>
>>>>> The proposed hook might be useful for this use case. An extension could
>>>>> process the incoming logical decoding messages on the subscriber and
>>>>> forward them to the local CDC pipeline, or store or re-emit them in a form
>>>>> that local consumers can process.
>>>>
>>>> Thank you for sharing the concrete use case. This is one of the use
>>>> cases I initially imagined.
>>>>
>>>> I've rebased and updated the patch. Please review it.
>>>>
>>>> Regards,
>>>>
>>>> --
>>>> Masahiko Sawada
>>>> Amazon Web Services: https://aws.amazon.com
>>>> <v2-0001-Add-a-hook-for-handling-logical-messages-on-subsc.patch>
>>>
>>> I played with this feature today. I have a few comments from a design perspective:
>>
>> Thank you for reviewing the patch!
>>
>>> 1. Would it make sense to pass the receiving subscription’s identity explicitly to the hook? Otherwise, a hook that
needsto distinguish messages received by different subscriptions has to obtain it from a global variable such as
MySubscription->oid.
>>
>> It's common for hook functions to access a global variable to get more
>> information such as MyDatabaseId and MyProcPort etc. Using
>> MySubscription to get a subscription's identity works for me.
>>
>>> 2. A hook is invoked by an apply worker, and since a message has no target relation, the hook runs as the
subscriptionowner regardless of run_as_owner. I think it would be useful to document this explicitly. 
>>
>> I think it depends on the hook function implementations. They can
>> switch the role as they want.
>>
>>>
>>> 3. I’m thinking out loud here. Would it be useful to provide an opt-in default hook that re-emits received
messages,so that they are written to the subscriber-side WAL and can be consumed by a local logical-decoding client? I
understandthat a re-emitted message would have a different LSN, just as logically replicated row changes generate new
localWAL records. For the use case Fujii-san described, this might allow an existing decoder to continue working after
theremote site switches from physical to logical replication. 
>>
>> Interesting idea, but I'm not sure we should have it in the core or in
>> the contrib. I think it's a good topic to discuss in a separate
>> thread.
>>
>>>
>>> And a few comment for the code changes:
>>>
>>> 1 - worker_internal.h
>>> ```
>>> +typedef void (*LogicalRepMessageHandle_hook_type) (LogicalRepMessageData *msg);
>>> +extern PGDLLIMPORT LogicalRepMessageHandle_hook_type LogicalRepMessageHandle_hook;
>>> ```
>>>
>>> I guess we don’t expect a hook function to mutate the message, so maybe make the pointer const.
>>>
>>> 2 - worker.c
>>> ```
>>> +       /*
>>> +        * Logical messages are relation-agnostic, so they don't map cleanly onto
>>> +        * the tablesync worker of a particular relation, and there would be no
>>> +        * well-defined ordering between a message and the initial copy. Leave
>>> +        * them to the (parallel) apply workers. Logical messages are handled only
>>> +        * the (parallel) apply workers
>>> +        */
>>> ```
>>>
>>> The last sentence looks duplicate and incomplete.
>>>
>>> 3 - proto.c
>>> ```
>>> +       /* read message length */
>>> +       len = pq_getmsgint(in, 4);
>>> +       msg_data->message_size = len;
>>> +
>>> +       /* and data */
>>> +       msg = palloc(len + 1);
>>> +       pq_copymsgbytes(in, msg, len);
>>> +
>>> +       msg[len] = '\0';
>>> +       msg_data->message = msg;
>>> ```
>>>
>>> logicalrep_read_message() allocates one extra byte for NULL terminator, which is unnecessary, as the contract is to
usemsg_data->message_size to decide the message length, and a message contain contains 0 in the middle. But I agree it
maybe useful for debugging and logging, so maybe add a comment to explain why using this extra byte. 
>>
>> Agreed with the all above comments.
>>
>> I'll submit the updated patch shortly.
>
> I've addressed all comments I got so far unless I'm missing anything,
> and attached the updated patch. Feedback is very welcome.
>
> Regards,
>
> --
> Masahiko Sawada
> Amazon Web Services: https://aws.amazon.com
> <v3-0001-Add-a-hook-for-handling-logical-messages-on-subsc.patch>

V3 LGTM.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/







pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: Support for 8-byte TOAST values, round two
Next
From: jian he
Date:
Subject: Re: NOT NULL NOT ENFORCED