RE: Disable WAL logging to speed up data loading - Mailing list pgsql-hackers
From | osumi.takamichi@fujitsu.com |
---|---|
Subject | RE: Disable WAL logging to speed up data loading |
Date | |
Msg-id | OSBPR01MB48884E14FFFB8FBD49F9C8BAEDE30@OSBPR01MB4888.jpnprd01.prod.outlook.com Whole thread Raw |
In response to | Re: Disable WAL logging to speed up data loading (Fujii Masao <masao.fujii@oss.nttdata.com>) |
Responses |
RE: Disable WAL logging to speed up data loading
|
List | pgsql-hackers |
Hi On Thursday, October 29, 2020 11:42 AM Fujii Masao <masao.fujii@oss.nttdata.com> wrote: > BTW, with the patch, I observed that PREPARE TRANSACTION and COMMIT > PREPARED caused assertion failure in my env, as I pointed upthread. > > How does the patch handle other feature depending on the existence of WAL, > e.g., pg_logical_emit_message()? I've updated the first patch, based on comments from both Tsunakwa-San and Fujii-San mainly. I'll take other comments in the next patch. (Note that this patch passes make check-world but doesn't pass installcheck-world yet.) The assertion failure Fujii-San reported in the past has been protected by adding a check to detect whether PREPARE TRANSACTION is issued when wal_level=none or not in the v02. Meanwhile, I didn't change the code for COMMIT PREPARED because prohibiting usage of PREPARE TRANSACTION means user cannot use COMMIT PREPARED as well. I learnt this way of modification from the case that when max_prepared_transaction is set to zero, PREPARE TRANSACTION cannot be used because of wa_level check, while issuing COMMIT TRANSACTION itself doesn't claim wal_level. Just prohibiting PREPARE TRANSACTION seemed OK for me. As for pg_resetwal (and other commands like pg_rewind), I didn't make any change. pg_resetwal is used to make corrupted server start up again as a *last* resort by guessing the content of the control file, while wal_level=none is designed never to make the server start again when any unexpected crash is detected. Here, the documentation in the patch about wal_level=none requests user to recreate the whole cluster again when such a corruption of the cluster happens. Thus, it's not natural to think that user of wal_level=none will continue to use the coruppted cluster forcibly by applying pg_resetwal. This is the reason I made no fix of pg_resetwal. In terms of other commands, I don't think there was a need to fix. By the way, I'm not sure why functions related to replication origin (e.g. pg_replication_origin_create) doesn't have a check of wal_level. It can be used when wal_level < logical even though their purposes are to safely keep track of replication progress. Did it mean something special to execute such function when wal_level < logical ? In the patch, I added an error check on this point. Another similar case is that there's no test to check wal_level for pg_logical_emit_message. In my humble opinion, pg_logical_emit_message should not be used when wal_level <= minimal. I didn't think that without setting up a slot for logical replication (with the restriction that user cannot create a slot by pg_create_physical_replication_slot when wal_level < replica), plugins will utilize message from pg_logical_emit_message. Or, if there is a slot that has been created before restarting the server to turn on wal_level=none, I cannot get the worth to execute the function because other kinds of WAL are not issued. Thus, I prohibited the usage of pg_logical_emit_message this time. Did it make sense ? Best, Takamichi Osumi
Attachment
pgsql-hackers by date: