Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

From: Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com>
To: Neha Sharma <neha(dot)sharma(at)enterprisedb(dot)com>
Cc: Greg Nancarrow <gregn4422(at)gmail(dot)com>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints
Date: 2021-12-09 07:11:53
Message-ID: CAE9k0P=p7X7wH8oguO4EZAqV0LhZjbryvGbPhnVhgu_8UeO4sw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

The issue here is that we are trying to create a table that exists inside a
non-default tablespace when doing ALTER DATABASE. I think this should be
skipped otherwise we will come across the error like shown below:

ashu(at)postgres=# alter database test set tablespace pg_default;
ERROR: 58P02: could not create file
"pg_tblspc/16385/PG_15_202111301/16386/16390": File exists

I have taken the above from Neha's test-case.

--

Attached patch fixes this. I am passing a new boolean flag named *movedb*
to CopyDatabase() so that it could skip the creation of tables existing in
non-default tablespace when doing alter database. Alternatively, we can
also rename the boolean flag movedb to createdb and pass its value
accordingly from movedb() or createdb(). Either way looks fine to me.
Kindly check the attached patch for the changes.

Dilip, Could you please check the attached patch and let me know if it
looks fine or not?

Neha, can you please re-run the test-cases with the attached patch.

Thanks,

--
With Regards,
Ashutosh Sharma.

On Thu, Dec 9, 2021 at 8:43 AM Neha Sharma <neha(dot)sharma(at)enterprisedb(dot)com>
wrote:

>
>
>
> On Thu, Dec 9, 2021 at 4:26 AM Greg Nancarrow <gregn4422(at)gmail(dot)com> wrote:
>
>> On Thu, Dec 9, 2021 at 6:57 AM Neha Sharma <neha(dot)sharma(at)enterprisedb(dot)com>
>> wrote:
>> >
>> > While testing the v7 patches, I am observing a crash with the below
>> test case.
>> >
>> > Test case:
>> > create tablespace tab location '<dir_path>/test_dir';
>> > create tablespace tab1 location '<dir_path>/test_dir1';
>> > create database test tablespace tab;
>> > \c test
>> > create table t( a int PRIMARY KEY,b text);
>> > CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS
>> 'select array_agg(md5(g::text))::text from generate_series(1, 256) g';
>> > insert into t values (generate_series(1,2000000), large_val());
>> > alter table t set tablespace tab1 ;
>> > \c postgres
>> > create database test1 template test;
>> > alter database test set tablespace pg_default;
>> > alter database test set tablespace tab;
>> > \c test1
>> > alter table t set tablespace tab;
>> >
>> > Logfile says:
>> > 2021-12-08 23:31:58.855 +04 [134252] PANIC: could not fsync file
>> "base/16386/4152": No such file or directory
>> > 2021-12-08 23:31:59.398 +04 [134251] LOG: checkpointer process (PID
>> 134252) was terminated by signal 6: Aborted
>> >
>>
>> I tried to reproduce the issue using your test scenario, but I needed
>> to reduce the amount of inserted data (so reduced 2000000 to 20000)
>> due to disk space.
>> I then consistently get an error like the following:
>>
>> postgres=# alter database test set tablespace pg_default;
>> ERROR: could not create file
>> "pg_tblspc/16385/PG_15_202111301/16386/36395": File exists
>>
>> (this only happens when the patch is used)
>>
>>
> Yes, I was also getting this, and moving further we get a crash when we
> alter the table of database test1.
> Below is the output of the test at my end.
>
> postgres=# create tablespace tab1 location
> '/home/edb/PGsources/postgresql/inst/bin/rep_test1';
> CREATE TABLESPACE
> postgres=# create tablespace tab location
> '/home/edb/PGsources/postgresql/inst/bin/rep_test';
> CREATE TABLESPACE
> postgres=# create database test tablespace tab;
> CREATE DATABASE
> postgres=# \c test
> You are now connected to database "test" as user "edb".
> test=# create table t( a int PRIMARY KEY,b text);
> CREATE TABLE
> test=# CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS
> 'select array_agg(md5(g::text))::text from generate_series(1, 256) g';
> CREATE FUNCTION
> test=# insert into t values (generate_series(1,2000000), large_val());
> INSERT 0 2000000
> test=# alter table t set tablespace tab1 ;
> ALTER TABLE
> test=# \c postgres
> You are now connected to database "postgres" as user "edb".
> postgres=# create database test1 template test;
> CREATE DATABASE
> postgres=# alter database test set tablespace pg_default;
> ERROR: could not create file
> "pg_tblspc/16384/PG_15_202111301/16386/2016395": File exists
> postgres=# alter database test set tablespace tab;
> ALTER DATABASE
> postgres=# \c test1
> You are now connected to database "test1" as user "edb".
> test1=# alter table t set tablespace tab;
> WARNING: terminating connection because of crash of another server process
> DETAIL: The postmaster has commanded this server process to roll back the
> current transaction and exit, because another server process exited
> abnormally and possibly corrupted shared memory.
> HINT: In a moment you should be able to reconnect to the database and
> repeat your command.
> server closed the connection unexpectedly
> This probably means the server terminated abnormally
> before or while processing the request.
> The connection to the server was lost. Attempting reset: Failed.
> !?>
>
>>
>> Regards,
>> Greg Nancarrow
>> Fujitsu Australia
>>
>

Attachment Content-Type Size
skip-table-creation-for-alter-database.patch application/octet-stream 2.2 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amul Sul 2021-12-09 07:13:19 Re: Multi-Column List Partitioning
Previous Message Michael Paquier 2021-12-09 07:02:03 Re: Make pg_waldump report replication origin ID, LSN, and timestamp.