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:
parent
5f097cd9fc
commit
e48508f06d
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user