Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdf9f682

Browse files
committed
Fix failure to delete spill files of aborted transactions
Logical decoding's reorderbuffer.c may spill transaction files to diskwhen transactions are large. These are supposed to be removed when theybecome "too old" by xid; but file removal requires the boundary LSNs ofthe transaction to be known. The final_lsn is only set when we see thecommit or abort record for the transaction, but nothing sets the valuefor transactions that crash, so the removal code misbehaves -- inassertion-enabled builds, it crashes by a failed assertion.To fix, modify the final_lsn of transactions that don't have a valueset, to the LSN of the very latest change in the transaction. Thiscauses the spilled files to be removed appropriately.Author: Atsushi TorikoshiReviewed-by: Kyotaro HORIGUCHI, Craig Ringer, Masahiko SawadaDiscussion:https://postgr.es/m/54e4e488-186b-a056-6628-50628e4e4ebc@lab.ntt.co.jp
1 parent054e8c6 commitdf9f682

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

‎src/backend/replication/logical/reorderbuffer.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,8 +1670,8 @@ ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid)
16701670
* Iterate through all (potential) toplevel TXNs and abort all that are
16711671
* older than what possibly can be running. Once we've found the first
16721672
* that is alive we stop, there might be some that acquired an xid earlier
1673-
* but started writing later, but it's unlikely and they willcleaned up
1674-
* in a later call toReorderBufferAbortOld().
1673+
* but started writing later, but it's unlikely and they willbe cleaned
1674+
*upin a later call tothis function.
16751675
*/
16761676
dlist_foreach_modify(it,&rb->toplevel_by_lsn)
16771677
{
@@ -1681,6 +1681,21 @@ ReorderBufferAbortOld(ReorderBuffer *rb, TransactionId oldestRunningXid)
16811681

16821682
if (TransactionIdPrecedes(txn->xid,oldestRunningXid))
16831683
{
1684+
/*
1685+
* We set final_lsn on a transaction when we decode its commit or
1686+
* abort record, but we never see those records for crashed
1687+
* transactions. To ensure cleanup of these transactions, set
1688+
* final_lsn to that of their last change; this causes
1689+
* ReorderBufferRestoreCleanup to do the right thing.
1690+
*/
1691+
if (txn->serialized&&txn->final_lsn==0)
1692+
{
1693+
ReorderBufferChange*last=
1694+
dlist_tail_element(ReorderBufferChange,node,&txn->changes);
1695+
1696+
txn->final_lsn=last->lsn;
1697+
}
1698+
16841699
elog(DEBUG2,"aborting old transaction %u",txn->xid);
16851700

16861701
/* remove potential on-disk data, and deallocate this tx */

‎src/include/replication/reorderbuffer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ typedef struct ReorderBufferTXN
168168
* * plain abort record
169169
* * prepared transaction abort
170170
* * error during decoding
171+
* * for a crashed transaction, the LSN of the last change, regardless of
172+
* what it was.
171173
* ----
172174
*/
173175
XLogRecPtrfinal_lsn;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp