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

Function ensureDiskSpace

src/jrd/pag.cpp:744–837  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

742
743
744static ULONG ensureDiskSpace(thread_db* tdbb, WIN* pip_window, const PageNumber pageNum, ULONG pipUsed)
745{
746 Database* dbb = tdbb->getDatabase();
747 PageManager& pageMgr = dbb->dbb_page_manager;
748 PageSpace* pageSpace = pageMgr.findPageSpace(pageNum.getPageSpaceID());
749
750 ULONG newUsed = pipUsed;
751 const ULONG sequence = pageNum.getPageNum() / pageMgr.pagesPerPIP;
752 const ULONG relative_bit = pageNum.getPageNum() - sequence * pageMgr.pagesPerPIP;
753
754 BackupManager::StateReadGuard stateGuard(tdbb);
755 const bool nbak_stalled = dbb->dbb_backup_manager->getState() == Ods::hdr_nbak_stalled;
756
757 USHORT next_init_pages = 1;
758 // ensure there are space on disk for faked page
759 if (relative_bit + 1 > pipUsed)
760 {
761 fb_assert(relative_bit >= pipUsed);
762
763 USHORT init_pages = 0;
764 if (!nbak_stalled)
765 {
766 init_pages = 1;
767 if (!(dbb->dbb_flags & DBB_no_reserve))
768 {
769 const int minExtendPages = MIN_EXTEND_BYTES / dbb->dbb_page_size;
770
771 init_pages = sequence ? 64 : MIN(pipUsed / 16, 64);
772
773 // don't touch pages belongs to the next PIP
774 init_pages = MIN(init_pages, pageMgr.pagesPerPIP - pipUsed);
775
776 if (init_pages < minExtendPages)
777 init_pages = 1;
778 }
779
780 if (init_pages < relative_bit + 1 - pipUsed)
781 init_pages = relative_bit + 1 - pipUsed;
782
783 //init_pages = FB_ALIGN(init_pages, PAGES_IN_EXTENT);
784
785 next_init_pages = init_pages;
786
787 FbLocalStatus status;
788 const ULONG start = sequence * pageMgr.pagesPerPIP + pipUsed;
789
790 init_pages = PIO_init_data(tdbb, pageSpace->file, &status, start, init_pages);
791 }
792
793 if (init_pages)
794 {
795 newUsed += init_pages;
796 }
797 else
798 {
799 // PIO_init_data returns zero - perhaps it is not supported,
800 // no space left on disk or IO error occurred. Try to write
801 // one page and handle IO errors if any.

Callers 1

PAG_allocate_pagesFunction · 0.85

Calls 11

CCH_fakeFunction · 0.85
CCH_must_writeFunction · 0.85
CCH_RELEASEFunction · 0.85
CCH_forget_pageFunction · 0.85
getDatabaseMethod · 0.80
findPageSpaceMethod · 0.80
getPageSpaceIDMethod · 0.80
getPageNumMethod · 0.80
PIO_init_dataFunction · 0.50
getStateMethod · 0.45
extendMethod · 0.45

Tested by

no test coverage detected