Update restore on an empty page leads to block leakage in disagg

XMLWordPrintableJSON

    • Storage Engines, Storage Engines - Persistence
    • SE Persistence - 2025-11-21, SE Persistence - 2025-12-05
    • None

      In this code path of __rec_write_wrapup, there is a chance that the original page_id is not 0 but page id in r->multi is 0. This is because reconciliation generates an empty page which we don't write to disagg and therefore there is no page id associated with it.

      In this scenario, the block_meta reset will lead to a page leakage, and then failed the page_discard_verify. This happened to both PALite and PALM. To repro this fault, you can use the CONFIG from WT-16038 . You need to run several times to reproduce this bug it's not guaranteed to happen each time. Increase the op count by increase runs.ops in the CONFIG file can help you repro this easier.

       

      if (F_ISSET(r, WT_REC_IN_MEMORY) || r->multi->supd_restore) {
                  WT_ASSERT(session, !F_ISSET(r, WT_REC_REWRITE_DELTA));
                  if (page->disagg_info != NULL)
                      page->disagg_info->block_meta = *r->multi->block_meta;
                  WT_ASSERT_ALWAYS(session,
                    F_ISSET(r, WT_REC_IN_MEMORY) ||
                      (F_ISSET(r, WT_REC_EVICT) && r->leave_dirty && r->multi->supd_entries != 0),
                    "Attempting a 1-for-1 page swap when there are still updates to write");
                  goto split;
              } 

       

       

            Assignee:
            Albert Song
            Reporter:
            Albert Song
            Albert Song, Chenhao Qu
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: