Skip to content

Commit

Permalink
Fixed #7480: Firebird server stops accepting new connections after so…
Browse files Browse the repository at this point in the history
…me time
  • Loading branch information
AlexPeshkoff committed Aug 10, 2023
1 parent 5f097cd commit e48508f
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 22 deletions.
13 changes: 9 additions & 4 deletions src/jrd/CryptoManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
39 changes: 22 additions & 17 deletions src/jrd/tpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
try
{
Database* dbb = data->existenceLock.lck_dbb;
AsyncContextHolder tdbb(dbb, FB_FUNCTION);

// Should we try to process AST?
if (!data->acceptAst)
return 0;
// 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);
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;
// 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;
// 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;
}
Expand Down
14 changes: 13 additions & 1 deletion src/lock/lock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit e48508f

Please sign in to comment.