diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 0f607ba..51d5b71 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -1093,6 +1093,20 @@ ReorderBufferCleanupTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) ReorderBufferCleanupTXN(rb, subtxn); } + /* + * If this transaction encountered crash during transaction, + * txn->final_lsn remains initial value. + * To properly remove entries which were spilled to disk, we need valid + * final_lsn. + * So we set final_lsn to the lsn of the last ReorderBufferChange. + */ + if (txn->final_lsn == 0) + { + ReorderBufferChange *last_change = + dlist_tail_element(ReorderBufferChange, node, &txn->changes); + txn->final_lsn = last_change->lsn; + } + /* cleanup changes in the toplevel txn */ dlist_foreach_modify(iter, &txn->changes) {