8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 09:20:39 +01:00

Better protection from primary crashes, thanks to Andrey Kravchenko

This commit is contained in:
Dmitry Yemanov 2020-07-25 12:03:34 +03:00
parent 6e54466b5a
commit ca0164dad9
2 changed files with 20 additions and 10 deletions

View File

@ -206,21 +206,13 @@ Applier* Applier::create(thread_db* tdbb)
void Applier::shutdown(thread_db* tdbb)
{
TransactionMap::Accessor txnAccessor(&m_txnMap);
if (txnAccessor.getFirst())
{
do {
const auto transaction = txnAccessor.current()->second;
TRA_rollback(tdbb, transaction, false, true);
} while (txnAccessor.getNext());
}
cleanupTransactions(tdbb);
CMP_release(tdbb, m_request);
m_request = NULL;
m_record = NULL;
m_bitmap->clear();
m_txnMap.clear();
}
void Applier::process(thread_db* tdbb, ULONG length, const UCHAR* data)
@ -265,7 +257,10 @@ void Applier::process(thread_db* tdbb, ULONG length, const UCHAR* data)
break;
case opCleanupTransaction:
rollbackTransaction(tdbb, traNum, true);
if (traNum)
rollbackTransaction(tdbb, traNum, true);
else
cleanupTransactions(tdbb);
break;
case opStartSavepoint:
@ -413,6 +408,20 @@ void Applier::rollbackTransaction(thread_db* tdbb, TraNumber traNum, bool cleanu
m_txnMap.remove(traNum);
}
void Applier::cleanupTransactions(thread_db* tdbb)
{
TransactionMap::Accessor txnAccessor(&m_txnMap);
if (txnAccessor.getFirst())
{
do {
const auto transaction = txnAccessor.current()->second;
TRA_rollback(tdbb, transaction, false, true);
} while (txnAccessor.getNext());
}
m_txnMap.clear();
}
void Applier::startSavepoint(thread_db* tdbb, TraNumber traNum)
{
jrd_tra* transaction = NULL;

View File

@ -148,6 +148,7 @@ namespace Jrd
void prepareTransaction(thread_db* tdbb, TraNumber traNum);
void commitTransaction(thread_db* tdbb, TraNumber traNum);
void rollbackTransaction(thread_db* tdbb, TraNumber traNum, bool cleanup);
void cleanupTransactions(thread_db* tdbb);
void startSavepoint(thread_db* tdbb, TraNumber traNum);
void cleanupSavepoint(thread_db* tdbb, TraNumber traNum, bool undo);