On Fri, Dec 13, 2019 at 9:16 PM <num...@ovn.org> wrote: > > From: Numan Siddique <num...@ovn.org> > > When ovsdb-server is in backup mode and connects to the active > ovsdb-server for replication, and if takes more than 5 seconds to > get the dump of the whole database, it will drop the connection > soon after as the default probe interval is 5 seconds. This > results in a snowball effect of reconnections to the active > ovsdb-server. > > This patch handles or mitigates this issue by setting the > default probe interval value to 60 seconds and provide the option to > configure this value from the unixctl command. > > Other option could be increase the value of 'RECONNECT_DEFAULT_PROBE_INTERVAL' > to a higher value. > > Acked-by: Mark Michelson <mmich...@redhat.com> > Signed-off-by: Numan Siddique <num...@ovn.org>
Looks good to me. Acked-by: Dumitru Ceara <dce...@redhat.com> > --- > ovsdb/ovsdb-server.1.in | 6 ++++++ > ovsdb/ovsdb-server.c | 46 ++++++++++++++++++++++++++++++++++------- > ovsdb/replication.c | 4 +++- > ovsdb/replication.h | 4 +++- > 4 files changed, 51 insertions(+), 9 deletions(-) > > diff --git a/ovsdb/ovsdb-server.1.in b/ovsdb/ovsdb-server.1.in > index 21f527bc6..daa420909 100644 > --- a/ovsdb/ovsdb-server.1.in > +++ b/ovsdb/ovsdb-server.1.in > @@ -288,6 +288,12 @@ Switches the server to an active role. The server stops > synchronizing > its databases with an active server and closes all existing client > connections, which requires clients to reconnect. > . > +.IP "\fBovsdb\-server/set\-active\-ovsdb\-server-probe-interval \fIprobe > interval" > +Sets the probe interval (in milli seconds) for the connection to > +active \fIserver\fR. For the value to take effect, the connection to the > +active \fIserver\fR should be disconnected and connected again. > +. > +. > .IP "\fBovsdb\-server/set\-sync\-exclude\-tables > \fIdb\fB:\fItable\fR[\fB,\fIdb\fB:\fItable\fR]..." > Sets the \fItable\fR within \fIdb\fR that will be excluded from > synchronization. > This overrides the \fB\-\-sync\-exclude-tables\fR command-line option. > diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c > index 9827320ec..4ffe24ad7 100644 > --- a/ovsdb/ovsdb-server.c > +++ b/ovsdb/ovsdb-server.c > @@ -86,6 +86,7 @@ static unixctl_cb_func ovsdb_server_set_active_ovsdb_server; > static unixctl_cb_func ovsdb_server_get_active_ovsdb_server; > static unixctl_cb_func ovsdb_server_connect_active_ovsdb_server; > static unixctl_cb_func ovsdb_server_disconnect_active_ovsdb_server; > +static unixctl_cb_func ovsdb_server_set_active_ovsdb_server_probe_interval; > static unixctl_cb_func ovsdb_server_set_sync_exclude_tables; > static unixctl_cb_func ovsdb_server_get_sync_exclude_tables; > static unixctl_cb_func ovsdb_server_get_sync_status; > @@ -97,6 +98,7 @@ struct server_config { > char **sync_from; > char **sync_exclude; > bool *is_backup; > + int *replication_probe_interval; > struct ovsdb_jsonrpc_server *jsonrpc; > }; > static unixctl_cb_func ovsdb_server_add_remote; > @@ -144,9 +146,10 @@ static void load_config(FILE *config_file, struct sset > *remotes, > > static void > ovsdb_replication_init(const char *sync_from, const char *exclude, > - struct shash *all_dbs, const struct uuid *server_uuid) > + struct shash *all_dbs, const struct uuid *server_uuid, > + int probe_interval) > { > - replication_init(sync_from, exclude, server_uuid); > + replication_init(sync_from, exclude, server_uuid, probe_interval); > struct shash_node *node; > SHASH_FOR_EACH (node, all_dbs) { > struct db *db = node->data; > @@ -304,6 +307,7 @@ main(int argc, char *argv[]) > struct server_config server_config; > struct shash all_dbs; > struct shash_node *node, *next; > + int replication_probe_interval = REPLICATION_DEFAULT_PROBE_INTERVAL; > > ovs_cmdl_proctitle_init(argc, argv); > set_program_name(argv[0]); > @@ -351,6 +355,7 @@ main(int argc, char *argv[]) > server_config.sync_from = &sync_from; > server_config.sync_exclude = &sync_exclude; > server_config.is_backup = &is_backup; > + server_config.replication_probe_interval = &replication_probe_interval; > > perf_counters_init(); > > @@ -436,6 +441,9 @@ main(int argc, char *argv[]) > unixctl_command_register("ovsdb-server/disconnect-active-ovsdb-server", > "", > 0, 0, > ovsdb_server_disconnect_active_ovsdb_server, > &server_config); > + unixctl_command_register( > + "ovsdb-server/set-active-ovsdb-server-probe-interval", "", 1, 1, > + ovsdb_server_set_active_ovsdb_server_probe_interval, &server_config); > unixctl_command_register("ovsdb-server/set-sync-exclude-tables", "", > 0, 1, ovsdb_server_set_sync_exclude_tables, > &server_config); > @@ -454,7 +462,8 @@ main(int argc, char *argv[]) > if (is_backup) { > const struct uuid *server_uuid; > server_uuid = ovsdb_jsonrpc_server_get_uuid(jsonrpc); > - ovsdb_replication_init(sync_from, sync_exclude, &all_dbs, > server_uuid); > + ovsdb_replication_init(sync_from, sync_exclude, &all_dbs, > server_uuid, > + replication_probe_interval); > } > > main_loop(&server_config, jsonrpc, &all_dbs, unixctl, &remotes, > @@ -1317,7 +1326,8 @@ ovsdb_server_connect_active_ovsdb_server(struct > unixctl_conn *conn, > const struct uuid *server_uuid; > server_uuid = ovsdb_jsonrpc_server_get_uuid(config->jsonrpc); > ovsdb_replication_init(*config->sync_from, *config->sync_exclude, > - config->all_dbs, server_uuid); > + config->all_dbs, server_uuid, > + *config->replication_probe_interval); > if (!*config->is_backup) { > *config->is_backup = true; > save_config(config); > @@ -1340,6 +1350,25 @@ ovsdb_server_disconnect_active_ovsdb_server(struct > unixctl_conn *conn, > unixctl_command_reply(conn, NULL); > } > > +static void > +ovsdb_server_set_active_ovsdb_server_probe_interval(struct unixctl_conn > *conn, > + int argc OVS_UNUSED, > + const char *argv[], > + void *config_) > +{ > + struct server_config *config = config_; > + > + int probe_interval; > + if (str_to_int(argv[1], 10, &probe_interval)) { > + *config->replication_probe_interval = probe_interval; > + save_config(config); > + unixctl_command_reply(conn, NULL); > + } else { > + unixctl_command_reply( > + conn, "Invalid probe interval, integer value expected"); > + } > +} > + > static void > ovsdb_server_set_sync_exclude_tables(struct unixctl_conn *conn, > int argc OVS_UNUSED, > @@ -1357,7 +1386,8 @@ ovsdb_server_set_sync_exclude_tables(struct > unixctl_conn *conn, > const struct uuid *server_uuid; > server_uuid = ovsdb_jsonrpc_server_get_uuid(config->jsonrpc); > ovsdb_replication_init(*config->sync_from, *config->sync_exclude, > - config->all_dbs, server_uuid); > + config->all_dbs, server_uuid, > + *config->replication_probe_interval); > } > err = set_blacklist_tables(argv[1], false); > } > @@ -1568,7 +1598,8 @@ ovsdb_server_add_database(struct unixctl_conn *conn, > int argc OVS_UNUSED, > const struct uuid *server_uuid; > server_uuid = ovsdb_jsonrpc_server_get_uuid(config->jsonrpc); > ovsdb_replication_init(*config->sync_from, *config->sync_exclude, > - config->all_dbs, server_uuid); > + config->all_dbs, server_uuid, > + *config->replication_probe_interval); > } > unixctl_command_reply(conn, NULL); > } else { > @@ -1590,7 +1621,8 @@ remove_db(struct server_config *config, struct > shash_node *node, char *comment) > const struct uuid *server_uuid; > server_uuid = ovsdb_jsonrpc_server_get_uuid(config->jsonrpc); > ovsdb_replication_init(*config->sync_from, *config->sync_exclude, > - config->all_dbs, server_uuid); > + config->all_dbs, server_uuid, > + *config->replication_probe_interval); > } > } > > diff --git a/ovsdb/replication.c b/ovsdb/replication.c > index 42e27cba0..d5aee77c4 100644 > --- a/ovsdb/replication.c > +++ b/ovsdb/replication.c > @@ -125,7 +125,7 @@ static struct replication_db *find_db(const char > *db_name); > > void > replication_init(const char *sync_from_, const char *exclude_tables, > - const struct uuid *server) > + const struct uuid *server, int probe_interval) > { > free(sync_from); > sync_from = xstrdup(sync_from_); > @@ -143,6 +143,8 @@ replication_init(const char *sync_from_, const char > *exclude_tables, > session = jsonrpc_session_open(sync_from, true); > session_seqno = UINT_MAX; > > + jsonrpc_session_set_probe_interval(session, probe_interval); > + > /* Keep a copy of local server uuid. */ > server_uuid = *server; > > diff --git a/ovsdb/replication.h b/ovsdb/replication.h > index 1f9c32fa7..c74805014 100644 > --- a/ovsdb/replication.h > +++ b/ovsdb/replication.h > @@ -44,8 +44,10 @@ struct ovsdb; > * used mainly by uinxctl commands. > */ > > +#define REPLICATION_DEFAULT_PROBE_INTERVAL 60000 > + > void replication_init(const char *sync_from, const char *exclude_tables, > - const struct uuid *server); > + const struct uuid *server, int probe_interval); > void replication_run(void); > void replication_wait(void); > void replication_destroy(void); > -- > 2.21.0 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev