diff --git a/core/log_io_remote.m b/core/log_io_remote.m index 7f78e786abd79c7d74f97d1db6c2c62169445897..1d54f9603f6fb5df4a918d87d0c58df588e3994f 100644 --- a/core/log_io_remote.m +++ b/core/log_io_remote.m @@ -177,7 +177,8 @@ default_remote_row_handler(struct recovery_state *r, struct tbuf *row) } void -recover_follow_remote(struct recovery_state *r, const char *ip_addr, int port) +recovery_follow_remote(struct recovery_state *r, + const char *ip_addr, int port) { char *name; struct fiber *f; @@ -214,3 +215,11 @@ recover_follow_remote(struct recovery_state *r, const char *ip_addr, int port) fiber_call(f); r->remote_recovery = f; } + +void +recovery_stop_remote(struct recovery_state *r) +{ + say_info("shutting down the replica"); + fiber_cancel(r->remote_recovery); + r->remote_recovery = NULL; +} diff --git a/include/log_io.h b/include/log_io.h index 44218966cd2cedb457c4b0e966515c184adabe4b..1b3214ac91373499d7408f069120bde5f8637be5 100644 --- a/include/log_io.h +++ b/include/log_io.h @@ -169,7 +169,9 @@ void recovery_wait_lsn(struct recovery_state *r, i64 lsn); int read_log(const char *filename, row_handler xlog_handler, row_handler snap_handler, void *state); -void recover_follow_remote(struct recovery_state *r, const char *ip_addr, int port); +void recovery_follow_remote(struct recovery_state *r, + const char *ip_addr, int port); +void recovery_stop_remote(struct recovery_state *r); struct log_io_iter; void snapshot_write_row(struct log_io_iter *i, u16 tag, u64 cookie, struct tbuf *row); diff --git a/mod/box/box.m b/mod/box/box.m index 5b313c383bca2b70c80f8f69ca89b97ba853ff49..6e6084ed9432d3b10b0e474ee17772a4405c52a5 100644 --- a/mod/box/box.m +++ b/mod/box/box.m @@ -1224,26 +1224,6 @@ title(const char *fmt, ...) cfg.primary_port, cfg.secondary_port, cfg.admin_port); } -void -remote_recovery_start(struct recovery_state *r, const char *ipaddr, int port) -{ - say_info("starting the replica"); - - recover_follow_remote(r, ipaddr, port); - - snprintf(status, sizeof(status), "replica/%s:%i%s", ipaddr, port, - custom_proc_title); - title("replica/%s:%i%s", ipaddr, port, custom_proc_title); -} - - -void -remote_recovery_stop(struct recovery_state *r) -{ - say_info("shutting down the replica"); - fiber_cancel(r->remote_recovery); - r->remote_recovery = NULL; -} static void box_enter_master_or_replica_mode(struct tarantool_cfg *conf) @@ -1253,9 +1233,15 @@ box_enter_master_or_replica_mode(struct tarantool_cfg *conf) recovery_wait_lsn(recovery_state, recovery_state->lsn); - remote_recovery_start(recovery_state, + recovery_follow_remote(recovery_state, conf->wal_feeder_ipaddr, conf->wal_feeder_port); + + snprintf(status, sizeof(status), "replica/%s:%i%s", + conf->wal_feeder_ipaddr, conf->wal_feeder_port, + custom_proc_title); + title("replica/%s:%i%s", conf->wal_feeder_ipaddr, + conf->wal_feeder_port, custom_proc_title); } else { rw_callback = box_process_rw; @@ -1299,7 +1285,12 @@ mod_check_config(struct tarantool_cfg *conf) i32 mod_reload_config(struct tarantool_cfg *old_conf, struct tarantool_cfg *new_conf) { - if (old_conf->remote_hot_standby != new_conf->remote_hot_standby) { + if (old_conf->remote_hot_standby != new_conf->remote_hot_standby || + (old_conf->remote_hot_standby != 0 && + (strcmp(old_conf->wal_feeder_ipaddr, + new_conf->wal_feeder_ipaddr) != 0 || + old_conf->wal_feeder_port != new_conf->wal_feeder_port))) { + if (recovery_state->finalize != true) { out_warning(0, "Could not propagate %s before local recovery finished", old_conf->remote_hot_standby == true ? "slave to master" : @@ -1307,25 +1298,11 @@ mod_reload_config(struct tarantool_cfg *old_conf, struct tarantool_cfg *new_conf return -1; } - } - - if (old_conf->remote_hot_standby != new_conf->remote_hot_standby) { - /* Local recovery must be finalized at this point */ - assert(recovery_state->finalize == true); if (recovery_state->remote_recovery) - remote_recovery_stop(recovery_state); + recovery_stop_remote(recovery_state); box_enter_master_or_replica_mode(new_conf); - } else if (old_conf->remote_hot_standby > 0 && - (strcmp(old_conf->wal_feeder_ipaddr, new_conf->wal_feeder_ipaddr) != 0 || - old_conf->wal_feeder_port != new_conf->wal_feeder_port)) { - - if (recovery_state->remote_recovery) - remote_recovery_stop(recovery_state); - remote_recovery_start(recovery_state, - new_conf->wal_feeder_ipaddr, - new_conf->wal_feeder_port); } return 0;