Skip to content

Commit 4056a5e

Browse files
committed
Fixed #7905: Segfault during TPC initialization
(cherry picked from commit 1033733)
1 parent aa786f3 commit 4056a5e

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

src/jrd/tpc.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,23 @@ void TipCache::StatusBlockData::clear(thread_db* tdbb)
432432
// wait for all initializing processes (PR)
433433
acceptAst = false;
434434

435-
TraNumber oldest =
436-
cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
435+
TraNumber oldest;
436+
if (cache->m_tpcHeader)
437+
oldest = cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
438+
else
439+
{
440+
Database* dbb = tdbb->getDatabase();
441+
if (dbb->dbb_flags & DBB_shared)
442+
oldest = dbb->dbb_oldest_transaction;
443+
else
444+
{
445+
WIN window(HEADER_PAGE_NUMBER);
446+
const Ods::header_page* header_page = (Ods::header_page*) CCH_FETCH(tdbb, &window, LCK_read, pag_header);
447+
oldest = Ods::getOIT(header_page);
448+
CCH_RELEASE(tdbb, &window);
449+
}
450+
}
451+
437452
if (blockNumber < oldest / cache->m_transactionsPerBlock && // old block => send AST
438453
!LCK_convert(tdbb, &existenceLock, LCK_SW, LCK_WAIT))
439454
{

0 commit comments

Comments
 (0)