[pgpool-hackers: 4274] Re: multi-statement + DEALLOCATE error
Tatsuo Ishii
ishii at sraoss.co.jp
Wed Feb 1 08:20:00 JST 2023
> While taking care of this:
> https://www.pgpool.net/mantisbt/view.php?id=780
>
> I found that pgppol raises a kind mismatch error in the following
> condition:
>
> - streaming replication mode
> - load balance node is other than primary
> - PREPARE is used in a multi-statement query
>
> Step to reproduce:
>
> 1) create 2 node streaming replication cluster
> $ pgpool_setup
>
> 2) set load balance node to backend 1
> $ echo "backend_weight0 = 0" >> etc/pgpool.conf
>
> 3) start pgpool
> ./startall
>
> 4) issue following queries
>
> SELECT 1\;PREPARE foo;
> DEALLOCATE foo;
>
> The error is caused by a bug in pool_where_to_send(). For DEALLOCATE
> it sets the nodes to be sent to all backend if pgpool failed to find a
> prepared statement previously received. For "SELECT 1\;PREPARE foo;",
> pgpool ignores "PREPARE" part and just sends the multi-statement query
> to primary. So primary actually has the prepared statement "foo" but
> pgpool thinks that there's no prepared statement named "foo". And
> pgpool sends DEALLOCATE to both primary and standby, then a kind
> mismatch error raised. Fix is, just sending DEALLOCATE to primary node
> in this case if pgpool is in streaming replication mode. Same thing
> can be said to EXECUTE too and should be fixed.
>
> I also found another bug: in replication mode or SI mode, pgpool needs
> to send multi-statement query to all backend because the
> multi-statement query maybe a write query. However pgpool sends to
> main node only in this case.
>
> I am going to fix those issues.
Done.
https://git.postgresql.org/gitweb/?p=pgpool2.git;a=commit;h=2b7e9767d43c6d69cadf7d78bed181ce5c1450a8
Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
More information about the pgpool-hackers
mailing list