Re: Inval reliability, especially for inplace updates
Noah Misch <noah@leadboat.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Update .abi-compliance-history for PrepareToInvalidateCacheTuple().
- d88f4535d29f 15.16 landed
- a3e7bbd410d4 17.8 landed
- 2e58802f7332 14.21 landed
- 2655d2e47803 16.12 landed
-
Assert lack of hazardous buffer locks before possible catalog read.
- 0dfbd191a939 14.21 landed
- 86091202a8b1 15.16 landed
- 27e4fad9804c 16.12 landed
- bcb784e7d2f9 17.8 landed
- f4ece891fc2f 18.0 landed
-
For inplace update, send nontransactional invalidations.
- 811422471940 14.21 landed
- 1d7b02711f70 16.12 landed
- 05d605b6c69f 15.16 landed
- 0f69beddea11 17.8 landed
- 4cf948cbeedf 12.21 landed
- 0ea9d40a6679 13.17 landed
- e3914bd136e4 14.14 landed
- 4eac5a1fa78e 15.9 landed
- ce8c571d014e 16.5 landed
- 95c5acb3fc26 17.1 landed
- 243e9b40f1b2 18.0 landed
-
Update .abi-compliance-history for CacheInvalidateHeapTupleInplace().
- 06b030e8973f 18.2 landed
-
Revisit cosmetics of "For inplace update, send nontransactional invalidations."
- bae8ca82fd00 18.2 landed
- 64bf53dd61ea 19 (unreleased) landed
-
Correct comments of "Fix data loss at inplace update after heap_update()".
- 0839fbe400d7 19 (unreleased) landed
-
Move I/O before the index_update_stats() buffer lock region.
- d729f1ea5a46 12.21 landed
- 6b01cac0be6d 13.17 landed
- bb3054297661 14.14 landed
- 6d5b4031b927 15.9 landed
- 6c837c237bf8 16.5 landed
- 0bcb9d07940c 17.1 landed
- b412f402d1e0 18.0 landed
-
Revert "For inplace update, send nontransactional invalidations."
- 4b0f7d6c162e 12.21 landed
- fe8091c9e39e 13.17 landed
- 4c7088729503 14.14 landed
- 27642d89081e 15.9 landed
- 6f9dd2282e37 16.5 landed
- c1099dd745b0 17.1 landed
-
Revert "WAL-log inplace update before revealing it to other sessions."
- 5e503e10d13e 12.21 landed
- be74b943c920 13.17 landed
- 9a1c73636d60 14.14 landed
- e50f9de98d63 15.9 landed
- d5be10758b36 16.5 landed
- bc6bad885725 17.1 landed
-
Fix inplace update buffer self-deadlock.
- 0bada39c83a1 18.0 landed
-
Remove duplicate words in comments
- fb7e27abfbd4 18.0 cited
-
At end of recovery, reset all sinval-managed caches.
- da9950456463 12.21 landed
- 67f30c79a1c1 13.17 landed
- dca68242a81b 14.14 landed
- 3baf804b7295 15.9 landed
- d36b4d8ec322 16.5 landed
- a4668c99f0f8 17.1 landed
-
Fix data loss at inplace update after heap_update().
- a07e03fd8fa7 18.0 cited
-
Remove comment about xl_heap_inplace "AT END OF STRUCT".
- c63ceb2f0006 13.16 landed
- 77d0bc8001e6 12.20 landed
- c7f10df36806 14.13 landed
- 2ca8ca4827af 15.8 landed
- e352ba7b7509 16.4 landed
- 4a7f91b3d314 17.0 landed
-
Reduce memory consumption for pending invalidation messages.
- 3aafc030a536 15.0 cited
-
Add support for streaming to built-in logical replication.
- 464824323e57 14.0 cited
-
WAL Log invalidations at command end with wal_level=logical.
- c55040ccd017 14.0 cited
-
Introduce logical decoding.
- b89e151054a0 9.4.0 cited
-
Rename and document some invalidation routines to make it clearer that
- 81d08fcffeed 7.1.1 cited
Attachments
- inplace140-heapam_xlog-comment-v2.patch (text/plain) patch v2
- inplace160-inval-durability-inplace-v2.patch (text/plain) patch v2
On Sat, Jun 15, 2024 at 03:37:18PM -0700, Noah Misch wrote: > On Wed, May 22, 2024 at 05:05:48PM -0700, Noah Misch wrote: > > https://postgr.es/m/20240512232923.aa.nmisch@google.com wrote: > > > Separable, nontrivial things not fixed in the attached patch stack: > > > > > > - Inplace update uses transactional CacheInvalidateHeapTuple(). ROLLBACK of > > > CREATE INDEX wrongly discards the inval, leading to the relhasindex=t loss > > > still seen in inplace-inval.spec. CacheInvalidateRelmap() does this right. > > > > I plan to fix that like CacheInvalidateRelmap(): send the inval immediately, > > inside the critical section. Send it in heap_xlog_inplace(), too. > > > a. Within logical decoding, cease processing invalidations for inplace > > I'm attaching the implementation. This applies atop the v3 patch stack from > https://postgr.es/m/20240614003549.c2.nmisch@google.com, but the threads are > mostly orthogonal and intended for independent review. Translating a tuple > into inval messages uses more infrastructure than relmapper, which needs just > a database ID. Hence, this ended up more like a miniature of inval.c's > participation in the transaction commit sequence. > > I waffled on whether to back-patch inplace150-inval-durability-atcommit That inplace150 patch turned out to be unnecessary. Contrary to the "noncritical resource releasing" comment some lines above AtEOXact_Inval(true), the actual behavior is already to promote ERROR to PANIC. An ERROR just before or after sending invals becomes PANIC, "cannot abort transaction %u, it was already committed". Since inplace130-AtEOXact_RelationCache-comments existed to clear the way for inplace150, inplace130 also becomes unnecessary. I've removed both from the attached v2 patch stack. > The patch changes xl_heap_inplace of XLOG_HEAP_INPLACE. For back branches, we > could choose between: > > - Same change, no WAL version bump. Standby must update before primary. This > is best long-term, but the transition is more disruptive. I'm leaning > toward this one, but the second option isn't bad: > > - heap_xlog_inplace() could set the shared-inval-queue overflow signal on > every backend. This is more wasteful, but inplace updates might be rare > enough (~once per VACUUM) to make it tolerable. > > - Use LogStandbyInvalidations() just after XLOG_HEAP_INPLACE. This isn't > correct if one ends recovery between the two records, but you'd need to be > unlucky to notice. Noticing would need a procedure like the following. A > hot standby backend populates a relcache entry, then does DDL on the rel > after recovery ends. That still holds.