mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 09:23:03 +01:00
Backported fix for CORE-5264: To unlock a raw device DB is not working.
This commit is contained in:
parent
8a67ae05c3
commit
8709dab13b
@ -60,6 +60,11 @@ bool PIO_status(Jrd::thread_db*, struct Jrd::phys_io_blk*, Jrd::FbStatusVector*)
|
||||
#ifdef SUPPORT_RAW_DEVICES
|
||||
bool PIO_on_raw_device(const Firebird::PathName&);
|
||||
int PIO_unlink(const Firebird::PathName&);
|
||||
#else
|
||||
inline bool PIO_on_raw_device(const Firebird::PathName&)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
bool PIO_write(Jrd::thread_db*, Jrd::jrd_file*, Jrd::BufferDesc*, Ods::pag*, Jrd::FbStatusVector*);
|
||||
|
||||
|
@ -1501,41 +1501,12 @@ SLONG PAG_last_page(thread_db* tdbb)
|
||||
* shadow stuff to dump a database.
|
||||
*
|
||||
**************************************/
|
||||
|
||||
SET_TDBB(tdbb);
|
||||
Database* dbb = tdbb->getDatabase();
|
||||
CHECK_DBB(dbb);
|
||||
|
||||
PageManager& pageMgr = dbb->dbb_page_manager;
|
||||
PageSpace* pageSpace = pageMgr.findPageSpace(DB_PAGE_SPACE);
|
||||
fb_assert(pageSpace);
|
||||
|
||||
const ULONG pages_per_pip = pageMgr.pagesPerPIP;
|
||||
WIN window(DB_PAGE_SPACE, -1);
|
||||
|
||||
// Find the last page allocated
|
||||
|
||||
ULONG relative_bit = 0;
|
||||
USHORT sequence;
|
||||
for (sequence = 0; true; ++sequence)
|
||||
{
|
||||
window.win_page = (!sequence) ? pageSpace->pipFirst : sequence * pages_per_pip - 1;
|
||||
const page_inv_page* page = (page_inv_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_pages);
|
||||
const UCHAR* bits = page->pip_bits + (pages_per_pip >> 3) - 1;
|
||||
while (*bits == (UCHAR) - 1)
|
||||
--bits;
|
||||
SSHORT bit;
|
||||
for (bit = 7; bit >= 0; --bit)
|
||||
{
|
||||
if (!(*bits & (1 << bit)))
|
||||
break;
|
||||
}
|
||||
relative_bit = (bits - page->pip_bits) * 8 + bit;
|
||||
CCH_RELEASE(tdbb, &window);
|
||||
if (relative_bit != pages_per_pip - 1)
|
||||
break;
|
||||
}
|
||||
|
||||
return sequence * pages_per_pip + relative_bit;
|
||||
return PageSpace::lastUsedPage(dbb);
|
||||
}
|
||||
|
||||
|
||||
@ -2064,14 +2035,66 @@ ULONG PageSpace::maxAlloc()
|
||||
**************************************/
|
||||
const USHORT pageSize = dbb->dbb_page_size;
|
||||
const jrd_file* f = file;
|
||||
ULONG nPages = PIO_get_number_of_pages(f, pageSize);
|
||||
ULONG nPages = 0;
|
||||
|
||||
if (maxPageNumber == 0 && !PIO_on_raw_device(f->fil_string))
|
||||
{
|
||||
nPages = PIO_get_number_of_pages(f, pageSize);
|
||||
|
||||
while (f->fil_next && nPages == f->fil_max_page - f->fil_min_page + 1 + f->fil_fudge)
|
||||
{
|
||||
f = f->fil_next;
|
||||
if (PIO_on_raw_device(f->fil_string))
|
||||
{
|
||||
nPages = 0;
|
||||
break;
|
||||
}
|
||||
nPages = PIO_get_number_of_pages(f, pageSize);
|
||||
}
|
||||
|
||||
if (nPages)
|
||||
nPages += f->fil_min_page - f->fil_fudge;
|
||||
}
|
||||
|
||||
if (!nPages)
|
||||
{
|
||||
thread_db* tdbb = JRD_get_thread_data();
|
||||
const ULONG pagesPerPip = dbb->dbb_page_manager.pagesPerPIP;
|
||||
WIN window(pageSpaceID, -1);
|
||||
|
||||
// Find the last page allocated
|
||||
|
||||
for (USHORT sequence = maxPageNumber / pagesPerPip; true; ++sequence)
|
||||
{
|
||||
window.win_page = (!sequence) ? pipFirst : sequence * pagesPerPip - 1;
|
||||
ULONG pipUsed = 0;
|
||||
const page_inv_page* page = NULL;
|
||||
|
||||
for (FB_SIZE_T n = 0; n < tdbb->tdbb_bdbs.getCount(); ++n)
|
||||
{
|
||||
BufferDesc *bdb = tdbb->tdbb_bdbs[n];
|
||||
if (bdb && bdb->isLocked() && bdb->bdb_page == window.win_page && bdb->bdb_buffer)
|
||||
{
|
||||
page = (page_inv_page*)(bdb->bdb_buffer);
|
||||
pipUsed = page->pip_used;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!page)
|
||||
{
|
||||
page = (page_inv_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_pages);
|
||||
pipUsed = page->pip_used;
|
||||
CCH_RELEASE(tdbb, &window);
|
||||
}
|
||||
|
||||
if (pipUsed != pagesPerPip)
|
||||
{
|
||||
nPages = sequence * pagesPerPip + pipUsed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxPageNumber < nPages)
|
||||
maxPageNumber = nPages;
|
||||
|
Loading…
Reference in New Issue
Block a user