Re: eliminate xl_heap_visible to reduce WAL (and eventually set VM on-access)
От | Kirill Reshke |
---|---|
Тема | Re: eliminate xl_heap_visible to reduce WAL (and eventually set VM on-access) |
Дата | |
Msg-id | CALdSSPhAU56g1gGVT0+wG8RrSWE6qW8TOfNJS1HNAWX6wPgbFA@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: eliminate xl_heap_visible to reduce WAL (and eventually set VM on-access) (Melanie Plageman <melanieplageman@gmail.com>) |
Список | pgsql-hackers |
On Sat, 2 Aug 2025 at 02:36, Melanie Plageman <melanieplageman@gmail.com> wrote: > > On Thu, Jul 31, 2025 at 6:58 PM Melanie Plageman > <melanieplageman@gmail.com> wrote: > > > > The patch "Set-pd_prune_xid-on-insert.txt" can be applied as the last > > patch in the set. It sets pd_prune_xid on insert (so pages filled by > > COPY or insert can also be set all-visible in the VM before they are > > vacuumed). I gave it a .txt extension because it currently fails > > 035_standby_logical_decoding due to a recovery conflict. I need to > > investigate more to see if this is a bug in my patch set or elsewhere > > in Postgres. > > I figured out that if we set the VM on-access, we need to enable > hot_standby_feedback in more places in 035_standby_logical_decoding.pl > to avoid recovery conflicts. I've done that in the attached updated > version 6. There are a few other issues in > 035_standby_logical_decoding.pl that I reported here [1]. With these > changes, setting pd_prune_xid on insert passes tests. Whether or not > we want to do it (and what the heuristic should be for deciding when > to do it) is another question. > > - Melanie > > [1] https://www.postgresql.org/message-id/flat/CAAKRu_YO2mEm%3DZWZKPjTMU%3DgW5Y83_KMi_1cr51JwavH0ctd7w%40mail.gmail.com Hi! Andrey told me off-list about this thread and I decided to take a look. I tried to play with each patch in this patchset and find a corruption, but I was unsuccessful. I will conduct further tests later. I am not implying that I suspect this patchset causes any corruption; I am merely attempting to verify it. I also have few comments and questions. Here is my (very limited) review of 0001, because I believe that removing xl_heap_visible from COPY FREEZE is pure win, so this patch can be very beneficial by itself. visibilitymap_set_vmbyte is introduced in 0001 and removed in 0012. This is strange to me, maybe we can avoid visibilitymap_set_vmbyte in first place? In 0001: 1) should we add "Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr), LW_EXCLUSIVE));" in visibilitymap_set_vmbyte? Also here `Assert(visibilitymap_pin_ok(BufferGetBlockNumber(buffer), vmbuffer));` can be beneficial: >/* >+ * If we're only adding already frozen rows to a previously empty >+ * page, mark it as all-frozen and update the visibility map. We're >+ * already holding a pin on the vmbuffer. >+ */ > else if (all_frozen_set) >+ { > PageSetAllVisible(page); >+ LockBuffer(vmbuffer, BUFFER_LOCK_EXCLUSIVE); >+ visibilitymap_set_vmbyte(relation, >+ BufferGetBlockNumber(buffer), >+ vmbuffer, >+ VISIBILITYMAP_ALL_VISIBLE | >+ VISIBILITYMAP_ALL_FROZEN); >+ } 2) in heap_xlog_multi_insert: + + visibilitymap_pin(reln, blkno, &vmbuffer); + visibilitymap_set_vmbyte(....) Do we need to pin vmbuffer here? Looks like XLogReadBufferForRedoExtended already pins vmbuffer. I verified this with CheckBufferIsPinnedOnce(vmbuffer) just before visibilitymap_pin and COPY ... WITH (FREEZE true) test. 3) >+ > +#ifdef TRACE_VISIBILITYMAP > + elog(DEBUG1, "vm_set %s %d", RelationGetRelationName(rel), heapBlk); > +#endif I can see this merely copy-pasted from visibilitymap_set, but maybe display "flags" also? 4) visibilitymap_set receives XLogRecPtr recptr parameters, which is set to WAL record lsn during recovery and to InvalidXLogRecPtr otherwise. visibilitymap_set manages VM page LSN bases on this recptr value (inside function logic). visibilitymap_set_vmbyte behaves vise-versa and makes its caller responsible for page LSN management. Maybe we should keep these two functions akin to each other? -- Best regards, Kirill Reshke
В списке pgsql-hackers по дате отправления: