| 742 | |
| 743 | |
| 744 | static 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. |
no test coverage detected