Skip to content

Commit

Permalink
ovn-nbctl: Support --no-shuffle-remotes.
Browse files Browse the repository at this point in the history
Support --no-shuffle-remotes option for ovn-nbctl, which is mainly for testing
purpose, so that we can specify the order that client will failover when the
connected node is down, to have more predictability in the test cases.

Signed-off-by: Han Zhou <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
hzhou8 authored and blp committed Apr 15, 2019
1 parent d590505 commit 3dcb9ce
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
17 changes: 17 additions & 0 deletions ovn/utilities/ovn-nbctl.8.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
26 changes: 24 additions & 2 deletions ovn/utilities/ovn-nbctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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\
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3dcb9ce

Please sign in to comment.