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

Поиск
Список
Период
Сортировка
От Ashutosh Sharma
Тема Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints
Дата
Msg-id CAE9k0P=p7X7wH8oguO4EZAqV0LhZjbryvGbPhnVhgu_8UeO4sw@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints  (Neha Sharma <neha.sharma@enterprisedb.com>)
Ответы Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints  (Dilip Kumar <dilipbalaut@gmail.com>)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints  (Neha Sharma <neha.sharma@enterprisedb.com>)
Список 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@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.sharma@enterprisedb.com> wrote:



On Thu, Dec 9, 2021 at 4:26 AM Greg Nancarrow <gregn4422@gmail.com> wrote:
On Thu, Dec 9, 2021 at 6:57 AM Neha Sharma <neha.sharma@enterprisedb.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
Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: Make pg_waldump report replication origin ID, LSN, and timestamp.
Следующее
От: Amul Sul
Дата:
Сообщение: Re: Multi-Column List Partitioning