Re: [BUG] Crash of logical replica with trigger.

From: Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>
To: "Anton A(dot) Melnikov" <aamelnikov(at)inbox(dot)ru>
Cc: pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: [BUG] Crash of logical replica with trigger.
Date: 2022-09-28 13:33:22
Message-ID: CAD21AoDKA+MB4M9BOnct_=Zj5bNHbkYn6oKZ2aOQp8m=3x2GhQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi,

On Mon, Aug 15, 2022 at 4:48 AM Anton A. Melnikov <aamelnikov(at)inbox(dot)ru> wrote:
>
> Hello!
>
> There is a crash during logical replication.
>
> Reproduction on current master:
> A) on master (wal_level = logical): create table rul_rule_set that will be replicated:
> CREATE TABLE public.rul_rule_set (id smallint NOT NULL, description text, stage_id integer,
> condition text, condition_compiled text);
> ALTER TABLE ONLY public.rul_rule_set ADD CONSTRAINT rul_rule_set_pkey PRIMARY KEY (id);
> CREATE PUBLICATION test_pub FOR TABLE rul_rule_set;
>
> B) on replica
> 1. Create tables doc_attribute and rul_rule_set for incoming changes:
> CREATE TABLE public.doc_attribute (id integer NOT NULL, attr_name text, attr_desc text, attr_type text,
> attr_order integer, is_system boolean, used_by_slice boolean);
> INSERT INTO doc_attribute VALUES ('1','name','Имя','text','1','t','t');
> CREATE TABLE public.rul_rule_set (id smallint NOT NULL, description text, stage_id integer,
> condition text, condition_compiled text);
> ALTER TABLE ONLY public.doc_attribute ADD CONSTRAINT doc_attribute_pkey PRIMARY KEY (id);
> ALTER TABLE ONLY public.rul_rule_set ADD CONSTRAINT rul_rule_set_pkey PRIMARY KEY (id);
>
> 2.Create procedure and trigger that will be fired on lines inserting into the rul_rule_set table:
> Execute trigger.sql attached.
>
> 3. Create suscription:
> CREATE SUBSCRIPTION test_sub CONNECTION 'port=5116 user=postgres dbname=postgres' PUBLICATION test_pub;
>
> C) on master: insert row in table rul_rule_set:
> INSERT INTO rul_rule_set VALUES ('1', 'name','1','age','true');
>
> The replica will crash with:
> TRAP: FailedAssertion("ActivePortal && ActivePortal->status == PORTAL_ACTIVE", File: "pg_proc.c", Line: 1038, PID: 310502)
>
> as ActivePortal is NULL because logical replication worker was forked before any active command.

Right. This is because the logical replication workers (apply worker
and tablesync worker) don't have a Portal.

>
> The backtrace is attached.
>
> I thought to pass the text of the request as a parameter, but most likely, it will be wrong.
> Please suggest the best way to solve this problem, would be very grateful.

In function_parse_error_transpose(), I think that we don't need the
query text in logical replication worker cases since they don't
execute SQL query.

I've attached the patch to fix it. The patch also includes a minimal
TAP test for this case.

Regards,

--
Masahiko Sawada
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com

Attachment Content-Type Size
fix_assertion_error.patch application/octet-stream 3.6 KB

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message David G. Johnston 2022-09-28 13:56:26 Re: BUG #17623: WHERE should be evaluated after FROM clause when operators may throw
Previous Message PG Bug reporting form 2022-09-28 12:22:50 BUG #17623: WHERE should be evaluated after FROM clause when operators may throw