MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / garbage_collect

Method garbage_collect

src/jrd/validation.cpp:1313–1400  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1311}
1312
1313void Validation::garbage_collect()
1314{
1315/**************************************
1316 *
1317 * g a r b a g e _ c o l l e c t
1318 *
1319 **************************************
1320 *
1321 * Functional description
1322 * The database has been walked; compare the page inventory against
1323 * the bitmap of pages visited.
1324 *
1325 **************************************/
1326 Database* dbb = vdr_tdbb->getDatabase();
1327
1328 PageManager& pageSpaceMgr = dbb->dbb_page_manager;
1329 PageSpace* pageSpace = pageSpaceMgr.findPageSpace(DB_PAGE_SPACE);
1330 fb_assert(pageSpace);
1331
1332 WIN window(DB_PAGE_SPACE, -1);
1333
1334 for (ULONG sequence = 0, number = 0; number < vdr_max_page; sequence++)
1335 {
1336 const ULONG page_number = sequence ? sequence * pageSpaceMgr.pagesPerPIP - 1 : pageSpace->pipFirst;
1337 page_inv_page* page = 0;
1338 fetch_page(false, page_number, pag_pages, &window, &page);
1339 UCHAR* p = page->pip_bits;
1340 const UCHAR* const end = p + pageSpaceMgr.bytesBitPIP;
1341 while (p < end && number < vdr_max_page)
1342 {
1343 UCHAR byte = *p++;
1344 for (int i = 8; i; --i, byte >>= 1, number++)
1345 {
1346 if (PageBitmap::test(vdr_page_bitmap, number))
1347 {
1348 if (byte & 1)
1349 {
1350 corrupt(VAL_PAG_IN_USE, 0, number);
1351 if (vdr_flags & VDR_update)
1352 {
1353 CCH_MARK(vdr_tdbb, &window);
1354 p[-1] &= ~(1 << (number & 7));
1355 vdr_fixed++;
1356 }
1357 }
1358 }
1359 else if (!(byte & 1) && (vdr_flags & VDR_records))
1360 {
1361 // Page is potentially an orphan - but don't declare it as such
1362 // unless we think we walked all pages
1363
1364 corrupt(VAL_PAG_ORPHAN, 0, number);
1365 if (vdr_flags & VDR_update)
1366 {
1367 CCH_MARK(vdr_tdbb, &window);
1368 p[-1] |= 1 << (number & 7);
1369 vdr_fixed++;
1370

Callers

nothing calls this directly

Calls 8

corruptFunction · 0.85
CCH_MARKFunction · 0.85
getDatabaseMethod · 0.80
findPageSpaceMethod · 0.80
testFunction · 0.50
getFirstMethod · 0.45
currentMethod · 0.45
getNextMethod · 0.45

Tested by

no test coverage detected