From a7e1fcec841223121c04883b9ce1e32b70574c62 Mon Sep 17 00:00:00 2001 From: "suyu.cmj" Date: Tue, 27 Jul 2021 16:23:05 +0000 Subject: [PATCH] Update minimum recovery point on file deletion during redo abort xlog record. If a file is deleted during redo abort xlog record, we must update minRecoveryPoint. Once a file is deleted, there's no going back; it would not be safe to stop recovery at a point earlier than that anymore. --- src/backend/access/transam/xact.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 4414459..78394d6 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5982,8 +5982,29 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid, false /* backward */ , false /* WAL */ ); } - /* Make sure files supposed to be dropped are dropped */ - DropRelationFiles(parsed->xnodes, parsed->nrels, true); + if (parsed->nrels > 0) + { + /* + * First update minimum recovery point to cover this WAL record. Once + * a relation is deleted, there's no going back. The buffer manager + * enforces the WAL-first rule for normal updates to relation files, + * so that the minimum recovery point is always updated before the + * corresponding change in the data file is flushed to disk. We have + * to do the same here. + * + * Doing this before deleting the files means that if a deletion fails + * for some reason, you cannot start up the system even after restart, + * until you fix the underlying situation so that the deletion will + * succeed. Alternatively, we could update the minimum recovery point + * after deletion, but that would leave a small window where the + * WAL-first rule would be violated. + */ + XLogFlush(lsn); + + /* Make sure files supposed to be dropped are dropped */ + DropRelationFiles(parsed->xnodes, parsed->nrels, true); + } + } void -- 1.8.3.1