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

Reply via email to