pgsql: Use GetXLogInsertEndRecPtr in gistGetFakeLSN
| От | Tomas Vondra |
|---|---|
| Тема | pgsql: Use GetXLogInsertEndRecPtr in gistGetFakeLSN |
| Дата | |
| Msg-id | E1w1B0R-0002Rv-1k@gemulon.postgresql.org обсуждение исходный текст |
| Список | pgsql-committers |
Use GetXLogInsertEndRecPtr in gistGetFakeLSN The function used GetXLogInsertRecPtr() to generate the fake LSN. Most of the time this is the same as what XLogInsert() would return, and so it works fine with the XLogFlush() call. But if the last record ends at a page boundary, GetXLogInsertRecPtr() returns LSN pointing after the page header. In such case XLogFlush() fails with errors like this: ERROR: xlog flush request 0/01BD2018 is not satisfied --- flushed only to 0/01BD2000 Such failures are very hard to trigger, particularly outside aggressive test scenarios. Fixed by introducing GetXLogInsertEndRecPtr(), returning the correct LSN without skipping the header. This is the same as GetXLogInsertRecPtr(), except that it calls XLogBytePosToEndRecPtr(). Initial investigation by me, root cause identified by Andres Freund. This is a long-standing bug in gistGetFakeLSN(), probably introduced by c6b92041d38 in PG13. Backpatch to all supported versions. Reported-by: Peter Geoghegan <pg@bowt.ie> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Noah Misch <noah@leadboat.com> Discussion: https://postgr.es/m/vf4hbwrotvhbgcnknrqmfbqlu75oyjkmausvy66ic7x7vuhafx@e4rvwavtjswo Backpatch-through: 14 Branch ------ REL_16_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/4f4025eac0b9a8d0b1a4b48db48f770313ea085e Modified Files -------------- src/backend/access/gist/gistutil.c | 2 +- src/backend/access/transam/xlog.c | 16 ++++++++++++++++ src/include/access/xlog.h | 1 + 3 files changed, 18 insertions(+), 1 deletion(-)
В списке pgsql-committers по дате отправления: