Skip to content

Commit 5a1ea99

Browse files
committed
Fix DLTT bugchecks after errors - thanks Pavel Zotov
1 parent 91d0dbc commit 5a1ea99

5 files changed

Lines changed: 69 additions & 22 deletions

File tree

src/dsql/StmtNodes.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2160,7 +2160,38 @@ void DeclareLocalTableNode::reset(thread_db* tdbb, Request* request) const
21602160
if (relation)
21612161
{
21622162
const auto permanent = relation->getPermanent();
2163-
permanent->delPages(tdbb, request->getLocalTableInstanceId(tdbb));
2163+
const auto tempInstanceId = request->getLocalTableInstanceId(tdbb);
2164+
const auto transaction = request->req_transaction;
2165+
2166+
try
2167+
{
2168+
permanent->delPages(tdbb, tempInstanceId);
2169+
2170+
if (transaction)
2171+
transaction->discardTempFrameActions(relation, tempInstanceId);
2172+
}
2173+
catch (const Exception&)
2174+
{
2175+
fb_assert(false);
2176+
2177+
if (transaction)
2178+
{
2179+
try
2180+
{
2181+
transaction->discardTempFrameActions(relation, tempInstanceId);
2182+
}
2183+
catch (const Exception&)
2184+
{
2185+
// Preserve the original frame teardown error.
2186+
fb_assert(false);
2187+
}
2188+
}
2189+
2190+
for (auto current = transaction; current; current = current->tra_outer)
2191+
current->tra_flags |= TRA_invalidated;
2192+
2193+
throw;
2194+
}
21642195
}
21652196
}
21662197

src/jrd/Savepoint.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ void VerbAction::mergeTo(thread_db* tdbb, jrd_tra* transaction, VerbAction* next
251251
}
252252
}
253253

254-
release(tdbb, transaction);
254+
discard(transaction);
255255
}
256256

257257
void VerbAction::undo(thread_db* tdbb, jrd_tra* transaction, bool preserveLocks, VerbAction* preserveAction)
@@ -366,13 +366,11 @@ void VerbAction::undo(thread_db* tdbb, jrd_tra* transaction, bool preserveLocks,
366366
delete rpb.rpb_record;
367367
}
368368

369-
release(tdbb, transaction);
369+
discard(transaction);
370370
}
371371

372-
void VerbAction::release(thread_db* tdbb, jrd_tra* transaction)
372+
void VerbAction::discard(jrd_tra* transaction)
373373
{
374-
AutoSetRestore<FB_UINT64> autoFrameId(&tdbb->tdbb_temp_frame_id, vct_temp_instance_id);
375-
376374
// Release resources used by this verb action
377375

378376
RecordBitmap::reset(vct_records);
@@ -439,23 +437,26 @@ void Savepoint::cleanupTempData()
439437
for (VerbAction* action = m_actions; action; action = action->vct_next)
440438
{
441439
if (action->vct_relation->getPermanent()->rel_flags & (REL_temp_tran | REL_temp_frame))
442-
{
443-
RecordBitmap::reset(action->vct_records);
440+
action->discard(m_transaction);
441+
}
442+
}
444443

445-
if (action->vct_undo)
446-
{
447-
if (action->vct_undo->getFirst())
448-
{
449-
do
450-
{
451-
action->vct_undo->current().release(m_transaction);
452-
} while (action->vct_undo->getNext());
453-
}
454444

455-
delete action->vct_undo;
456-
action->vct_undo = NULL;
457-
}
445+
void Savepoint::discardTempFrameActions(const jrd_rel* relation, FB_UINT64 tempInstanceId)
446+
{
447+
for (auto actionPtr = &m_actions; *actionPtr;)
448+
{
449+
const auto action = *actionPtr;
450+
451+
if (action->vct_relation == relation && action->vct_temp_instance_id == tempInstanceId)
452+
{
453+
action->discard(m_transaction);
454+
*actionPtr = action->vct_next;
455+
action->vct_next = m_freeActions;
456+
m_freeActions = action;
458457
}
458+
else
459+
actionPtr = &action->vct_next;
459460
}
460461
}
461462

src/jrd/Savepoint.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ namespace Jrd
9898
void garbageCollectIdxLite(thread_db* tdbb, jrd_tra* transaction, SINT64 recordNumber,
9999
VerbAction* nextAction, Record* goingRecord);
100100

101-
private:
102-
void release(thread_db* tdbb, jrd_tra* transaction);
101+
void discard(jrd_tra* transaction);
103102
};
104103

105104
// LTT undo item - stores original state of a LocalTemporaryTable for savepoint rollback
@@ -262,6 +261,7 @@ namespace Jrd
262261
LocalTemporaryTable* original = nullptr);
263262

264263
void cleanupTempData();
264+
void discardTempFrameActions(const jrd_rel* relation, FB_UINT64 tempInstanceId);
265265

266266
Savepoint* rollback(thread_db* tdbb, Savepoint* prior = NULL, bool preserveLocks = false);
267267
Savepoint* rollforward(thread_db* tdbb, Savepoint* prior = NULL);

src/jrd/tra.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4112,6 +4112,20 @@ void jrd_tra::rollbackToSavepoint(thread_db* tdbb, SavNumber number)
41124112
}
41134113

41144114

4115+
void jrd_tra::discardTempFrameActions(const jrd_rel* relation, FB_UINT64 tempInstanceId)
4116+
{
4117+
fb_assert(relation);
4118+
fb_assert(relation->getPermanent()->rel_flags & REL_temp_frame);
4119+
fb_assert(tempInstanceId);
4120+
4121+
for (auto transaction = this; transaction; transaction = transaction->tra_outer)
4122+
{
4123+
for (Savepoint::Iterator iter(transaction->tra_save_point); *iter; ++iter)
4124+
(*iter)->discardTempFrameActions(relation, tempInstanceId);
4125+
}
4126+
}
4127+
4128+
41154129
void jrd_tra::releaseSavepoint(thread_db* tdbb)
41164130
/**************************************
41174131
*

src/jrd/tra.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ class jrd_tra final : public pool_alloc<type_tra>
407407
Savepoint* startSavepoint(bool root = false);
408408
void rollbackSavepoint(thread_db* tdbb, bool preserveLocks = false);
409409
void rollbackToSavepoint(thread_db* tdbb, SavNumber number);
410+
void discardTempFrameActions(const jrd_rel* relation, FB_UINT64 tempInstanceId);
410411
void releaseSavepoint(thread_db* tdbb);
411412
DbCreatorsList* getDbCreatorsList();
412413
void checkBlob(thread_db* tdbb, const bid* blob_id, jrd_fld* fld, bool punt);

0 commit comments

Comments
 (0)