Skip to content

Commit 057fc3a

Browse files
committed
Fix CORE-5252
1 parent 9c86b06 commit 057fc3a

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

src/jrd/exe.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,14 @@ static void execute_looper(thread_db* tdbb,
10161016
if (!(request->req_flags & req_proc_fetch) && request->req_transaction)
10171017
{
10181018
if (transaction && !(transaction->tra_flags & TRA_system))
1019-
transaction->startSavepoint();
1019+
{
1020+
if (request->req_savepoints)
1021+
{
1022+
request->req_savepoints = request->req_savepoints->moveToStack(transaction->tra_save_point);
1023+
}
1024+
else
1025+
transaction->startSavepoint();
1026+
}
10201027
}
10211028

10221029
request->req_flags &= ~req_stall;
@@ -1033,8 +1040,12 @@ static void execute_looper(thread_db* tdbb,
10331040
transaction->tra_save_point->isSystem() &&
10341041
!transaction->tra_save_point->isChanging())
10351042
{
1043+
Savepoint* savepoint = transaction->tra_save_point;
10361044
// Forget about any undo for this verb
10371045
transaction->rollforwardSavepoint(tdbb);
1046+
// Preserve savepoint for reuse
1047+
fb_assert(savepoint == transaction->tra_save_free);
1048+
transaction->tra_save_free = savepoint->moveToStack(request->req_savepoints);
10381049
}
10391050
}
10401051
}

src/jrd/req.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ class jrd_req : public pool_alloc<type_req>
246246
ExtEngineManager::ResultSet* req_ext_resultset; // external result set
247247
USHORT req_label; // label for leave
248248
ULONG req_flags; // misc request flags
249+
Savepoint* req_savepoints; // Looper savepoint list
249250
Savepoint* req_proc_sav_point; // procedure savepoint list
250251
Firebird::TimeStamp req_timestamp; // Start time of request
251252

src/jrd/tra.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,13 @@ void TRA_attach_request(Jrd::jrd_tra* transaction, Jrd::jrd_req* request)
143143
void TRA_detach_request(Jrd::jrd_req* request)
144144
{
145145
if (!request->req_transaction)
146+
{
147+
fb_assert(!request->req_savepoints);
146148
return;
149+
}
150+
151+
// Release stored looper savepoints
152+
Savepoint::destroy(request->req_savepoints);
147153

148154
// Remove request from the doubly linked list
149155
if (request->req_tra_next)

0 commit comments

Comments
 (0)