diff options
author | Ilya Maximets <i.maximets@ovn.org> | 2021-06-10 22:04:19 +0200 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2021-07-15 22:38:49 +0200 |
commit | e26bf9726fad19bcf8bd48664d6ad9be63cdc8b5 (patch) | |
tree | 3c06bffa5fe6580d9f5edba1346948823397f129 | |
parent | edcf441722d1b570b8a1cd9207550b2d9076ce8b (diff) | |
download | openvswitch-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.c | 15 | ||||
-rw-r--r-- | ovsdb/ovsdb-client.c | 2 | ||||
-rw-r--r-- | python/ovs/db/idl.py | 16 |
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 |