0001-Update-minimum-recovery-point-on-file-deletion-durin.patch
application/octet-stream
Filename: 0001-Update-minimum-recovery-point-on-file-deletion-durin.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Update minimum recovery point on file deletion during redo abort xlog record.
| File | + | − |
|---|---|---|
| src/backend/access/transam/xact.c | 23 | 2 |
From a7e1fcec841223121c04883b9ce1e32b70574c62 Mon Sep 17 00:00:00 2001
From: "suyu.cmj" <mengjuan.cmj@alibaba-inc.com>
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