Re: BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: nagata(at)sraoss(dot)co(dot)jp, pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: BUG #17434: CREATE/DROP DATABASE can be executed in the same transaction with other commands
Date: 2022-07-14 23:49:32
Message-ID: YtCrjN0HLew0w4Ss@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-hackers


Did we make any decision on this?

---------------------------------------------------------------------------

On Fri, Mar 11, 2022 at 11:11:54AM +0000, PG Bug reporting form wrote:
> The following bug has been logged on the website:
>
> Bug reference: 17434
> Logged by: Yugo Nagata
> Email address: nagata(at)sraoss(dot)co(dot)jp
> PostgreSQL version: 14.2
> Operating system: Ubuntu
> Description:
>
> CREATE/DROP DATABASE can be executed in the same transaction with other
> commands when we use pipeline mode in pgbench or libpq API. If the
> transaction aborts, this causes an inconsistency between the system catalog
> and base directory.
>
> Here is an example using the pgbench /startpipeline meta command.
>
> ----------------------------------------------------
> (1) Confirm that there are four databases from psql and directories in
> base.
>
> $ psql -l
> List of databases
> Name | Owner | Encoding | Collate | Ctype | Access
> privileges
> -----------+--------+----------+-------------+-------------+-----------------------
> postgres | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> template0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> template1 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> test0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> (4 rows)
>
> $ ls data/base/
> 1 13014 13015 16409 pgsql_tmp
>
> (2) Execute CREATE DATABASE in a transaction, and the transaction fails.
>
> $ cat pipeline_createdb.sql
> \startpipeline
> create database test;
> select 1/0;
> \endpipeline
>
> $ pgbench -t 1 -f pipeline_createdb.sql -M extended
> pgbench (14.2)
> starting vacuum...end.
> pgbench: error: client 0 script 0 aborted in command 3 query 0:
> ....
>
> (3) There are still four databases but a new directory was created in
> base.
>
> $ psql -l
> List of databases
> Name | Owner | Encoding | Collate | Ctype | Access
> privileges
> -----------+--------+----------+-------------+-------------+-----------------------
> postgres | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> template0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> template1 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> test0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> (4 rows)
>
> $ ls data/base/
> 1 13014 13015 16409 16411 pgsql_tmp
>
> (4) Next, execute DROP DATABASE in a transaction, and the transaction
> fails.
>
> $ cat pipeline_dropdb.sql
> \startpipeline
> drop database test0;
> select 1/0;
> \endpipeline
>
> $ pgbench -t 1 -f pipeline_dropdb.sql -M extended
> pgbench (14.2)
> starting vacuum...end.
> pgbench: error: client 0 script 0 aborted in command 3 query 0:
> ...
>
> (5) There are still four databases but the corresponding directory was
> deleted in base.
>
> $ psql -l
> List of databases
> Name | Owner | Encoding | Collate | Ctype | Access
> privileges
> -----------+--------+----------+-------------+-------------+-----------------------
> postgres | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> template0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> template1 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/"yugo-n"
> +
> | | | | |
> "yugo-n"=CTc/"yugo-n"
> test0 | yugo-n | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
> (4 rows)
>
> $ ls data/base/
> 1 13014 13015 16411 pgsql_tmp
>
> (6) We cannot connect the database "test0".
>
> $ psql test0
> psql: error: connection to server on socket "/tmp/.s.PGSQL.25435" failed:
> FATAL: database "test0" does not exist
> DETAIL: The database subdirectory "base/16409" is missing.
> ----------------------------------------------------
>
> Detailed discussions are here;
> https://www.postgresql.org/message-id/20220301151704.76adaaefa8ed5d6c12ac3079@sraoss.co.jp
>

--
Bruce Momjian <bruce(at)momjian(dot)us> https://momjian.us
EDB https://enterprisedb.com

Indecision is a decision. Inaction is an action. Mark Batterson

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Jeff Davis 2022-07-15 00:22:54 [15] Custom WAL resource managers, single user mode, and recovery
Previous Message Bruce Momjian 2022-07-14 21:57:32 Re: BUG #17496: to_char function resets if interval exceeds 23 hours 59 minutes

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2022-07-15 00:01:41 Re: Fix typo in progress reporting doc
Previous Message Andres Freund 2022-07-14 23:31:01 Re: doc: New cumulative stats subsystem obsoletes comment in maintenance.sgml