The comment above heap_xlog_visible() about the critical integrity
requirement for PD_ALL_VISIBLE and the visibility map should also be in
heap_xlog_prune_freeze() where we set PD_ALL_VISIBLE.
Oversight in
add323da40a6bf9e
Author: Melanie Plageman <
[email protected]>
Discussion: https://postgr.es/m/flat/CAAKRu_ZMw6Npd_qm2KM%2BFwQ3cMOMx1Dh3VMhp8-V7SOLxdK9-g%40mail.gmail.com
/* There should be no more data */
Assert((char *) frz_offsets == dataptr + datalen);
+ /*
+ * The critical integrity requirement here is that we must never end
+ * up with the visibility map bit set and the page-level
+ * PD_ALL_VISIBLE bit unset. If that were to occur, a subsequent page
+ * modification would fail to clear the visibility map bit.
+ */
if (vmflags & VISIBILITYMAP_VALID_BITS)
PageSetAllVisible(page);