From a0dc673439b8ce3787051c3ad6ca55f346cf608c Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 12 Feb 2019 13:04:08 +0900 Subject: [PATCH] "node rejoin": use minRecoveryPointTLI for comparing timelines --- controldata.c | 22 ++++++++++++++++++++++ controldata.h | 2 ++ repmgr-action-node.c | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/controldata.c b/controldata.c index 73e5c140..37b5fde4 100644 --- a/controldata.c +++ b/controldata.c @@ -187,6 +187,22 @@ get_timeline(const char *data_directory) } +TimeLineID +get_min_recovery_end_timeline(const char *data_directory) +{ + ControlFileInfo *control_file_info = NULL; + TimeLineID timeline = -1; + + control_file_info = get_controlfile(data_directory); + + timeline = (int) control_file_info->minRecoveryPointTLI; + + pfree(control_file_info); + + return timeline; +} + + XLogRecPtr get_min_recovery_location(const char *data_directory) { @@ -226,6 +242,8 @@ get_controlfile(const char *DataDir) control_file_info->checkPoint = InvalidXLogRecPtr; control_file_info->data_checksum_version = -1; control_file_info->timeline = -1; + control_file_info->minRecoveryPointTLI = -1; + control_file_info->minRecoveryPoint = InvalidXLogRecPtr; /* * Read PG_VERSION, as we'll need to determine which struct to read @@ -298,6 +316,7 @@ get_controlfile(const char *DataDir) control_file_info->checkPoint = ptr->checkPoint; control_file_info->data_checksum_version = ptr->data_checksum_version; control_file_info->timeline = ptr->checkPointCopy.ThisTimeLineID; + control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI; control_file_info->minRecoveryPoint = ptr->minRecoveryPoint; } else if (version_num >= 90500) @@ -308,6 +327,7 @@ get_controlfile(const char *DataDir) control_file_info->checkPoint = ptr->checkPoint; control_file_info->data_checksum_version = ptr->data_checksum_version; control_file_info->timeline = ptr->checkPointCopy.ThisTimeLineID; + control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI; control_file_info->minRecoveryPoint = ptr->minRecoveryPoint; } else if (version_num >= 90400) @@ -318,6 +338,7 @@ get_controlfile(const char *DataDir) control_file_info->checkPoint = ptr->checkPoint; control_file_info->data_checksum_version = ptr->data_checksum_version; control_file_info->timeline = ptr->checkPointCopy.ThisTimeLineID; + control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI; control_file_info->minRecoveryPoint = ptr->minRecoveryPoint; } else if (version_num >= 90300) @@ -328,6 +349,7 @@ get_controlfile(const char *DataDir) control_file_info->checkPoint = ptr->checkPoint; control_file_info->data_checksum_version = ptr->data_checksum_version; control_file_info->timeline = ptr->checkPointCopy.ThisTimeLineID; + control_file_info->minRecoveryPointTLI = ptr->minRecoveryPointTLI; control_file_info->minRecoveryPoint = ptr->minRecoveryPoint; } diff --git a/controldata.h b/controldata.h index e5db09b2..73aeae67 100644 --- a/controldata.h +++ b/controldata.h @@ -25,6 +25,7 @@ typedef struct XLogRecPtr checkPoint; uint32 data_checksum_version; TimeLineID timeline; + TimeLineID minRecoveryPointTLI; XLogRecPtr minRecoveryPoint; } ControlFileInfo; @@ -339,6 +340,7 @@ extern int get_data_checksum_version(const char *data_directory); extern uint64 get_system_identifier(const char *data_directory); extern XLogRecPtr get_latest_checkpoint_location(const char *data_directory); extern TimeLineID get_timeline(const char *data_directory); +extern TimeLineID get_min_recovery_end_timeline(const char *data_directory); extern XLogRecPtr get_min_recovery_location(const char *data_directory); #endif /* _CONTROLDATA_H_ */ diff --git a/repmgr-action-node.c b/repmgr-action-node.c index 9d4f21bc..a6347c7f 100644 --- a/repmgr-action-node.c +++ b/repmgr-action-node.c @@ -2274,7 +2274,7 @@ do_node_rejoin(void) { bool can_follow; - can_follow = check_node_can_attach(get_timeline(config_file_options.data_directory), + can_follow = check_node_can_attach(get_min_recovery_end_timeline(config_file_options.data_directory), get_min_recovery_location(config_file_options.data_directory), primary_conn, &primary_node_record,