diff --git a/src/burp/BurpTasks.cpp b/src/burp/BurpTasks.cpp index d6a0cd66821..4a90179dd8f 100644 --- a/src/burp/BurpTasks.cpp +++ b/src/burp/BurpTasks.cpp @@ -902,7 +902,7 @@ void RestoreRelationTask::initItem(BurpGlobals* tdgbl, Item& item) m_masterGbl->gbl_dpb_data.begin(), m_masterGbl->gbl_dpb_data.getCount()); - dpb.deleteWithTag(isc_dpb_gbak_attach); + //dpb.deleteWithTag(isc_dpb_gbak_attach); const UCHAR* dpbBuffer = dpb.getBuffer(); const USHORT dpbLength = dpb.getBufferLength(); diff --git a/src/jrd/dpm.epp b/src/jrd/dpm.epp index 5d1ef64924a..3eeab47f4b7 100644 --- a/src/jrd/dpm.epp +++ b/src/jrd/dpm.epp @@ -2232,7 +2232,14 @@ void DPM_store( thread_db* tdbb, record_param* rpb, PageStack& stack, const Jrd: memset(data + size, 0, fill); Ods::pag* page = rpb->getWindow(tdbb).win_buffer; - if (page->pag_flags & dpg_swept) + + // When restoring, mark primary data page as swept, pointer page already marked by locate_space() + if (tdbb->getAttachment()->isGbak() && !rpb->rpb_relation->isSystem() && (type == DPM_primary)) + { + page->pag_flags |= dpg_swept; + CCH_RELEASE(tdbb, &rpb->getWindow(tdbb)); + } + else if (page->pag_flags & dpg_swept) { page->pag_flags &= ~dpg_swept; mark_full(tdbb, rpb); @@ -3083,7 +3090,13 @@ static void extend_relation(thread_db* tdbb, jrd_rel* relation, WIN* window, con UCHAR* bits = (UCHAR*) (ppage->ppg_page + dbb->dbb_dp_per_pp); PPG_DP_BIT_CLEAR(bits, slot, PPG_DP_ALL_BITS); - if (type != DPM_primary) + if (type == DPM_primary) + { + // When restoring, mark slot as swept, data page will be marked by our caller + if (tdbb->getAttachment()->isGbak() && !relation->isSystem()) + PPG_DP_BIT_SET(bits, slot, ppg_dp_swept); + } + else PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary); for (unsigned i = 1; i < cntAlloc; i++) @@ -3536,7 +3549,13 @@ static rhd* locate_space(thread_db* tdbb, PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_empty); if (type == DPM_primary) + { PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_secondary); + + // When restoring, mark slot as swept, data page will be marked by our caller + if (tdbb->getAttachment()->isGbak() && !relation->isSystem()) + PPG_DP_BIT_SET(bits, slot, ppg_dp_swept); + } else PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary); @@ -3918,11 +3937,28 @@ static void store_big_record(thread_db* tdbb, header->rhdf_b_page, header->rhdf_b_line); #endif + + bool markPP = false; + + // When restoring, mark primary data page as swept, pointer page already marked by locate_space() + if (tdbb->getAttachment()->isGbak() && !rpb->rpb_relation->isSystem() && (type == DPM_primary)) + { + page->dpg_header.pag_flags |= dpg_swept; + } + else if (page->dpg_header.pag_flags & dpg_swept) + { + page->dpg_header.pag_flags &= ~dpg_swept; + markPP = true; + } + if (!(page->dpg_header.pag_flags & dpg_large)) { page->dpg_header.pag_flags |= dpg_large; - mark_full(tdbb, rpb); + markPP = true; } + + if (markPP) + mark_full(tdbb, rpb); else CCH_RELEASE(tdbb, &rpb->getWindow(tdbb)); }