On 21/02/2023 21:22, Andres Freund wrote:
On 2023-02-21 18:18:02 +0200, Heikki Linnakangas wrote:
Is it ever possible to call this without a relcache entry? WAL redo
functions do that with ReadBuffer, but they only extend a relation
implicitly, by replay a record for a particular block.

I think we should use it for crash recovery as well, but the patch doesn't
yet. We have some gnarly code there, see the loop using P_NEW in
XLogReadBufferExtended(). Extending the file one-by-one is a lot more
expensive than doing it in bulk.

Hmm, XLogReadBufferExtended() could use smgrzeroextend() to fill the gap, and then call ExtendRelationBuffered for the target page. Or the new ExtendRelationBufferedTo() function that you mentioned.

In the common case that you load a lot of data to a relation extending it, and then crash, the WAL replay would still extend the relation one page at a time, which is inefficient. Changing that would need bigger changes, to WAL-log the relation extension as a separate WAL record, for example. I don't think we need to solve that right now, it can be addressed separately later.

- Heikki



Reply via email to