8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:40:38 +01:00

Fixed #7480: Firebird server stops accepting new connections after some time

This commit is contained in:
AlexPeshkoff 2023-08-10 14:20:42 +03:00
parent 5f097cd9fc
commit e48508f06d
3 changed files with 47 additions and 25 deletions

View File

@ -823,12 +823,17 @@ namespace Jrd {
void CryptoManager::blockingAstChangeCryptState()
{
AsyncContextHolder tdbb(&dbb, FB_FUNCTION);
if (stateLock->lck_physical != CRYPT_CHANGE && stateLock->lck_physical != CRYPT_INIT)
try
{
sync.ast(tdbb);
AsyncContextHolder tdbb(&dbb, FB_FUNCTION);
if (stateLock->lck_physical != CRYPT_CHANGE && stateLock->lck_physical != CRYPT_INIT)
{
sync.ast(tdbb);
}
}
catch (const Exception&)
{ }
}
void CryptoManager::doOnAst(thread_db* tdbb)

View File

@ -694,28 +694,33 @@ int TipCache::tpc_block_blocking_ast(void* arg)
{
StatusBlockData* data = static_cast<StatusBlockData*>(arg);
Database* dbb = data->existenceLock.lck_dbb;
AsyncContextHolder tdbb(dbb, FB_FUNCTION);
// Should we try to process AST?
if (!data->acceptAst)
return 0;
TipCache* cache = data->cache;
TraNumber oldest =
cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
// Is data block really old?
if (data->blockNumber >= oldest / cache->m_transactionsPerBlock)
return 0;
// Release shared memory
if (data->memory)
try
{
delete data->memory;
data->memory = NULL;
Database* dbb = data->existenceLock.lck_dbb;
AsyncContextHolder tdbb(dbb, FB_FUNCTION);
// Should we try to process AST?
if (!data->acceptAst)
return 0;
TipCache* cache = data->cache;
TraNumber oldest =
cache->m_tpcHeader->getHeader()->oldest_transaction.load(std::memory_order_relaxed);
// Is data block really old?
if (data->blockNumber >= oldest / cache->m_transactionsPerBlock)
return 0;
// Release shared memory
if (data->memory)
{
delete data->memory;
data->memory = NULL;
}
LCK_release(tdbb, &data->existenceLock);
}
LCK_release(tdbb, &data->existenceLock);
catch (const Exception&)
{ }
return 0;
}

View File

@ -1402,7 +1402,19 @@ void LockManager::blocking_action(thread_db* tdbb, SRQ_PTR blocking_owner_offset
{ // checkout scope
LockTableCheckout checkout(this, FB_FUNCTION);
EngineCheckout cout(tdbb, FB_FUNCTION, true);
(*routine)(arg);
try
{
(*routine)(arg);
}
catch (const Exception& ex)
{
iscLogException("Exception from AST routine - this should never happen", ex);
}
catch (...)
{
gds__log("Unknown C++ exception from AST routine - this should never happen");
}
}
owner = (own*) SRQ_ABS_PTR(blocking_owner_offset);