summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Maximets <i.maximets@ovn.org>2021-06-10 22:04:19 +0200
committerIlya Maximets <i.maximets@ovn.org>2021-07-15 22:38:49 +0200
commite26bf9726fad19bcf8bd48664d6ad9be63cdc8b5 (patch)
tree3c06bffa5fe6580d9f5edba1346948823397f129
parentedcf441722d1b570b8a1cd9207550b2d9076ce8b (diff)
downloadopenvswitch-e26bf9726fad19bcf8bd48664d6ad9be63cdc8b5.tar.gz
ovsdb: Make clients aware of relay service model.
Clients needs to re-connect from the relay that has no connection with the database source. Also, relay acts similarly to the follower from a clustered model from the consistency point of view, so it's not suitable for leader-only connections. Acked-by: Mark D. Gray <mark.d.gray@redhat.com> Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r--lib/ovsdb-cs.c15
-rw-r--r--ovsdb/ovsdb-client.c2
-rw-r--r--python/ovs/db/idl.py16
3 files changed, 31 insertions, 2 deletions
diff --git a/lib/ovsdb-cs.c b/lib/ovsdb-cs.c
index 22630955d..f13065c6c 100644
--- a/lib/ovsdb-cs.c
+++ b/lib/ovsdb-cs.c
@@ -1914,8 +1914,8 @@ ovsdb_cs_check_server_db__(struct ovsdb_cs *cs)
bool ok = false;
const char *model = server_column_get_string(db_row, COL_MODEL, "");
const char *schema = server_column_get_string(db_row, COL_SCHEMA, NULL);
+ bool connected = server_column_get_bool(db_row, COL_CONNECTED, false);
if (!strcmp(model, "clustered")) {
- bool connected = server_column_get_bool(db_row, COL_CONNECTED, false);
bool leader = server_column_get_bool(db_row, COL_LEADER, false);
uint64_t index = server_column_get_int(db_row, COL_INDEX, 0);
@@ -1935,6 +1935,19 @@ ovsdb_cs_check_server_db__(struct ovsdb_cs *cs)
cs->min_index = index;
ok = true;
}
+ } else if (!strcmp(model, "relay")) {
+ if (!schema) {
+ VLOG_INFO("%s: relay database server has not yet connected to the "
+ "relay source; trying another server", server_name);
+ } else if (!connected) {
+ VLOG_INFO("%s: relay database server is disconnected from the "
+ "relay source; trying another server", server_name);
+ } else if (cs->leader_only) {
+ VLOG_INFO("%s: relay database server cannot be a leader; "
+ "trying another server", server_name);
+ } else {
+ ok = true;
+ }
} else {
if (!schema) {
VLOG_INFO("%s: missing database schema", server_name);
diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
index ffa8f8df2..f1b8d6491 100644
--- a/ovsdb/ovsdb-client.c
+++ b/ovsdb/ovsdb-client.c
@@ -716,7 +716,7 @@ should_stay_connected(const char *server, const char *database,
return false;
}
- if (strcmp(parse_string_column(row, "model"), "clustered")) {
+ if (!strcmp(parse_string_column(row, "model"), "standalone")) {
/* Always accept standalone databases. */
return true;
}
diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
index 0fc2af3c2..1bf9b1e09 100644
--- a/python/ovs/db/idl.py
+++ b/python/ovs/db/idl.py
@@ -38,6 +38,7 @@ OVSDB_UPDATE = 0
OVSDB_UPDATE2 = 1
CLUSTERED = "clustered"
+RELAY = "relay"
Notice = collections.namedtuple('Notice', ('event', 'row', 'updates'))
@@ -798,6 +799,21 @@ class Idl(object):
'trying another server' % session_name)
return False
self._min_index = database.index[0]
+ elif database.model == RELAY:
+ if not database.schema:
+ vlog.info('%s: relay database server has not yet connected '
+ 'to the relay source; trying another server'
+ % session_name)
+ return False
+ if not database.connected:
+ vlog.info('%s: relay database server is disconnected '
+ 'from the relay source; trying another server'
+ % session_name)
+ return False
+ if self.leader_only:
+ vlog.info('%s: relay database server cannot be a leader; '
+ 'trying another server' % session_name)
+ return False
return True