@@ -100,6 +100,11 @@ namespace
100
100
101
101
return lock.release();
102
102
}
103
+
104
+ inline bool swept_at_restore(thread_db* tdbb, const jrd_rel* relation)
105
+ {
106
+ return tdbb->getDatabase()->isRestoring() && !relation->isSystem();
107
+ }
103
108
}
104
109
105
110
@@ -2232,7 +2237,14 @@ void DPM_store( thread_db* tdbb, record_param* rpb, PageStack& stack, const Jrd:
2232
2237
memset(data + size, 0, fill);
2233
2238
2234
2239
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)
2236
2248
{
2237
2249
page->pag_flags &= ~dpg_swept;
2238
2250
mark_full(tdbb, rpb);
@@ -3083,7 +3095,13 @@ static void extend_relation(thread_db* tdbb, jrd_rel* relation, WIN* window, con
3083
3095
UCHAR* bits = (UCHAR*) (ppage->ppg_page + dbb->dbb_dp_per_pp);
3084
3096
PPG_DP_BIT_CLEAR(bits, slot, PPG_DP_ALL_BITS);
3085
3097
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
3087
3105
PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
3088
3106
3089
3107
for (unsigned i = 1; i < cntAlloc; i++)
@@ -3536,7 +3554,13 @@ static rhd* locate_space(thread_db* tdbb,
3536
3554
3537
3555
PPG_DP_BIT_CLEAR(bits, slot, ppg_dp_empty);
3538
3556
if (type == DPM_primary)
3557
+ {
3539
3558
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
+ }
3540
3564
else
3541
3565
PPG_DP_BIT_SET(bits, slot, ppg_dp_secondary);
3542
3566
@@ -3918,11 +3942,28 @@ static void store_big_record(thread_db* tdbb,
3918
3942
header->rhdf_b_page, header->rhdf_b_line);
3919
3943
#endif
3920
3944
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
+
3921
3959
if (!(page->dpg_header.pag_flags & dpg_large))
3922
3960
{
3923
3961
page->dpg_header.pag_flags |= dpg_large;
3924
- mark_full(tdbb, rpb) ;
3962
+ markPP = true ;
3925
3963
}
3964
+
3965
+ if (markPP)
3966
+ mark_full(tdbb, rpb);
3926
3967
else
3927
3968
CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
3928
3969
}
0 commit comments