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:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user