Skip to content

Commit a28d731

Browse files
committed
Mark commit and abort WAL records with XLR_SPECIAL_REL_UPDATE.
If a commit or abort record includes "dropped relfilenodes", then replaying the record will remove data files. That is surely a "special rel update", but the records were not marked as such. Fix that, teach pg_rewind to expect and ignore them, and add a test case to cover it. It's always been like this, but no backporting for fear of breaking existing applications. If an application parsed the WAL but was not handling commit/abort records, it would stop working. That might be a good thing if it really needed to handle the dropped rels, but it will be caught when the application is updated to work with PostgreSQL v14 anyway. Discussion: https://www.postgresql.org/message-id/07b33e2c-46a6-86a1-5f9e-a7da73fddb95%40iki.fi Reviewed-by: Amit Kapila, Michael Paquier
1 parent 3941eb6 commit a28d731

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

src/backend/access/transam/xact.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5565,6 +5565,7 @@ XactLogCommitRecord(TimestampTz commit_time,
55655565
{
55665566
xl_xinfo.xinfo |= XACT_XINFO_HAS_RELFILENODES;
55675567
xl_relfilenodes.nrels = nrels;
5568+
info |= XLR_SPECIAL_REL_UPDATE;
55685569
}
55695570

55705571
if (nmsgs > 0)
@@ -5697,6 +5698,7 @@ XactLogAbortRecord(TimestampTz abort_time,
56975698
{
56985699
xl_xinfo.xinfo |= XACT_XINFO_HAS_RELFILENODES;
56995700
xl_relfilenodes.nrels = nrels;
5701+
info |= XLR_SPECIAL_REL_UPDATE;
57005702
}
57015703

57025704
if (TransactionIdIsValid(twophase_xid))

src/bin/pg_rewind/parsexlog.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <unistd.h>
1515

1616
#include "access/rmgr.h"
17+
#include "access/xact.h"
1718
#include "access/xlog_internal.h"
1819
#include "access/xlogreader.h"
1920
#include "catalog/pg_control.h"
@@ -397,6 +398,18 @@ extractPageInfo(XLogReaderState *record)
397398
* source system.
398399
*/
399400
}
401+
else if (rmid == RM_XACT_ID &&
402+
((rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT ||
403+
(rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT_PREPARED ||
404+
(rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT ||
405+
(rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT_PREPARED))
406+
{
407+
/*
408+
* These records can include "dropped rels". We can safely ignore
409+
* them, we will see that they are missing and copy them from the
410+
* source.
411+
*/
412+
}
400413
else if (info & XLR_SPECIAL_REL_UPDATE)
401414
{
402415
/*

src/bin/pg_rewind/t/001_basic.pl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use strict;
22
use warnings;
33
use TestLib;
4-
use Test::More tests => 20;
4+
use Test::More tests => 23;
55

66
use FindBin;
77
use lib $FindBin::RealBin;
@@ -29,6 +29,10 @@ sub run_test
2929
primary_psql("CREATE TABLE tail_tbl (id integer, d text)");
3030
primary_psql("INSERT INTO tail_tbl VALUES (0, 'in primary')");
3131

32+
# This test table is dropped in the old primary after promotion.
33+
primary_psql("CREATE TABLE drop_tbl (d text)");
34+
primary_psql("INSERT INTO drop_tbl VALUES ('in primary')");
35+
3236
primary_psql("CHECKPOINT");
3337

3438
RewindTest::create_standby($test_mode);
@@ -66,6 +70,9 @@ sub run_test
6670
primary_psql("DELETE FROM tail_tbl WHERE id > 10");
6771
primary_psql("VACUUM tail_tbl");
6872

73+
# Drop drop_tbl. pg_rewind should copy it back.
74+
primary_psql("DROP TABLE drop_tbl");
75+
6976
# Before running pg_rewind, do a couple of extra tests with several
7077
# option combinations. As the code paths taken by those tests
7178
# do not change for the "local" and "remote" modes, just run them
@@ -154,6 +161,12 @@ sub run_test
154161
),
155162
'tail-copy');
156163

164+
check_query(
165+
'SELECT * FROM drop_tbl',
166+
qq(in primary
167+
),
168+
'drop');
169+
157170
# Permissions on PGDATA should be default
158171
SKIP:
159172
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy