@@ -1142,6 +1142,23 @@
<code>Understanding Cluster Consistency</code> in <code>ovsdb</code>(7)
for more information.
</dd>
+
+ <dt><code>--shuffle-remotes</code></dt>
+ <dt><code>--no-shuffle-remotes</code></dt>
+ <dd>
+ By default, or with <code>--shuffle-remotes</code>, when there are
+ multiple remotes specified in the OVSDB connection string specified by
+ <code>--db</code> or the <env>OVN_NB_DB</env> environment variable,
+ the order of the remotes will be shuffled before the client tries to
+ connect. The remotes will be shuffled only once to a new order before
+ the first connection attempt. The following retries, if any, will
+ follow the same new order. The default behavior is to make sure
+ clients of a clustered database can distribute evenly to all memembers
+ of the cluster. With <code>--no-shuffle-remotes</code>,
+ <code>ovn-nbctl</code> will use the original order specified in the
+ connection string to connect. This allows user to specify the
+ preferred order, which is particularly useful for testing.
+ </dd>
</dl>
<h2>Daemon Options</h2>
@@ -83,6 +83,10 @@ OVS_NO_RETURN static void nbctl_exit(int status);
/* --leader-only, --no-leader-only: Only accept the leader in a cluster. */
static int leader_only = true;
+/* --shuffle-remotes, --no-shuffle-remotes: Shuffle the order of remotes that
+ * are specified in the connetion method string. */
+static int shuffle_remotes = true;
+
/* --unixctl-path: Path to use for unixctl server, for "monitor" and "snoop"
commands. */
static char *unixctl_path;
@@ -182,8 +186,11 @@ main(int argc, char *argv[])
}
daemon_mode = true;
}
- /* Initialize IDL. "retry" is true iff in daemon mode. */
- idl = the_idl = ovsdb_idl_create(db, &nbrec_idl_class, true, daemon_mode);
+ /* Initialize IDL. */
+ idl = the_idl = ovsdb_idl_create_unconnected(&nbrec_idl_class, true);
+ ovsdb_idl_set_shuffle_remotes(idl, shuffle_remotes);
+ /* "retry" is true iff in daemon mode. */
+ ovsdb_idl_set_remote(idl, db, daemon_mode);
ovsdb_idl_set_leader_only(idl, leader_only);
if (daemon_mode) {
@@ -304,6 +311,8 @@ enum {
OPT_OPTIONS,
OPT_LEADER_ONLY,
OPT_NO_LEADER_ONLY,
+ OPT_SHUFFLE_REMOTES,
+ OPT_NO_SHUFFLE_REMOTES,
OPT_BOOTSTRAP_CA_CERT,
MAIN_LOOP_OPTION_ENUMS,
DAEMON_OPTION_ENUMS,
@@ -405,6 +414,8 @@ get_all_options(void)
{"options", no_argument, NULL, OPT_OPTIONS},
{"leader-only", no_argument, NULL, OPT_LEADER_ONLY},
{"no-leader-only", no_argument, NULL, OPT_NO_LEADER_ONLY},
+ {"shuffle-remotes", no_argument, NULL, OPT_SHUFFLE_REMOTES},
+ {"no-shuffle-remotes", no_argument, NULL, OPT_NO_SHUFFLE_REMOTES},
{"version", no_argument, NULL, 'V'},
MAIN_LOOP_LONG_OPTIONS,
DAEMON_LONG_OPTIONS,
@@ -509,6 +520,14 @@ apply_options_direct(const struct ovs_cmdl_parsed_option *parsed_options,
leader_only = false;
break;
+ case OPT_SHUFFLE_REMOTES:
+ shuffle_remotes = true;
+ break;
+
+ case OPT_NO_SHUFFLE_REMOTES:
+ shuffle_remotes = false;
+ break;
+
case 'V':
ovs_print_version(0, 0);
printf("DB Schema %s\n", nbrec_get_db_version());
@@ -705,6 +724,7 @@ Options:\n\
(default: %s)\n\
--no-wait, --wait=none do not wait for OVN reconfiguration (default)\n\
--no-leader-only accept any cluster member, not just the leader\n\
+ --no-shuffle-remotes do not shuffle the order of remotes\n\
--wait=sb wait for southbound database update\n\
--wait=hv wait for all chassis to catch up\n\
-t, --timeout=SECS wait at most SECS seconds\n\
@@ -5532,6 +5552,8 @@ nbctl_client(const char *socket_name,
case OPT_LEADER_ONLY:
case OPT_NO_LEADER_ONLY:
+ case OPT_SHUFFLE_REMOTES:
+ case OPT_NO_SHUFFLE_REMOTES:
case OPT_BOOTSTRAP_CA_CERT:
STREAM_SSL_CASES
DAEMON_OPTION_CASES