diff --git a/src/bin/gs_guc/cluster_guc.conf b/src/bin/gs_guc/cluster_guc.conf index cd2a9d9ce..e40c5b3c4 100644 --- a/src/bin/gs_guc/cluster_guc.conf +++ b/src/bin/gs_guc/cluster_guc.conf @@ -548,7 +548,7 @@ parallel_setup_cost|real|0,1.79769e+308|NULL|NULL| force_parallel_mode|enum|off,on,regress|NULL|NULL| parallel_leader_participation|bool|0,0|NULL|NULL| catchup2normal_wait_time|int|-1,10000|ms|The maximal allowed duration for waiting from catchup to normal state.| -config_sync_interval|int|0,2147483647|ms|The value is the synchronization interval of the configuration file in milliseconds.| +sync_config_strategy|enum|all_node,only_sync_node,none_node|NULL|NULL| [gtm] nodename|string|0,0|NULL|Name of this GTM/GTM-Standby.| port|int|1,65535|NULL|Listen Port of GTM or GTM standby server.| diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp index 331e6f032..3564e475c 100644 --- a/src/common/backend/utils/misc/guc.cpp +++ b/src/common/backend/utils/misc/guc.cpp @@ -962,6 +962,13 @@ static const struct config_enum_entry unique_sql_track_option[] = { extern struct config_enum_entry wal_level_options[]; extern struct config_enum_entry sync_method_options[]; +static const struct config_enum_entry sync_config_strategy_options[] = { + {"all_node", ALL_NODE, true}, + {"only_sync_node", ONLY_SYNC_NODE, true}, + {"none_node", NONE_NODE, true}, + {NULL, 0, false} +}; + /* * GUC option variables that are exported from this module */ @@ -4696,22 +4703,6 @@ void set_qunit_case_number_hook(int newval, void* extra) static void init_configure_names_int() { struct config_int local_configure_names_int[] = { - { - { - "config_sync_interval", - PGC_POSTMASTER, - WAL_SETTINGS, - gettext_noop("The synchronization time interval for the config file."), - NULL - }, - &g_instance.attr.attr_common.config_sync_interval, - 3600000, - 0, - INT_MAX, - NULL, - NULL, - NULL - }, { { "max_active_global_temporary_table", @@ -11618,6 +11609,21 @@ static void init_configure_names_string() static void init_configure_names_enum() { struct config_enum local_configure_names_enum[] = { + { + { + "sync_config_strategy", + PGC_POSTMASTER, + WAL_SETTINGS, + gettext_noop("Synchronization strategy for configuration files between host and standby."), + NULL + }, + &g_instance.attr.attr_common.sync_config_strategy, + ALL_NODE, + sync_config_strategy_options, + NULL, + NULL, + NULL + }, { { "backslash_quote", diff --git a/src/common/backend/utils/misc/postgresql.conf.sample b/src/common/backend/utils/misc/postgresql.conf.sample index 7530e33b1..13de0cd65 100755 --- a/src/common/backend/utils/misc/postgresql.conf.sample +++ b/src/common/backend/utils/misc/postgresql.conf.sample @@ -250,6 +250,12 @@ incremental_checkpoint_timeout = 60s # range 1s-1h # The value is best configured less than half of # the wal_receiver_timeout and wal_sender_timeout. +# - Synchronous configuration file - +#sync_config_strategy = all_node # Configuration file synchronization strategy. + # ALL_NODE : The standby nodes are allowed to send synchronous requests, and the host are allowed to actively send configuration files to all standby nodes. + # ONLY_SYNC_NODE : The standby nodes are allowed to send synchronization requests, and the host only actively sends configuration files to the standby. + # NONE_NODE : No standby requests are allowed, and the host is not allowed to actively send configuration files to the standby. + # - Sending Server(s) - # Set these on the master and on any standby that will send replication data. diff --git a/src/gausskernel/process/threadpool/knl_thread.cpp b/src/gausskernel/process/threadpool/knl_thread.cpp index 5cebcd016..cb0c463ea 100755 --- a/src/gausskernel/process/threadpool/knl_thread.cpp +++ b/src/gausskernel/process/threadpool/knl_thread.cpp @@ -1112,7 +1112,7 @@ static void knl_t_walreceiver_init(knl_t_walreceiver_context* walreceiver_cxt) rc = memset_s(walreceiver_cxt->gucconf_lock_file, MAXPGPATH, 0, MAXPGPATH); securec_check(rc, "\0", "\0"); walreceiver_cxt->reserve_item = {0}; - walreceiver_cxt->check_file_timeout = g_instance.attr.attr_common.config_sync_interval; + walreceiver_cxt->check_file_timeout = 60 * 60 * 1000; walreceiver_cxt->walRcvCtlBlock = NULL; walreceiver_cxt->reply_message = (StandbyReplyMessage*)palloc0(sizeof(StandbyReplyMessage)); walreceiver_cxt->feedback_message = (StandbyHSFeedbackMessage*)palloc0(sizeof(StandbyHSFeedbackMessage)); diff --git a/src/gausskernel/storage/replication/walreceiver.cpp b/src/gausskernel/storage/replication/walreceiver.cpp index 30108eba2..d2614eea9 100755 --- a/src/gausskernel/storage/replication/walreceiver.cpp +++ b/src/gausskernel/storage/replication/walreceiver.cpp @@ -114,7 +114,7 @@ const char* g_reserve_param[RESERVE_SIZE] = {"application_name", "synchronous_standby_names", "local_bind_address", "archive_dest", - NULL, + "sync_config_strategy", NULL, NULL, NULL, @@ -494,7 +494,8 @@ void WalReceiverMain(void) * Note: If switchover in one hour, and there is no parameter is reloaded, * the parameters set by client will be disabled. So we should do this. */ - firstSynchStandbyFile(); + if (g_instance.attr.attr_common.sync_config_strategy != NONE_NODE) + firstSynchStandbyFile(); set_disable_conn_mode(); knl_g_set_is_local_redo_finish(false); @@ -581,7 +582,8 @@ void WalReceiverMain(void) XLogWalRcvSendReply(requestReply, requestReply); XLogWalRcvSendHSFeedback(); } - ConfigFileTimer(); + if (g_instance.attr.attr_common.sync_config_strategy != NONE_NODE) + ConfigFileTimer(); } } @@ -2551,8 +2553,6 @@ static bool ProcessConfigFileMessage(char* buf, Size len) */ static void firstSynchStandbyFile(void) { - if (g_instance.attr.attr_common.config_sync_interval <= 0) - return; char bufTime[sizeof(ConfigModifyTimeMessage) + 1]; errno_t errorno = EOK; diff --git a/src/gausskernel/storage/replication/walsender.cpp b/src/gausskernel/storage/replication/walsender.cpp index a171758e0..671e7a8d0 100755 --- a/src/gausskernel/storage/replication/walsender.cpp +++ b/src/gausskernel/storage/replication/walsender.cpp @@ -2906,7 +2906,10 @@ static int WalSndLoop(WalSndSendDataCallback send_data) } } - if (sync_config_needed && g_instance.attr.attr_common.config_sync_interval > 0) { + if (sync_config_needed && + (g_instance.attr.attr_common.sync_config_strategy == ALL_NODE || + (g_instance.attr.attr_common.sync_config_strategy == ONLY_SYNC_NODE && + t_thrd.walsender_cxt.MyWalSnd->sync_standby_priority > 0))) { if (t_thrd.walsender_cxt.walsender_shutdown_requested) { if (!AM_WAL_DB_SENDER && !SendConfigFile(t_thrd.walsender_cxt.gucconf_file)) ereport(LOG, (errmsg("failed to send config to the peer when walsender shutdown."))); diff --git a/src/include/knl/knl_guc/knl_instance_attr_common.h b/src/include/knl/knl_guc/knl_instance_attr_common.h index b1d031116..2357850af 100755 --- a/src/include/knl/knl_guc/knl_instance_attr_common.h +++ b/src/include/knl/knl_guc/knl_instance_attr_common.h @@ -76,7 +76,7 @@ typedef struct knl_instance_attr_common { bool enable_alarm; char* Alarm_component; char* MOTConfigFileName; - int config_sync_interval; + int sync_config_strategy; } knl_instance_attr_common; #endif /* SRC_INCLUDE_KNL_KNL_INSTANCE_ATTR_COMMON_H_ */ diff --git a/src/include/replication/syncrep.h b/src/include/replication/syncrep.h index 6f620b338..e3ff875cd 100644 --- a/src/include/replication/syncrep.h +++ b/src/include/replication/syncrep.h @@ -98,5 +98,11 @@ typedef union syncrep_scanner_YYSTYPE { extern int syncrep_scanner_yylex(syncrep_scanner_YYSTYPE* lvalp, YYLTYPE* llocp, syncrep_scanner_yyscan_t yyscanner); extern void syncrep_scanner_yyerror(const char* message, syncrep_scanner_yyscan_t yyscanner); +typedef enum { + ALL_NODE, + ONLY_SYNC_NODE, + NONE_NODE +} Sync_Config_Strategy; + #endif /* _SYNCREP_H */