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:
parent
6e54466b5a
commit
ca0164dad9
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user