From f00f27e103dd3c3380a6a13d979fd8244e198c5f Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Wed, 22 Dec 2021 11:49:06 +0300 Subject: [PATCH 1/2] [PGPRO-6037] fix catchup timeline history checking --- .travis.yml | 6 ++++++ src/catchup.c | 19 ++++++++++++++----- src/restore.c | 4 ++++ src/stream.c | 2 ++ tests/catchup.py | 32 ++++++++++++++++++++++++++------ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 876289e82..22b20f70a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,11 +28,17 @@ notifications: env: - PG_VERSION=15 PG_BRANCH=master PTRACK_PATCH_PG_BRANCH=master - PG_VERSION=14 PG_BRANCH=REL_14_STABLE PTRACK_PATCH_PG_BRANCH=REL_14_STABLE + - PG_VERSION=14 PG_BRANCH=REL_14_STABLE PTRACK_PATCH_PG_BRANCH=REL_14_STABLE MODE=catchup - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE + - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE MODE=catchup - PG_VERSION=12 PG_BRANCH=REL_12_STABLE PTRACK_PATCH_PG_BRANCH=REL_12_STABLE + - PG_VERSION=12 PG_BRANCH=REL_12_STABLE PTRACK_PATCH_PG_BRANCH=REL_12_STABLE MODE=catchup - PG_VERSION=11 PG_BRANCH=REL_11_STABLE PTRACK_PATCH_PG_BRANCH=REL_11_STABLE + - PG_VERSION=11 PG_BRANCH=REL_11_STABLE PTRACK_PATCH_PG_BRANCH=REL_11_STABLE MODE=catchup - PG_VERSION=10 PG_BRANCH=REL_10_STABLE + - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=catchup - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE + - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=catchup - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE # - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=off MODE=archive # - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE MODE=backup diff --git a/src/catchup.c b/src/catchup.c index f9145a395..c8b6c3cac 100644 --- a/src/catchup.c +++ b/src/catchup.c @@ -203,6 +203,8 @@ catchup_preflight_checks(PGNodeInfo *source_node_info, PGconn *source_conn, /* fill dest_redo.lsn and dest_redo.tli */ get_redo(dest_pgdata, FIO_LOCAL_HOST, &dest_redo); + elog(VERBOSE, "source.tli = %X, dest_redo.lsn = %X/%X, dest_redo.tli = %X", + current.tli, (uint32) (dest_redo.lsn >> 32), (uint32) dest_redo.lsn, dest_redo.tli); if (current.tli != 1) { @@ -285,11 +287,12 @@ catchup_check_tablespaces_existance_in_tbsmapping(PGconn *conn) static parray* catchup_get_tli_history(ConnectionOptions *conn_opt, TimeLineID tli) { - PGresult *res; - PGconn *conn; - char *history; - char query[128]; - parray *result = NULL; + PGresult *res; + PGconn *conn; + char *history; + char query[128]; + parray *result = NULL; + TimeLineHistoryEntry *entry = NULL; snprintf(query, sizeof(query), "TIMELINE_HISTORY %u", tli); @@ -336,6 +339,12 @@ catchup_get_tli_history(ConnectionOptions *conn_opt, TimeLineID tli) pg_free(history); PQclear(res); + /* append last timeline entry (as read_timeline_history() do) */ + entry = pgut_new(TimeLineHistoryEntry); + entry->tli = tli; + entry->end = InvalidXLogRecPtr; + parray_insert(result, 0, entry); + return result; } diff --git a/src/restore.c b/src/restore.c index 47e3b0344..d8d808a4e 100644 --- a/src/restore.c +++ b/src/restore.c @@ -1821,11 +1821,15 @@ satisfy_timeline(const parray *timelines, TimeLineID tli, XLogRecPtr lsn) { int i; + elog(VERBOSE, "satisfy_timeline() checking: tli = %X, lsn = %X/%X", + tli, (uint32) (lsn >> 32), (uint32) lsn); for (i = 0; i < parray_num(timelines); i++) { TimeLineHistoryEntry *timeline; timeline = (TimeLineHistoryEntry *) parray_get(timelines, i); + elog(VERBOSE, "satisfy_timeline() check %i entry: timeline->tli = %X, timeline->end = %X/%X", + i, timeline->tli, (uint32) (timeline->end >> 32), (uint32) timeline->end); if (tli == timeline->tli && (XLogRecPtrIsInvalid(timeline->end) || lsn <= timeline->end)) diff --git a/src/stream.c b/src/stream.c index a53077391..1ee8dee37 100644 --- a/src/stream.c +++ b/src/stream.c @@ -615,6 +615,8 @@ parse_tli_history_buffer(char *history, TimeLineID tli) if (!result) result = parray_new(); parray_append(result, entry); + elog(VERBOSE, "parse_tli_history_buffer() found entry: tli = %X, end = %X/%X", + tli, switchpoint_hi, switchpoint_lo); /* we ignore the remainder of each line */ } diff --git a/tests/catchup.py b/tests/catchup.py index 79ebdec9f..8441deaaf 100644 --- a/tests/catchup.py +++ b/tests/catchup.py @@ -292,7 +292,7 @@ def test_tli_delta_catchup(self): src_pg.safe_psql("postgres", "CREATE TABLE ultimate_question AS SELECT 42 AS answer") src_query_result = src_pg.safe_psql("postgres", "SELECT * FROM ultimate_question") - # do catchup + # do catchup (src_tli = 2, dst_tli = 1) self.catchup_node( backup_mode = 'DELTA', source_pgdata = src_pg.data_dir, @@ -310,15 +310,25 @@ def test_tli_delta_catchup(self): dst_options = {} dst_options['port'] = str(dst_pg.port) self.set_auto_conf(dst_pg, dst_options) - dst_pg.slow_start() + self.set_replica(master = src_pg, replica = dst_pg) + dst_pg.slow_start(replica = True) # 2nd check: run verification query dst_query_result = dst_pg.safe_psql("postgres", "SELECT * FROM ultimate_question") self.assertEqual(src_query_result, dst_query_result, 'Different answer from copy') + dst_pg.stop() + + # do catchup (src_tli = 2, dst_tli = 2) + self.catchup_node( + backup_mode = 'DELTA', + source_pgdata = src_pg.data_dir, + destination_node = dst_pg, + options = ['-d', 'postgres', '-p', str(src_pg.port), '--stream'] + ) + # Cleanup src_pg.stop() - dst_pg.stop() self.del_test_dir(module_name, self.fname) def test_tli_ptrack_catchup(self): @@ -365,7 +375,7 @@ def test_tli_ptrack_catchup(self): src_pg.safe_psql("postgres", "CREATE TABLE ultimate_question AS SELECT 42 AS answer") src_query_result = src_pg.safe_psql("postgres", "SELECT * FROM ultimate_question") - # do catchup + # do catchup (src_tli = 2, dst_tli = 1) self.catchup_node( backup_mode = 'PTRACK', source_pgdata = src_pg.data_dir, @@ -383,15 +393,25 @@ def test_tli_ptrack_catchup(self): dst_options = {} dst_options['port'] = str(dst_pg.port) self.set_auto_conf(dst_pg, dst_options) - dst_pg.slow_start() + self.set_replica(master = src_pg, replica = dst_pg) + dst_pg.slow_start(replica = True) # 2nd check: run verification query dst_query_result = dst_pg.safe_psql("postgres", "SELECT * FROM ultimate_question") self.assertEqual(src_query_result, dst_query_result, 'Different answer from copy') + dst_pg.stop() + + # do catchup (src_tli = 2, dst_tli = 2) + self.catchup_node( + backup_mode = 'PTRACK', + source_pgdata = src_pg.data_dir, + destination_node = dst_pg, + options = ['-d', 'postgres', '-p', str(src_pg.port), '--stream'] + ) + # Cleanup src_pg.stop() - dst_pg.stop() self.del_test_dir(module_name, self.fname) ######################################### From bfcf8a914e9d7ff3a10fdff3bc948db1899d4906 Mon Sep 17 00:00:00 2001 From: "Mikhail A. Kulagin" Date: Fri, 24 Dec 2021 13:25:36 +0300 Subject: [PATCH 2/2] [PGPRO-6037] revert .travis.yml --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 22b20f70a..876289e82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,17 +28,11 @@ notifications: env: - PG_VERSION=15 PG_BRANCH=master PTRACK_PATCH_PG_BRANCH=master - PG_VERSION=14 PG_BRANCH=REL_14_STABLE PTRACK_PATCH_PG_BRANCH=REL_14_STABLE - - PG_VERSION=14 PG_BRANCH=REL_14_STABLE PTRACK_PATCH_PG_BRANCH=REL_14_STABLE MODE=catchup - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE - - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE MODE=catchup - PG_VERSION=12 PG_BRANCH=REL_12_STABLE PTRACK_PATCH_PG_BRANCH=REL_12_STABLE - - PG_VERSION=12 PG_BRANCH=REL_12_STABLE PTRACK_PATCH_PG_BRANCH=REL_12_STABLE MODE=catchup - PG_VERSION=11 PG_BRANCH=REL_11_STABLE PTRACK_PATCH_PG_BRANCH=REL_11_STABLE - - PG_VERSION=11 PG_BRANCH=REL_11_STABLE PTRACK_PATCH_PG_BRANCH=REL_11_STABLE MODE=catchup - PG_VERSION=10 PG_BRANCH=REL_10_STABLE - - PG_VERSION=10 PG_BRANCH=REL_10_STABLE MODE=catchup - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE - - PG_VERSION=9.6 PG_BRANCH=REL9_6_STABLE MODE=catchup - PG_VERSION=9.5 PG_BRANCH=REL9_5_STABLE # - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=off MODE=archive # - PG_VERSION=13 PG_BRANCH=REL_13_STABLE PTRACK_PATCH_PG_BRANCH=REL_13_STABLE MODE=backup 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