@@ -100,6 +100,11 @@ namespace
100100
101101 return lock.release();
102102 }
103+
104+ inline bool swept_at_restore(thread_db* tdbb, const jrd_rel* relation)
105+ {
106+ return tdbb->getDatabase()->isRestoring() && !relation->isSystem();
107+ }
103108}
104109
105110
@@ -2232,7 +2237,14 @@ void DPM_store( thread_db* tdbb, record_param* rpb, PageStack& stack, const Jrd:
22322237 memset(data + size, 0, fill);
22332238
22342239 Ods::pag* page = rpb->getWindow(tdbb).win_buffer;
2235- if (page->pag_flags & dpg_swept)
2240+
2241+ // When restoring, mark primary data page as swept, pointer page already marked by locate_space()
2242+ if (swept_at_restore(tdbb, rpb->rpb_relation) && (type == DPM_primary))
2243+ {
2244+ page->pag_flags |= dpg_swept;
2245+ CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
2246+ }
2247+ else if (page->pag_flags & dpg_swept)
22362248 {
22372249 page->pag_flags &= ~dpg_swept;
22382250 mark_full(tdbb, rpb);
@@ -3083,7 +3095,13 @@ static void extend_relation(thread_db* tdbb, jrd_rel* relation, WIN* window, con
30833095 UCHAR* bits = (UCHAR*) (ppage->ppg_page + dbb->dbb_dp_per_pp);
30843096 PPG_DP_BIT_CLEAR(bits, slot, PPG_DP_ALL_BITS);
30853097
3086- if (type != DPM_primary)
3098+ if (type == DPM_primary)
3099+ {
3100+ // When restoring, mark slot as swept, data page will be marked by our caller
3101+ if (swept_at_restore(tdbb, relation))
3102+ PPG_DP_BIT_SET(bits, slot, ppg_dp_swept);
3103+ }
3104+ else
30873105 PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
30883106
30893107 for (unsigned i = 1; i < cntAlloc; i++)
@@ -3536,7 +3554,13 @@ static rhd* locate_space(thread_db* tdbb,
35363554
35373555 PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_empty);
35383556 if (type == DPM_primary)
3557+ {
35393558 PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_secondary);
3559+
3560+ // When restoring, mark slot as swept, data page will be marked by our caller
3561+ if (swept_at_restore(tdbb, relation))
3562+ PPG_DP_BIT_SET(bits, slot, ppg_dp_swept);
3563+ }
35403564 else
35413565 PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
35423566
@@ -3918,11 +3942,28 @@ static void store_big_record(thread_db* tdbb,
39183942 header->rhdf_b_page, header->rhdf_b_line);
39193943#endif
39203944
3945+
3946+ bool markPP = false;
3947+
3948+ // When restoring, mark primary data page as swept, pointer page already marked by locate_space()
3949+ if (swept_at_restore(tdbb, rpb->rpb_relation) && (type == DPM_primary))
3950+ {
3951+ page->dpg_header.pag_flags |= dpg_swept;
3952+ }
3953+ else if (page->dpg_header.pag_flags & dpg_swept)
3954+ {
3955+ page->dpg_header.pag_flags &= ~dpg_swept;
3956+ markPP = true;
3957+ }
3958+
39213959 if (!(page->dpg_header.pag_flags & dpg_large))
39223960 {
39233961 page->dpg_header.pag_flags |= dpg_large;
3924- mark_full(tdbb, rpb) ;
3962+ markPP = true ;
39253963 }
3964+
3965+ if (markPP)
3966+ mark_full(tdbb, rpb);
39263967 else
39273968 CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
39283969}
0 commit comments