@@ -1355,26 +1355,27 @@ SINT64 DPM_gen_id(thread_db* tdbb, SLONG generator, bool initialize, SINT64 val)
13551355 const USHORT offset = generator % dbb->dbb_page_manager.gensPerPage;
13561356
13571357 WIN window(DB_PAGE_SPACE, -1);
1358- vcl* vector = dbb->dbb_gen_id_pages ;
1359- if (!vector || (sequence >= vector->count()) || !((*vector)[sequence]) )
1358+ ULONG pageNumber = dbb->getKnownPage(pag_ids, sequence) ;
1359+ if (!pageNumber )
13601360 {
13611361 DPM_scan_pages(tdbb);
1362- if (!(vector = dbb->dbb_gen_id_pages) ||
1363- (sequence >= vector->count()) || !((*vector)[sequence]))
1362+
1363+ pageNumber = dbb->getKnownPage(pag_ids, sequence);
1364+ if (!pageNumber)
13641365 {
13651366 generator_page* page = (generator_page*) DPM_allocate(tdbb, &window);
13661367 page->gpg_header.pag_type = pag_ids;
13671368 page->gpg_sequence = sequence;
13681369 CCH_must_write(tdbb, &window);
13691370 CCH_RELEASE(tdbb, &window);
1370- DPM_pages(tdbb, 0, pag_ids, (ULONG) sequence, window.win_page.getPageNum());
1371- vector = dbb->dbb_gen_id_pages =
1372- vcl::newVector(* dbb->dbb_permanent, dbb->dbb_gen_id_pages, sequence + 1 );
1373- (*vector)[sequence] = window.win_page.getPageNum( );
1371+
1372+ pageNumber = window.win_page.getPageNum();
1373+ dbb->setKnownPage(pag_ids, sequence, pageNumber );
1374+ DPM_pages(tdbb, 0, pag_ids, sequence, pageNumber );
13741375 }
13751376 }
13761377
1377- window.win_page = (*vector)[sequence] ;
1378+ window.win_page = pageNumber ;
13781379 window.win_flags = 0;
13791380
13801381 // As a special exception that allows physical backups for read-only replicas,
@@ -2041,40 +2042,49 @@ void DPM_scan_pages( thread_db* tdbb)
20412042
20422043 CCH_RELEASE(tdbb, &window);
20432044
2045+ HalfStaticArray<ULONG, 256> tipSeqList;
2046+ HalfStaticArray<ULONG, 4> genSeqList;
2047+
20442048 AutoCacheRequest request(tdbb, irq_r_pages, IRQ_REQUESTS);
20452049
20462050 FOR(REQUEST_HANDLE request) X IN RDB$PAGES
20472051 {
20482052 relation = MET_relation(tdbb, X.RDB$RELATION_ID);
20492053 relPages = relation->getBasePages();
20502054 sequence = X.RDB$PAGE_SEQUENCE;
2051- MemoryPool* pool = dbb->dbb_permanent;
2055+
20522056 switch (X.RDB$PAGE_TYPE)
20532057 {
20542058 case pag_root:
20552059 relPages->rel_index_root = X.RDB$PAGE_NUMBER;
2056- continue ;
2060+ break ;
20572061
20582062 case pag_pointer:
2059- address = & relPages->rel_pages;
2060- pool = relation->rel_pool ;
2063+ relPages->rel_pages = vcl::newVector(*relation->rel_pool, relPages->rel_pages, sequence + 1) ;
2064+ (*relPages->rel_pages)[sequence] = X.RDB$PAGE_NUMBER ;
20612065 break;
20622066
20632067 case pag_transactions:
2064- address = &dbb->dbb_t_pages;
2068+ tipSeqList.resize(sequence + 1);
2069+ tipSeqList[sequence] = X.RDB$PAGE_NUMBER;
20652070 break;
20662071
20672072 case pag_ids:
2068- address = &dbb->dbb_gen_id_pages;
2073+ genSeqList.resize(sequence + 1);
2074+ genSeqList[sequence] = X.RDB$PAGE_NUMBER;
20692075 break;
20702076
20712077 default:
20722078 CORRUPT(257); // msg 257 bad record in RDB$PAGES
20732079 }
2074- vector = *address = vcl::newVector(*pool, *address, sequence + 1);
2075- (*vector)[sequence] = X.RDB$PAGE_NUMBER;
20762080 }
20772081 END_FOR
2082+
2083+ if (const auto count = tipSeqList.getCount())
2084+ dbb->copyKnownPages(pag_transactions, count, tipSeqList.begin());
2085+
2086+ if (const auto count = genSeqList.getCount())
2087+ dbb->copyKnownPages(pag_ids, count, genSeqList.begin());
20782088}
20792089
20802090
0 commit comments