[MASSMAIL]pgsql: freespace: Don't return blocks past the end of the main fork.

Поиск
Список
Период
Сортировка
От Noah Misch
Тема [MASSMAIL]pgsql: freespace: Don't return blocks past the end of the main fork.
Дата
Msg-id E1rvgv3-001u7m-2Y@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
freespace: Don't return blocks past the end of the main fork.

GetPageWithFreeSpace() callers assume the returned block exists in the
main fork, failing with "could not read block" errors if that doesn't
hold.  Make that assumption reliable now.  It hadn't been guaranteed,
due to the weak WAL and data ordering of participating components.  Most
operations on the fsm fork are not WAL-logged.  Relation extension is
not WAL-logged.  Hence, an fsm-fork block on disk can reference a
main-fork block that no WAL record has initialized.  That could happen
after an OS crash, a replica promote, or a PITR restore.  wal_log_hints
makes the trouble easier to hit; a replica promote or PITR ending just
after a relevant fsm-fork FPI_FOR_HINT may yield this broken state.  The
v16 RelationAddBlocks() mechanism also makes the trouble easier to hit,
since it bulk-extends even without extension lock waiters.  Commit
917dc7d2393ce680dea7a59418be9ff341df3c14 stopped trouble around
truncation, but vectors involving PageIsNew() pages remained.

This implementation adds a RelationGetNumberOfBlocks() call when the
cached relation size doesn't confirm a block exists.  We've been unable
to identify a benchmark that slows materially, but this may show up as
additional time in lseek().  An alternative without that overhead would
be a new ReadBufferMode such that ReadBufferExtended() returns NULL
after a 0-byte read, with all other errors handled normally.  However,
each GetFreeIndexPage() caller would then need code for the return-NULL
case.  Back-patch to v14, due to earlier versions not caching relation
size and the absence of a pre-v16 problem report.

Ronan Dunklau.  Reported by Ronan Dunklau.

Discussion: https://postgr.es/m/1878547.tdWV9SEqCh%40aivenlaptop

Branch
------
REL_14_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/08059fc049ff5461d2a8f18c7a3e84150d74529c

Modified Files
--------------
src/backend/storage/freespace/README      |  16 ++++-
src/backend/storage/freespace/freespace.c | 106 ++++++++++++++++++++++++++----
src/backend/storage/smgr/smgr.c           |   5 +-
src/test/recovery/t/008_fsm_truncation.pl |   5 +-
4 files changed, 112 insertions(+), 20 deletions(-)


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

Предыдущее
От: Noah Misch
Дата:
Сообщение: [MASSMAIL]pgsql: Correct "improve role option documentation".
Следующее
От: Tomas Vondra
Дата:
Сообщение: pgsql: Update nbits_set in brin_bloom_union