[Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

Started by Dilip Kumaralmost 5 years ago280 messageshackers
Jump to latest
#1Dilip Kumar
dilipbalaut@gmail.com

Currently, CREATE DATABASE forces a checkpoint, then copies all the
files, then forces another checkpoint. The comments in the createdb()
function explain the reasons for this. The attached patch fixes this
problem by making CREATE DATABASE completely WAL-logged so that now we
can avoid checkpoints. The patch modifies both CREATE DATABASE and
ALTER DATABASE..SET TABLESPACE to be fully WAL-logged.

One main advantage of this change is that it will be cheaper. Forcing
checkpoints on an idle system is no big deal, but when the system is
under heavy write load, it's very expensive. Another advantage is that
it makes things better for features like TDE, which might want the
pages in the source database to be encrypted using a different key or
nonce than the pages in the target database.

Design Idea:
-----------------
First, create the target database directory along with the version
file and WAL-log this operation. Create the "relation map file" in
the target database and copy the content from the source database. For
this, we can use some modified versions of the write_relmap_file() and
WAL-log the relmap create operation along with the file content. Now,
read the relmap file to find the relfilenode for pg_class and then we
read pg_class block by block and decode the tuples. For reading the
pg_class blocks, we can use ReadBufferWithoutRelCache() so that we
don't need the relcache. Nothing prevents us from checking visibility
for tuples in another database because CLOG is global to the cluster.
And nothing prevents us from deforming those tuples because the column
definitions for pg_class have to be the same in every database. Then
we can get the relfilenode of every file we need to copy, and prepare
a list of all such relfilenode. Next, for each relfilenode in the
source database, create a respective relfilenode in the target
database (for all forks) using smgrcreate, which is already a
WAL-logged operation. Now read the source relfilenode block by block
using ReadBufferWithoutRelCache() and copy the block to the target
relfilenode using smgrextend() and WAL-log them using log_newpage().
For the source database, we can not directly use the smgrread(),
because there could be some dirty buffers so we will have to read them
through the buffer manager interface, otherwise, we will have to flush
all the dirty buffers.

WAL sequence using pg_waldump
----------------------------------------------------
1. (new wal to create db dir and write PG_VERSION file)
rmgr: Database desc: CREATE create dir 1663/16394

2. (new wal to create and write relmap file)
rmgr: RelMap desc: CREATE database 16394 tablespace 1663 size 512

2. (create relfilenode)
rmgr: Storage desc: CREATE base/16394/16384
rmgr: Storage desc: CREATE base/16394/2619

3. (write page data)
rmgr: XLOG desc: FPI , blkref #0: rel 1663/16394/2619 blk 0 FPW
rmgr: XLOG desc: FPI , blkref #0: rel 1663/16394/2619 blk 1 FPW
............
4. (create other forks)
rmgr: Storage desc: CREATE base/16394/2619_fsm
rmgr: Storage CREATE base/16394/2619_vm
.............

I have attached a POC patch, which shows this idea, with this patch
all basic sanity testing and the "check-world" is passing.

Open points:
-------------------
- This is a POC patch so needs more refactoring/cleanup and testing.
- Might need to relook into the SMGR level API usage.

Credits:
-----------
Thanks to Robert Haas, for suggesting this idea and the high-level design.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

Attachments:

POC-0001-WAL-logged-CREATE-DATABASE.patchtext/x-patch; charset=US-ASCII; name=POC-0001-WAL-logged-CREATE-DATABASE.patchDownload+613-322
#2Julien Rouhaud
rjuju123@gmail.com
In reply to: Dilip Kumar (#1)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Tue, Jun 15, 2021 at 04:50:24PM +0530, Dilip Kumar wrote:

Currently, CREATE DATABASE forces a checkpoint, then copies all the
files, then forces another checkpoint. The comments in the createdb()
function explain the reasons for this. The attached patch fixes this
problem by making CREATE DATABASE completely WAL-logged so that now we
can avoid checkpoints. The patch modifies both CREATE DATABASE and
ALTER DATABASE..SET TABLESPACE to be fully WAL-logged.

One main advantage of this change is that it will be cheaper. Forcing
checkpoints on an idle system is no big deal, but when the system is
under heavy write load, it's very expensive. Another advantage is that
it makes things better for features like TDE, which might want the
pages in the source database to be encrypted using a different key or
nonce than the pages in the target database.

I only had a quick look at the patch but AFAICS your patch makes the new
behavior mandatory. Wouldn't it make sense to have a way to use the previous
approach? People creating wanting to copy somewhat big database and with a
slow replication may prefer to pay 2 checkpoints rather than stream everything.
Same for people who have an otherwise idle system (I often use that to make
temporary backups and/or prepare multiple dataset and most of the time the
checkpoint is basically free).

#3Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Dilip Kumar (#1)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On 15/06/2021 14:20, Dilip Kumar wrote:

Design Idea:
-----------------
First, create the target database directory along with the version
file and WAL-log this operation. Create the "relation map file" in
the target database and copy the content from the source database. For
this, we can use some modified versions of the write_relmap_file() and
WAL-log the relmap create operation along with the file content. Now,
read the relmap file to find the relfilenode for pg_class and then we
read pg_class block by block and decode the tuples. For reading the
pg_class blocks, we can use ReadBufferWithoutRelCache() so that we
don't need the relcache. Nothing prevents us from checking visibility
for tuples in another database because CLOG is global to the cluster.
And nothing prevents us from deforming those tuples because the column
definitions for pg_class have to be the same in every database. Then
we can get the relfilenode of every file we need to copy, and prepare
a list of all such relfilenode.

I guess that would work, but you could also walk the database directory
like copydir() does. How you find the relations to copy is orthogonal to
whether you WAL-log them or use checkpoints. And whether you use the
buffer cache is also orthogonal to the rest of the proposal; you could
issue FlushDatabaseBuffers() instead of a checkpoint.

Next, for each relfilenode in the
source database, create a respective relfilenode in the target
database (for all forks) using smgrcreate, which is already a
WAL-logged operation. Now read the source relfilenode block by block
using ReadBufferWithoutRelCache() and copy the block to the target
relfilenode using smgrextend() and WAL-log them using log_newpage().
For the source database, we can not directly use the smgrread(),
because there could be some dirty buffers so we will have to read them
through the buffer manager interface, otherwise, we will have to flush
all the dirty buffers.

Yeah, WAL-logging the contents of the source database would certainly be
less weird than the current system. As Julien also pointed out, the
question is, are there people using on "CREATE DATABASE foo TEMPLATE
bar" to copy a large source database, on the premise that it's fast
because it skips WAL-logging?

In principle, we could have both mechanisms, and use the new WAL-logged
system if the database is small, and the old system with checkpoints if
it's large. But I don't like idea of having to maintain both.

- Heikki

#4Dilip Kumar
dilipbalaut@gmail.com
In reply to: Heikki Linnakangas (#3)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Tue, Jun 15, 2021 at 5:34 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote:

On 15/06/2021 14:20, Dilip Kumar wrote:

Design Idea:

. Then

we can get the relfilenode of every file we need to copy, and prepare
a list of all such relfilenode.

I guess that would work, but you could also walk the database directory
like copydir() does. How you find the relations to copy is orthogonal to
whether you WAL-log them or use checkpoints. And whether you use the
buffer cache is also orthogonal to the rest of the proposal; you could
issue FlushDatabaseBuffers() instead of a checkpoint.

Yeah, that would also work, but I thought since we are already
avoiding the checkpoint so let's avoid FlushDatabaseBuffers() also and
directly use the lower level buffer manager API which doesn't need
recache. And I am using pg_class to identify the useful relfilenode
so that we can avoid processing some unwanted relfilenode but yeah I
agree that this is orthogonal to whether we use checkpoint or not.

Yeah, WAL-logging the contents of the source database would certainly be
less weird than the current system. As Julien also pointed out, the
question is, are there people using on "CREATE DATABASE foo TEMPLATE
bar" to copy a large source database, on the premise that it's fast
because it skips WAL-logging?

In principle, we could have both mechanisms, and use the new WAL-logged
system if the database is small, and the old system with checkpoints if
it's large. But I don't like idea of having to maintain both.

Yeah, I agree in some cases, where we don't have many dirty buffers,
checkpointing can be faster. I think code wise maintaining two
approaches will not be a very difficult job because the old approach
just calls copydir(), but I am thinking about how can we decide which
approach is better in which scenario. I don't think we can take calls
just based on the database size? It would also depend upon many other
factors e.g. how busy your system is, how many total dirty buffers are
there in the cluster right? because checkpoint will affect the
performance of the operation going on in other databases in the
cluster.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#5Adam Brusselback
adambrusselback@gmail.com
In reply to: Dilip Kumar (#4)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

Am I mistaken in thinking that this would allow CREATE DATABASE to run
inside a transaction block now, further reducing the DDL commands that are
non-transactional?

#6Andrew Dunstan
andrew@dunslane.net
In reply to: Heikki Linnakangas (#3)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On 6/15/21 8:04 AM, Heikki Linnakangas wrote:

Yeah, WAL-logging the contents of the source database would certainly
be less weird than the current system. As Julien also pointed out, the
question is, are there people using on "CREATE DATABASE foo TEMPLATE
bar" to copy a large source database, on the premise that it's fast
because it skips WAL-logging?

I'm 100% certain there are. It's not even a niche case.

In principle, we could have both mechanisms, and use the new
WAL-logged system if the database is small, and the old system with
checkpoints if it's large. But I don't like idea of having to maintain
both.

Rather than use size, I'd be inclined to say use this if the source
database is marked as a template, and use the copydir approach for
anything that isn't.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#7Julien Rouhaud
rjuju123@gmail.com
In reply to: Andrew Dunstan (#6)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Tue, Jun 15, 2021 at 9:31 PM Andrew Dunstan <andrew@dunslane.net> wrote:

Rather than use size, I'd be inclined to say use this if the source
database is marked as a template, and use the copydir approach for
anything that isn't.

Looks like a good approach.

#8Kyotaro Horiguchi
horikyota.ntt@gmail.com
In reply to: Julien Rouhaud (#7)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

At Tue, 15 Jun 2021 22:07:32 +0800, Julien Rouhaud <rjuju123@gmail.com> wrote in

On Tue, Jun 15, 2021 at 9:31 PM Andrew Dunstan <andrew@dunslane.net> wrote:

Rather than use size, I'd be inclined to say use this if the source
database is marked as a template, and use the copydir approach for
anything that isn't.

Looks like a good approach.

If we are willing to maintain the two methods.

Couldn't we just skip the checkpoints if the database is known to
"clean", which means no page has been loaded for the database since
startup? We can use the "template" mark to reject connections to the
database. (I'm afraid that we also should prevent vacuum to visit the
template databases, but...)

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

#9Julien Rouhaud
rjuju123@gmail.com
In reply to: Kyotaro Horiguchi (#8)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Wed, Jun 16, 2021 at 03:27:21PM +0900, Kyotaro Horiguchi wrote:

If we are willing to maintain the two methods.
Couldn't we just skip the checkpoints if the database is known to
"clean", which means no page has been loaded for the database since
startup? We can use the "template" mark to reject connections to the
database. (I'm afraid that we also should prevent vacuum to visit the
template databases, but...)

There's already a datallowconn for that purpose. Modifying template databases
is a common practice and we shouldn't prevent that.

But having the database currently doesn't accepting connection doesn't mean that
there is no dirty buffer and/or pending unlink, so it doesn't look like
something that could be optimized, at least for the majority of use cases.

#10Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andrew Dunstan (#6)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Tue, Jun 15, 2021 at 7:01 PM Andrew Dunstan <andrew@dunslane.net> wrote:

Rather than use size, I'd be inclined to say use this if the source
database is marked as a template, and use the copydir approach for
anything that isn't.

Yeah, that is possible, on the other thought wouldn't it be good to
provide control to the user by providing two different commands, e.g.
COPY DATABASE for the existing method (copydir) and CREATE DATABASE
for the new method (fully wal logged)?

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#11Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#1)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

Hi,

On 2021-06-15 16:50:24 +0530, Dilip Kumar wrote:

The patch modifies both CREATE DATABASE and ALTER DATABASE..SET
TABLESPACE to be fully WAL-logged.

Generally quite a bit in favor of this - the current approach is very
heavyweight, slow and I think we have a few open corner bugs related to
it.

Design Idea:
-----------------
First, create the target database directory along with the version
file and WAL-log this operation.

What happens if you crash / promote at this point?

Create the "relation map file" in the target database and copy the
content from the source database. For this, we can use some modified
versions of the write_relmap_file() and WAL-log the relmap create
operation along with the file content. Now, read the relmap file to
find the relfilenode for pg_class and then we read pg_class block by
block and decode the tuples.

This doesn't seem like a great approach - you're not going to be able to
use much of the normal infrastructure around processing tuples. So it
seems like it'd end up with quite a bit of special case code that needs
to maintained in parallel.

Now read the source relfilenode block by block using
ReadBufferWithoutRelCache() and copy the block to the target
relfilenode using smgrextend() and WAL-log them using log_newpage().
For the source database, we can not directly use the smgrread(),
because there could be some dirty buffers so we will have to read them
through the buffer manager interface, otherwise, we will have to flush
all the dirty buffers.

I think we might need a bit more batching for the WAL logging. There are
cases of template database considerably bigger than the default and the
overhead of logging each write separately seems likely to be noticable.

Greetings,

Andres Freund

#12Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#4)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

Hi,

On 2021-06-15 18:11:23 +0530, Dilip Kumar wrote:

On Tue, Jun 15, 2021 at 5:34 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote:

On 15/06/2021 14:20, Dilip Kumar wrote:

Design Idea:

. Then

we can get the relfilenode of every file we need to copy, and prepare
a list of all such relfilenode.

I guess that would work, but you could also walk the database directory
like copydir() does. How you find the relations to copy is orthogonal to
whether you WAL-log them or use checkpoints. And whether you use the
buffer cache is also orthogonal to the rest of the proposal; you could
issue FlushDatabaseBuffers() instead of a checkpoint.

Yeah, that would also work, but I thought since we are already
avoiding the checkpoint so let's avoid FlushDatabaseBuffers() also and
directly use the lower level buffer manager API which doesn't need
recache. And I am using pg_class to identify the useful relfilenode
so that we can avoid processing some unwanted relfilenode but yeah I
agree that this is orthogonal to whether we use checkpoint or not.

It's not entirely obvious to me that it's important to avoid
FlushDatabaseBuffers() on its own. Forcing a checkpoint is problematic because
it unnecessarily writes out dirty buffers in other databases, triggers FPWs
etc. Normally a database used as a template won't have a meaningful amount of
dirty buffers itself, so the FlushDatabaseBuffers() shouldn't trigger a lot of
writes. Of course, there is the matter of FlushDatabaseBuffers() not being
cheap with a large shared_buffers - but I suspect that's not a huge factor
compared to the rest of the database creation cost.

I think the better argument for going through shared buffers is that it might
be worth doing so for the *target* database. A common use of frequently
creating databases, in particular with a non-default template database, is to
run regression tests with pre-created schema / data - writing out all that data
just to have it then dropped a few seconds later after the regression test
completed is wasteful.

In principle, we could have both mechanisms, and use the new WAL-logged
system if the database is small, and the old system with checkpoints if
it's large. But I don't like idea of having to maintain both.

Yeah, I agree in some cases, where we don't have many dirty buffers,
checkpointing can be faster.

I don't think the main issue is the speed of checkpointing itself? The reaoson
to maintain the old paths is that the "new approach" is bloating WAL volume,
no? Right now cloning a 1TB database costs a few hundred bytes of WAL and about
1TB of write IO. With the proposed approach, the write volume approximately
doubles, because there'll also be about 1TB in WAL.

Greetings,

Andres Freund

#13Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andrew Dunstan (#6)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On 6/15/21 3:31 PM, Andrew Dunstan wrote:

On 6/15/21 8:04 AM, Heikki Linnakangas wrote:

Yeah, WAL-logging the contents of the source database would certainly
be less weird than the current system. As Julien also pointed out, the
question is, are there people using on "CREATE DATABASE foo TEMPLATE
bar" to copy a large source database, on the premise that it's fast
because it skips WAL-logging?

I'm 100% certain there are. It's not even a niche case.

In principle, we could have both mechanisms, and use the new
WAL-logged system if the database is small, and the old system with
checkpoints if it's large. But I don't like idea of having to maintain
both.

Rather than use size, I'd be inclined to say use this if the source
database is marked as a template, and use the copydir approach for
anything that isn't.

I think we should be asking what is the benefit of that use case, and
perhaps try addressing that without having to maintain two entirely
different ways to do CREATE DATABASE. It's not like we're sure the
current code is 100% reliable in various corner cases, I doubt having
two separate approaches will improve the situation :-/

I can see three reasons why people want to skip the WAL logging:

1) it's faster, because there's no CPU and I/O for building the WAL

I wonder if some optimization / batching could help with (1), as
suggested by Andres elsewhere in this thread.

2) it saves the amount of WAL (could matter with large template
databases and WAL archiving, etc.)

We can't really do much about this - we need to log all the data. But
the batching from (1) might help a bit too, I guess.

3) saves the amount of WAL that needs to be copied to standby, so that
there's no increase of replication lag, etc. particularly when the
network link has limited bandwidth

I think this is a more general issue - some operations that may
generate a lot of WAL, and we generally assume it's better to do
that rather than hold exclusive locks for long time. But maybe we
could have some throttling, to limit the amount of WAL per second,
similarly to what we have to plain vacuum.

regards

--
Tomas Vondra
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#14Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#11)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

()log_newpage()On Thu, Jun 17, 2021 at 3:28 AM Andres Freund
<andres@anarazel.de> wrote:

Hi,

On 2021-06-15 16:50:24 +0530, Dilip Kumar wrote:

The patch modifies both CREATE DATABASE and ALTER DATABASE..SET
TABLESPACE to be fully WAL-logged.

Generally quite a bit in favor of this - the current approach is very
heavyweight, slow and I think we have a few open corner bugs related to
it.

Great!

Design Idea:
-----------------
First, create the target database directory along with the version
file and WAL-log this operation.

What happens if you crash / promote at this point?

I will check this.

Create the "relation map file" in the target database and copy the
content from the source database. For this, we can use some modified
versions of the write_relmap_file() and WAL-log the relmap create
operation along with the file content. Now, read the relmap file to
find the relfilenode for pg_class and then we read pg_class block by
block and decode the tuples.

This doesn't seem like a great approach - you're not going to be able to
use much of the normal infrastructure around processing tuples. So it
seems like it'd end up with quite a bit of special case code that needs
to maintained in parallel.

Yeah, this needs some special-purpose code but it is not too much
code. I agree that instead of scanning the pg_class we can scan all
the tablespaces and under that identify the source database directory
as we do now. And from there we can copy each relfilenode block by
block with wal log. Honestly, these both seem like a special-purpose
code. Another problem with directly scanning the directory is, how we
are supposed to get the "relpersistence" which is stored in pg_class
tuple right?

Now read the source relfilenode block by block using
ReadBufferWithoutRelCache() and copy the block to the target
relfilenode using smgrextend() and WAL-log them using log_newpage().
For the source database, we can not directly use the smgrread(),
because there could be some dirty buffers so we will have to read them
through the buffer manager interface, otherwise, we will have to flush
all the dirty buffers.

I think we might need a bit more batching for the WAL logging. There are
cases of template database considerably bigger than the default and the
overhead of logging each write separately seems likely to be noticable.

Yeah, we can do that, and instead of using log_newpage() we can use
log_newpages(), to log multiple pages at once.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#15Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#12)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Thu, Jun 17, 2021 at 3:43 AM Andres Freund <andres@anarazel.de> wrote:

Yeah, that would also work, but I thought since we are already
avoiding the checkpoint so let's avoid FlushDatabaseBuffers() also and
directly use the lower level buffer manager API which doesn't need
recache. And I am using pg_class to identify the useful relfilenode
so that we can avoid processing some unwanted relfilenode but yeah I
agree that this is orthogonal to whether we use checkpoint or not.

It's not entirely obvious to me that it's important to avoid
FlushDatabaseBuffers() on its own. Forcing a checkpoint is problematic because
it unnecessarily writes out dirty buffers in other databases, triggers FPWs
etc. Normally a database used as a template won't have a meaningful amount of
dirty buffers itself, so the FlushDatabaseBuffers() shouldn't trigger a lot of
writes. Of course, there is the matter of FlushDatabaseBuffers() not being
cheap with a large shared_buffers - but I suspect that's not a huge factor
compared to the rest of the database creation cost.

Okay so if I think from that POW, then maybe we can just
FlushDatabaseBuffers() and then directly use smgrread() calls.

I think the better argument for going through shared buffers is that it might
be worth doing so for the *target* database. A common use of frequently
creating databases, in particular with a non-default template database, is to
run regression tests with pre-created schema / data - writing out all that data
just to have it then dropped a few seconds later after the regression test
completed is wasteful.

Okay, I am not sure how common this use case is but for this use case
it makes sense to use bufmgr for the target database.

In principle, we could have both mechanisms, and use the new WAL-logged
system if the database is small, and the old system with checkpoints if
it's large. But I don't like idea of having to maintain both.

Yeah, I agree in some cases, where we don't have many dirty buffers,
checkpointing can be faster.

I don't think the main issue is the speed of checkpointing itself? The reaoson
to maintain the old paths is that the "new approach" is bloating WAL volume,
no? Right now cloning a 1TB database costs a few hundred bytes of WAL and about
1TB of write IO. With the proposed approach, the write volume approximately
doubles, because there'll also be about 1TB in WAL.

Make sense.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#16Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Dilip Kumar (#14)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On 17/06/2021 08:45, Dilip Kumar wrote:

Another problem with directly scanning the directory is, how we
are supposed to get the "relpersistence" which is stored in pg_class
tuple right?

You only need relpersistence if you want to use the buffer cache, right?
I think that's a good argument for not using it.

- Heikki

#17Dilip Kumar
dilipbalaut@gmail.com
In reply to: Heikki Linnakangas (#16)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Thu, Jun 17, 2021 at 2:50 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote:

On 17/06/2021 08:45, Dilip Kumar wrote:

Another problem with directly scanning the directory is, how we
are supposed to get the "relpersistence" which is stored in pg_class
tuple right?

You only need relpersistence if you want to use the buffer cache, right?
I think that's a good argument for not using it.

Yeah, that is the one place, another place I am using it to decide
whether to WAL log the new page while writing into the target
relfilenode, if it is unlogged relation then I am not WAL logging. But
now, I think that is not the right idea, during creating the database
we should WAL log all the pages irrespective of whether the table is
logged or unlogged.

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

#18Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#12)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Wed, Jun 16, 2021 at 6:13 PM Andres Freund <andres@anarazel.de> wrote:

I don't think the main issue is the speed of checkpointing itself? The reaoson
to maintain the old paths is that the "new approach" is bloating WAL volume,
no? Right now cloning a 1TB database costs a few hundred bytes of WAL and about
1TB of write IO. With the proposed approach, the write volume approximately
doubles, because there'll also be about 1TB in WAL.

This is a good point, but on the other hand, I think this smells a lot
like the wal_level=minimal optimization where we don't need to log
data being bulk-loaded into a table created in the same transaction if
wal_level=minimal. In theory, that optimization has a lot of value,
but in practice it gets a lot of bad press on this list, because (1)
sometimes doing the fsync is more expensive than writing the extra WAL
would have been and (2) most people want to run with
wal_level=replica/logical so it ends up being a code path that isn't
used much and is therefore more likely than average to have bugs
nobody's terribly interested in fixing (except Noah ... thanks Noah!).
If we add features in the future, lke TDE or perhaps incremental
backup, that rely on new pages getting new LSNs instead of recycled
ones, this may turn into the same kind of wart. And as with that
optimization, you're probably not even better off unless the database
is pretty big, and you might be worse off if you have to do fsyncs or
flush buffers synchronously. I'm not severely opposed to keeping both
methods around, so if that's really what people want to do, OK, but I
guess I wonder whether we're really going to be happy with that
decision down the road.

--
Robert Haas
EDB: http://www.enterprisedb.com

#19Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#16)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

On Thu, Jun 17, 2021 at 5:20 AM Heikki Linnakangas <hlinnaka@iki.fi> wrote:

You only need relpersistence if you want to use the buffer cache, right?
I think that's a good argument for not using it.

I think the root of the problem with this feature is that it doesn't
go through shared_buffers, so in my opinion, it would be better if we
can make it all go through shared_buffers. It seems like you're
advocating a middle ground where half of the operation goes through
shared_buffers and the other half doesn't, but that sounds like
getting rid of half of the hack when we could have gotten rid of all
of it. I think things that don't go through shared_buffers are bad,
and we should be making an effort to get rid of them where we can
reasonably do so. I believe I've both introduced and fixed my share of
bugs that were caused by such cases, and I think the behavior of the
whole system would be a lot easier to reason about if we had fewer of
those, or none.

I can also think of at least one significant advantage of driving this
off the remote database's pg_class rather than the filesystem
contents. It's a known defect of PostgreSQL that if you create a table
and then crash, you leave behind a dead file that never gets removed.
If you now copy the database that contains that orphaned file, you
would ideally prefer not to copy that file, but if you do a copy based
on the filesystem contents, then you will. If you drive the copy off
of pg_class, you won't.

--
Robert Haas
EDB: http://www.enterprisedb.com

#20Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#19)
Re: [Proposal] Fully WAL logged CREATE DATABASE - No Checkpoints

Hi,

On 2021-06-17 13:53:38 -0400, Robert Haas wrote:

On Thu, Jun 17, 2021 at 5:20 AM Heikki Linnakangas <hlinnaka@iki.fi> wrote:

You only need relpersistence if you want to use the buffer cache, right?
I think that's a good argument for not using it.

Do we really need pg_class to figure this out? Can't we just check if
the relation has an init fork?

I can also think of at least one significant advantage of driving this
off the remote database's pg_class rather than the filesystem
contents. It's a known defect of PostgreSQL that if you create a table
and then crash, you leave behind a dead file that never gets removed.
If you now copy the database that contains that orphaned file, you
would ideally prefer not to copy that file, but if you do a copy based
on the filesystem contents, then you will. If you drive the copy off
of pg_class, you won't.

I'm very unconvinced this is the place to tackle the issue of orphan
relfilenodes. It'd be one thing if it were doable by existing code,
e.g. because we supported cross-database relation accesses fully, but we
don't.

Adding a hacky special case implementation for cross-database relation
accesses that violates all kinds of assumptions (like holding a lock on
a relation when accessing it / pinning pages, processing relcache
invals, ...) doesn't seem like a good plan.

I don't think this is an academic concern: You need to read from shared
buffers to read the "remote" pg_class, otherwise you'll potentially miss
changes. But it's not correct to read in pages or to pin pages without
holding a lock, and there's code that relies on that (see
e.g. InvalidateBuffer()).

Greetings,

Andres Freund

#21Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#20)
#22Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#21)
#23Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#22)
#24Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#23)
#25Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#24)
#26Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#25)
#27Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#22)
#28Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#26)
#29Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#28)
#30Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#27)
#31Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#30)
#32Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#31)
#33Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#32)
#34Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#33)
#35Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#30)
#36Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#35)
#37Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#36)
#38Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#26)
#39Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#38)
#40Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#39)
#41John Naylor
john.naylor@enterprisedb.com
In reply to: Dilip Kumar (#40)
#42Dilip Kumar
dilipbalaut@gmail.com
In reply to: John Naylor (#41)
#43Greg Nancarrow
gregn4422@gmail.com
In reply to: Dilip Kumar (#40)
#44Dilip Kumar
dilipbalaut@gmail.com
In reply to: Greg Nancarrow (#43)
#45Greg Nancarrow
gregn4422@gmail.com
In reply to: Dilip Kumar (#44)
#46Greg Nancarrow
gregn4422@gmail.com
In reply to: Dilip Kumar (#44)
#47Dilip Kumar
dilipbalaut@gmail.com
In reply to: Greg Nancarrow (#46)
#48Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#47)
#49Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#48)
#50Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#49)
#51Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#50)
#52Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Ashutosh Sharma (#51)
#53Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#52)
#54Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#53)
#55Robert Haas
robertmhaas@gmail.com
In reply to: Ashutosh Sharma (#54)
#56Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Robert Haas (#55)
#57Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#54)
#58Neha Sharma
neha.sharma@enterprisedb.com
In reply to: Dilip Kumar (#57)
#59Greg Nancarrow
gregn4422@gmail.com
In reply to: Neha Sharma (#58)
#60Neha Sharma
neha.sharma@enterprisedb.com
In reply to: Greg Nancarrow (#59)
#61Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Neha Sharma (#60)
#62Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#61)
#63Neha Sharma
neha.sharma@enterprisedb.com
In reply to: Ashutosh Sharma (#61)
#64Dilip Kumar
dilipbalaut@gmail.com
In reply to: Neha Sharma (#63)
#65Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Neha Sharma (#63)
#66Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#65)
#67Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#66)
#68Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#67)
#69Bruce Momjian
bruce@momjian.us
In reply to: Dilip Kumar (#48)
#70Dilip Kumar
dilipbalaut@gmail.com
In reply to: Bruce Momjian (#69)
#71Neha Sharma
neha.sharma@enterprisedb.com
In reply to: Dilip Kumar (#70)
#72Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Neha Sharma (#71)
#73Dilip Kumar
dilipbalaut@gmail.com
In reply to: Neha Sharma (#71)
#74Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Ashutosh Sharma (#72)
#75Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#72)
#76Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#75)
#77Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#76)
#78Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#77)
#79Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#55)
#80Robert Haas
robertmhaas@gmail.com
In reply to: Ashutosh Sharma (#78)
#81Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#66)
#82Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#79)
#83Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#79)
#84Andrew Dunstan
andrew@dunslane.net
In reply to: Dilip Kumar (#10)
#85Dilip Kumar
dilipbalaut@gmail.com
In reply to: Bruce Momjian (#83)
#86Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andrew Dunstan (#84)
#87Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#83)
#88Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#86)
#89Andrew Dunstan
andrew@dunslane.net
In reply to: Dilip Kumar (#86)
#90Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#82)
#91Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#87)
#92Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#91)
#93Julien Rouhaud
rjuju123@gmail.com
In reply to: Robert Haas (#92)
#94Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#88)
#95Robert Haas
robertmhaas@gmail.com
In reply to: Julien Rouhaud (#93)
#96Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#95)
#97Andrew Dunstan
andrew@dunslane.net
In reply to: Dilip Kumar (#94)
#98Robert Haas
robertmhaas@gmail.com
In reply to: Andrew Dunstan (#97)
#99Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#98)
#100Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#99)
#101Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#100)
#102Andrew Dunstan
andrew@dunslane.net
In reply to: Bruce Momjian (#101)
#103Robert Haas
robertmhaas@gmail.com
In reply to: Andrew Dunstan (#102)
#104Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#101)
#105Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#98)
#106Andrew Dunstan
andrew@dunslane.net
In reply to: Robert Haas (#103)
#107Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#105)
#108Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#107)
#109Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#108)
#110Dilip Kumar
dilipbalaut@gmail.com
In reply to: Alvaro Herrera (#105)
#111Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#110)
#112Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#111)
#113Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#112)
#114Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#111)
#115Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#113)
#116Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#113)
#117Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#111)
#118Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#117)
#119Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#110)
#120Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#119)
#121Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#120)
#122Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#121)
#123Maciek Sakrejda
m.sakrejda@gmail.com
In reply to: Robert Haas (#122)
#124Dilip Kumar
dilipbalaut@gmail.com
In reply to: Maciek Sakrejda (#123)
#125Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#124)
#126Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#125)
#127Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#126)
#128Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#127)
#129Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#127)
#130Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#128)
#131Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#128)
#132Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#124)
#133Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#132)
#134Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#133)
#135Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#134)
#136Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#135)
#137Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#136)
#138Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#137)
#139Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#138)
#140Dilip Kumar
dilipbalaut@gmail.com
In reply to: Ashutosh Sharma (#139)
#141Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#138)
#142Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#140)
#143Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Robert Haas (#141)
#144Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#141)
#145Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#144)
#146Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#145)
#147Robert Haas
robertmhaas@gmail.com
In reply to: Ashutosh Sharma (#143)
#148Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Robert Haas (#147)
#149Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#145)
#150Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#149)
#151Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#145)
#152Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#151)
#153Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#150)
#154Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#152)
#155Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#152)
#156Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#154)
#157Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#156)
#158Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#157)
#159Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#158)
#160Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#157)
#161Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Dilip Kumar (#160)
#162Robert Haas
robertmhaas@gmail.com
In reply to: Ashutosh Sharma (#161)
#163Ashutosh Sharma
ashu.coek88@gmail.com
In reply to: Robert Haas (#162)
#164Robert Haas
robertmhaas@gmail.com
In reply to: Ashutosh Sharma (#163)
#165Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#164)
#166Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#165)
#167Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#166)
#168Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#167)
#169Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#168)
#170Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#169)
#171Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#170)
#172Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#171)
#173Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#172)
#174Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#173)
#175Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#174)
#176Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#175)
#177Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#176)
#178Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#176)
#179Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#178)
#180Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#173)
#181Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#176)
#182Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#180)
#183Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#182)
#184Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#183)
#185Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#184)
#186Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#185)
#187Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#184)
#188Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#187)
#189Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#186)
#190Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#188)
#191Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#190)
#192Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#191)
#193Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#192)
#194Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#193)
#195Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#194)
#196Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#195)
#197Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#196)
#198Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#197)
#199Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#198)
#200Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#199)
#201Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#200)
#202Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#200)
#203Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#202)
#204Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#203)
#205Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#203)
#206Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#205)
#207Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#206)
#208Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#207)
#209Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#208)
#210Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#209)
#211Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#202)
#212Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#211)
#213Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#202)
#214Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#212)
#215Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#202)
#216Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#215)
#217Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#216)
#218Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#217)
#219Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#217)
#220Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#218)
#221Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#220)
#222Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#221)
#223Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#222)
#224Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#219)
#225Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#202)
#226Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#225)
#227Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#202)
#228Robert Haas
robertmhaas@gmail.com
In reply to: Justin Pryzby (#227)
#229Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#228)
#230Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#229)
#231Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#230)
#232Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#231)
#233Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#232)
#234Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#233)
#235Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#234)
#236Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#235)
#237Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#236)
#238Justin Pryzby
pryzby@telsasoft.com
In reply to: Dilip Kumar (#235)
#239Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#238)
#240Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#238)
#241Andres Freund
andres@anarazel.de
In reply to: Justin Pryzby (#240)
#242Justin Pryzby
pryzby@telsasoft.com
In reply to: Andres Freund (#241)
#243Dilip Kumar
dilipbalaut@gmail.com
In reply to: Justin Pryzby (#242)
#244Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#243)
#245Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#235)
#246Justin Pryzby
pryzby@telsasoft.com
In reply to: Robert Haas (#245)
#247Tom Lane
tgl@sss.pgh.pa.us
In reply to: Justin Pryzby (#246)
#248Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#235)
#249Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#245)
#250Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#244)
#251Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#245)
#252Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#250)
#253Justin Pryzby
pryzby@telsasoft.com
In reply to: Tom Lane (#251)
#254Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#252)
#255Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#251)
#256Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#255)
#257Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#255)
#258Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#254)
#259Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#257)
#260Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#256)
#261Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#259)
#262Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#260)
#263Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#261)
#264Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#251)
#265Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#255)
#266Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#256)
#267Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#255)
#268Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#261)
#269Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#248)
#270Dilip Kumar
dilipbalaut@gmail.com
In reply to: Dilip Kumar (#269)
#271Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#258)
#272Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dilip Kumar (#270)
#273Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dilip Kumar (#270)
#274Dilip Kumar
dilipbalaut@gmail.com
In reply to: Tom Lane (#273)
#275Andres Freund
andres@anarazel.de
In reply to: Dilip Kumar (#274)
#276Dilip Kumar
dilipbalaut@gmail.com
In reply to: Andres Freund (#275)
#277Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#276)
#278Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#277)
#279Dilip Kumar
dilipbalaut@gmail.com
In reply to: Robert Haas (#278)
#280Robert Haas
robertmhaas@gmail.com
In reply to: Dilip Kumar (#279)