Hi Vladislav, On 5/3/23 02:55, Vladislav Odintsov wrote: > For large OVN_Southbound (or other) databases the default interval of 5000 ms > could be not sufficient to run. This patch adds configuration of OVSDB > inactivity probes for ovn-*ctl utilities. > > Initially, on the utility start the hardcoded value of 120000 ms is set. > For daemon-mode it is possible to configure intervals in OVN Northbound > database: > OVN_Northbound.NB_Global.options.dbctl_inactivity_probe for ovn-nbctl and > ovn-sbctl utilities. > > If no DB configuration option was provided, the initial (120000 ms) interval > is left.
Nit: I would add here something like "A non-zero inactivity probe interval is required in order to allow DB clients to detect connection failures due to network issues." > > Signed-off-by: Vladislav Odintsov <odiv...@gmail.com> > --- > lib/ovn-util.h | 2 ++ > ovn-nb.xml | 20 ++++++++++++++++++++ > utilities/ovn-dbctl.c | 18 ++++++++++++++++++ > utilities/ovn-dbctl.h | 1 + > utilities/ovn-ic-nbctl.c | 4 ++++ > utilities/ovn-ic-sbctl.c | 4 ++++ > utilities/ovn-nbctl.c | 15 +++++++++++++++ > utilities/ovn-sbctl.c | 15 +++++++++++++++ I'm not sure whether we should we mention this user visible change in the NEWS file. > 8 files changed, 79 insertions(+) > > diff --git a/lib/ovn-util.h b/lib/ovn-util.h > index 7cf861dbc..47e53ca74 100644 > --- a/lib/ovn-util.h > +++ b/lib/ovn-util.h > @@ -154,6 +154,8 @@ void set_idl_probe_interval(struct ovsdb_idl *idl, const > char *remote, > #define OVN_MAX_DP_VXLAN_KEY ((1u << 12) - 1) > #define OVN_MAX_DP_VXLAN_KEY_LOCAL (OVN_MAX_DP_KEY - OVN_MAX_DP_GLOBAL_NUM) > > +#define DEFAULT_UTILS_PROBE_INTERVAL_MSEC 120000 I think this should go to ovn-dbctl.h instead but whoever applies the patch can move this. So I don't think there's a need for v3, therefore: Acked-by: Dumitru Ceara <dce...@redhat.com> Ilya, Mark, Numan, Han, what do you guys think? Regards, Dumitru > + > struct hmap; > void ovn_destroy_tnlids(struct hmap *tnlids); > bool ovn_add_tnlid(struct hmap *set, uint32_t tnlid); > diff --git a/ovn-nb.xml b/ovn-nb.xml > index fd32070f2..a82f31a92 100644 > --- a/ovn-nb.xml > +++ b/ovn-nb.xml > @@ -215,6 +215,26 @@ > </p> > </column> > > + <column name="options" key="dbctl_probe_interval"> > + <p> > + The inactivity probe interval of the connection to the OVN > Northbound > + and Southbound databases from <code>ovn-nbctl</code> and > + <code>ovn-sbctl</code> utilities respectively, in milliseconds. > + If the value is zero, it disables the connection keepalive feature. > + </p> > + > + <p> > + If the value is nonzero, then it will be forced to a value of > + at least 1000 ms. > + </p> > + > + <p> > + If the value less then zero, then the default inactivity probe > + interval for <code>ovn-nbctl</code> and <code>ovn-sbctl</code> > would > + be left intact (120000 ms). > + </p> > + </column> > + > <column name="options" key="northd_trim_timeout"> > <p> > When used, this configuration value specifies the time, in > diff --git a/utilities/ovn-dbctl.c b/utilities/ovn-dbctl.c > index 369a6a663..c6aebcbbb 100644 > --- a/utilities/ovn-dbctl.c > +++ b/utilities/ovn-dbctl.c > @@ -205,6 +205,9 @@ ovn_dbctl_main(int argc, char *argv[], > ovsdb_idl_set_remote(idl, db, daemon_mode); > ovsdb_idl_set_leader_only(idl, leader_only); > > + /* Set reasonable high probe interval. */ > + set_idl_probe_interval(idl, db, DEFAULT_UTILS_PROBE_INTERVAL_MSEC); > + > if (daemon_mode) { > server_loop(dbctl_options, idl, argc, argv_); > } else { > @@ -1094,6 +1097,17 @@ out: > free(argv); > } > > +static void > +update_inactivity_probe(struct server_cmd_run_ctx *ctx) > +{ > + int inactivity_probe = > ctx->dbctl_options->get_inactivity_probe(ctx->idl); > + if (inactivity_probe < 0) { > + inactivity_probe = DEFAULT_UTILS_PROBE_INTERVAL_MSEC; > + } > + > + set_idl_probe_interval(ctx->idl, db, inactivity_probe); > +} > + > static void > server_loop(const struct ovn_dbctl_options *dbctl_options, > struct ovsdb_idl *idl, int argc, char *argv[]) > @@ -1125,6 +1139,10 @@ server_loop(const struct ovn_dbctl_options > *dbctl_options, > > for (;;) { > update_ssl_config(); > + > + /* Configure inactivity probe from connected DB. */ > + update_inactivity_probe(&server_cmd_run_ctx); > + > memory_run(); > if (memory_should_report()) { > struct simap usage = SIMAP_INITIALIZER(&usage); > diff --git a/utilities/ovn-dbctl.h b/utilities/ovn-dbctl.h > index a1fbede6b..54c232dd6 100644 > --- a/utilities/ovn-dbctl.h > +++ b/utilities/ovn-dbctl.h > @@ -52,6 +52,7 @@ struct ovn_dbctl_options { > const struct timer *wait_timeout, > long long int start_time, bool print_wait_time); > > + int (*get_inactivity_probe)(struct ovsdb_idl *); > struct ctl_context *(*ctx_create)(void); > void (*ctx_destroy)(struct ctl_context *); > }; > diff --git a/utilities/ovn-ic-nbctl.c b/utilities/ovn-ic-nbctl.c > index f3d8039a8..19d8b054f 100644 > --- a/utilities/ovn-ic-nbctl.c > +++ b/utilities/ovn-ic-nbctl.c > @@ -116,6 +116,10 @@ main(int argc, char *argv[]) > ovsdb_idl_set_remote(idl, db, false); > ovsdb_idl_set_db_change_aware(idl, false); > ovsdb_idl_set_leader_only(idl, leader_only); > + > + /* Set reasonable high probe interval. */ > + set_idl_probe_interval(idl, db, DEFAULT_UTILS_PROBE_INTERVAL_MSEC); > + > run_prerequisites(commands, n_commands, idl); > > /* Execute the commands. > diff --git a/utilities/ovn-ic-sbctl.c b/utilities/ovn-ic-sbctl.c > index 3060b48b9..215d09d30 100644 > --- a/utilities/ovn-ic-sbctl.c > +++ b/utilities/ovn-ic-sbctl.c > @@ -115,6 +115,10 @@ main(int argc, char *argv[]) > ovsdb_idl_set_remote(idl, db, false); > ovsdb_idl_set_db_change_aware(idl, false); > ovsdb_idl_set_leader_only(idl, leader_only); > + > + /* Set reasonable high probe interval. */ > + set_idl_probe_interval(idl, db, DEFAULT_UTILS_PROBE_INTERVAL_MSEC); > + > run_prerequisites(commands, n_commands, idl); > > /* Execute the commands. > diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c > index 45572fd30..49c5b294a 100644 > --- a/utilities/ovn-nbctl.c > +++ b/utilities/ovn-nbctl.c > @@ -153,6 +153,20 @@ nbctl_post_execute(struct ovsdb_idl *idl, struct > ovsdb_idl_txn *txn, > } > } > > +static int > +get_inactivity_probe(struct ovsdb_idl *idl) > +{ > + const struct nbrec_nb_global *nb = nbrec_nb_global_first(idl); > + int interval = -1; > + > + if (nb) { > + interval = smap_get_int(&nb->options, "dbctl_probe_interval", > + interval); > + } > + > + return interval; > +} > + > static char * OVS_WARN_UNUSED_RESULT dhcp_options_get( > struct ctl_context *ctx, const char *id, bool must_exist, > const struct nbrec_dhcp_options **); > @@ -7935,6 +7949,7 @@ main(int argc, char *argv[]) > .add_base_prerequisites = nbctl_add_base_prerequisites, > .pre_execute = nbctl_pre_execute, > .post_execute = nbctl_post_execute, > + .get_inactivity_probe = get_inactivity_probe, > > .ctx_create = nbctl_ctx_create, > .ctx_destroy = nbctl_ctx_destroy, > diff --git a/utilities/ovn-sbctl.c b/utilities/ovn-sbctl.c > index 542ab9ffa..76465fe7e 100644 > --- a/utilities/ovn-sbctl.c > +++ b/utilities/ovn-sbctl.c > @@ -150,6 +150,20 @@ Other options:\n\ > * gracefully. */ > #define ctl_fatal dont_use_ctl_fatal_use_ctl_error_and_return > > +static int > +get_inactivity_probe(struct ovsdb_idl *idl) > +{ > + const struct sbrec_sb_global *sb = sbrec_sb_global_first(idl); > + int interval = -1; > + > + if (sb) { > + interval = smap_get_int(&sb->options, "dbctl_probe_interval", > + interval); > + } > + > + return interval; > +} > + > /* ovs-sbctl specific context. Inherits the 'struct ctl_context' as base. */ > struct sbctl_context { > struct ctl_context base; > @@ -1590,6 +1604,7 @@ main(int argc, char *argv[]) > .add_base_prerequisites = sbctl_add_base_prerequisites, > .pre_execute = sbctl_pre_execute, > .post_execute = NULL, > + .get_inactivity_probe = get_inactivity_probe, > > .ctx_create = sbctl_ctx_create, > .ctx_destroy = sbctl_ctx_destroy, _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev