@@ -2232,7 +2232,14 @@ void DPM_store( thread_db* tdbb, record_param* rpb, PageStack& stack, const Jrd:
2232
2232
memset(data + size, 0, fill);
2233
2233
2234
2234
Ods::pag* page = rpb->getWindow(tdbb).win_buffer;
2235
- if (page->pag_flags & dpg_swept)
2235
+
2236
+ // When restoring, mark primary data page as swept, pointer page already marked by locate_space()
2237
+ if (tdbb->getAttachment()->isGbak() && !rpb->rpb_relation->isSystem() && (type == DPM_primary))
2238
+ {
2239
+ page->pag_flags |= dpg_swept;
2240
+ CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
2241
+ }
2242
+ else if (page->pag_flags & dpg_swept)
2236
2243
{
2237
2244
page->pag_flags &= ~dpg_swept;
2238
2245
mark_full(tdbb, rpb);
@@ -3083,7 +3090,13 @@ static void extend_relation(thread_db* tdbb, jrd_rel* relation, WIN* window, con
3083
3090
UCHAR* bits = (UCHAR*) (ppage->ppg_page + dbb->dbb_dp_per_pp);
3084
3091
PPG_DP_BIT_CLEAR(bits, slot, PPG_DP_ALL_BITS);
3085
3092
3086
- if (type != DPM_primary)
3093
+ if (type == DPM_primary)
3094
+ {
3095
+ // When restoring, mark slot as swept, data page will be marked by our caller
3096
+ if (tdbb->getAttachment()->isGbak() && !relation->isSystem())
3097
+ PPG_DP_BIT_SET(bits, slot, ppg_dp_swept);
3098
+ }
3099
+ else
3087
3100
PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
3088
3101
3089
3102
for (unsigned i = 1; i < cntAlloc; i++)
@@ -3536,7 +3549,13 @@ static rhd* locate_space(thread_db* tdbb,
3536
3549
3537
3550
PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_empty);
3538
3551
if (type == DPM_primary)
3552
+ {
3539
3553
PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_secondary);
3554
+
3555
+ // When restoring, mark slot as swept, data page will be marked by our caller
3556
+ if (tdbb->getAttachment()->isGbak() && !relation->isSystem())
3557
+ PPG_DP_BIT_SET(bits, slot, ppg_dp_swept);
3558
+ }
3540
3559
else
3541
3560
PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
3542
3561
@@ -3918,11 +3937,28 @@ static void store_big_record(thread_db* tdbb,
3918
3937
header->rhdf_b_page, header->rhdf_b_line);
3919
3938
#endif
3920
3939
3940
+
3941
+ bool markPP = false;
3942
+
3943
+ // When restoring, mark primary data page as swept, pointer page already marked by locate_space()
3944
+ if (tdbb->getAttachment()->isGbak() && !rpb->rpb_relation->isSystem() && (type == DPM_primary))
3945
+ {
3946
+ page->dpg_header.pag_flags |= dpg_swept;
3947
+ }
3948
+ else if (page->dpg_header.pag_flags & dpg_swept)
3949
+ {
3950
+ page->dpg_header.pag_flags &= ~dpg_swept;
3951
+ markPP = true;
3952
+ }
3953
+
3921
3954
if (!(page->dpg_header.pag_flags & dpg_large))
3922
3955
{
3923
3956
page->dpg_header.pag_flags |= dpg_large;
3924
- mark_full(tdbb, rpb) ;
3957
+ markPP = true ;
3925
3958
}
3959
+
3960
+ if (markPP)
3961
+ mark_full(tdbb, rpb);
3926
3962
else
3927
3963
CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
3928
3964
}
0 commit comments