2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 22:35:15 +00:00

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>
This commit is contained in:
Ilya Maximets
2021-06-10 22:04:19 +02:00
parent edcf441722
commit e26bf9726f
3 changed files with 31 additions and 2 deletions

View File

@@ -1914,8 +1914,8 @@ ovsdb_cs_check_server_db__(struct ovsdb_cs *cs)
bool ok = false; bool ok = false;
const char *model = server_column_get_string(db_row, COL_MODEL, ""); const char *model = server_column_get_string(db_row, COL_MODEL, "");
const char *schema = server_column_get_string(db_row, COL_SCHEMA, NULL); 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")) { 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); bool leader = server_column_get_bool(db_row, COL_LEADER, false);
uint64_t index = server_column_get_int(db_row, COL_INDEX, 0); 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; cs->min_index = index;
ok = true; 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 { } else {
if (!schema) { if (!schema) {
VLOG_INFO("%s: missing database schema", server_name); VLOG_INFO("%s: missing database schema", server_name);

View File

@@ -716,7 +716,7 @@ should_stay_connected(const char *server, const char *database,
return false; return false;
} }
if (strcmp(parse_string_column(row, "model"), "clustered")) { if (!strcmp(parse_string_column(row, "model"), "standalone")) {
/* Always accept standalone databases. */ /* Always accept standalone databases. */
return true; return true;
} }

View File

@@ -38,6 +38,7 @@ OVSDB_UPDATE = 0
OVSDB_UPDATE2 = 1 OVSDB_UPDATE2 = 1
CLUSTERED = "clustered" CLUSTERED = "clustered"
RELAY = "relay"
Notice = collections.namedtuple('Notice', ('event', 'row', 'updates')) Notice = collections.namedtuple('Notice', ('event', 'row', 'updates'))
@@ -798,6 +799,21 @@ class Idl(object):
'trying another server' % session_name) 'trying another server' % session_name)
return False return False
self._min_index = database.index[0] 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 return True