On 14/07/2021 14:50, Ilya Maximets wrote: > It might be important for clients to know that relay lost connection > with the relay remote, so they could re-connect to other relay. > > Signed-off-by: Ilya Maximets <[email protected]> > --- > ovsdb/_server.xml | 17 +++++++++-------- > ovsdb/ovsdb-server.c | 3 ++- > ovsdb/relay.c | 34 ++++++++++++++++++++++++++++++++++ > ovsdb/relay.h | 4 ++++ > 4 files changed, 49 insertions(+), 9 deletions(-) > > diff --git a/ovsdb/_server.xml b/ovsdb/_server.xml > index 37297da73..7866f134f 100644 > --- a/ovsdb/_server.xml > +++ b/ovsdb/_server.xml > @@ -71,6 +71,15 @@ > source. > </column> > > + <column name="connected"> > + True if the database is connected to its storage. A standalone > database > + is always connected. A clustered database is connected if the server > is > + in contact with a majority of its cluster. A relay database is > connected > + if the server is in contact with the relay source, i.e. is connected to > + the server it syncs from. An unconnected database cannot be modified > and > + its data might be unavailable or stale. > + </column> > + > <group title="Clustered Databases"> > <p> > These columns are most interesting and in some cases only relevant > for > @@ -78,14 +87,6 @@ > column is <code>clustered</code>. > </p> > > - <column name="connected"> > - True if the database is connected to its storage. A standalone or > - active-backup database is always connected. A clustered database is > - connected if the server is in contact with a majority of its cluster. > - An unconnected database cannot be modified and its data might be > - unavailable or stale. > - </column> > - > <column name="leader"> > True if the database is the leader in its cluster. For a standalone > or > active-backup database, this is always true. For a relay database, > diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c > index ddf868d16..0181fe987 100644 > --- a/ovsdb/ovsdb-server.c > +++ b/ovsdb/ovsdb-server.c > @@ -1193,7 +1193,8 @@ update_database_status(struct ovsdb_row *row, struct db > *db) > ovsdb_util_write_string_column(row, "model", > db->db->is_relay ? "relay" : > ovsdb_storage_get_model(db->db->storage)); > ovsdb_util_write_bool_column(row, "connected", > - > ovsdb_storage_is_connected(db->db->storage)); > + db->db->is_relay ? ovsdb_relay_is_connected(db->db) > + : ovsdb_storage_is_connected(db->db->storage)); > ovsdb_util_write_bool_column(row, "leader", > db->db->is_relay ? false : ovsdb_storage_is_leader(db->db->storage)); > ovsdb_util_write_uuid_column(row, "cid", > diff --git a/ovsdb/relay.c b/ovsdb/relay.c > index df9906bda..fb16ce35c 100644 > --- a/ovsdb/relay.c > +++ b/ovsdb/relay.c > @@ -31,6 +31,7 @@ > #include "ovsdb-error.h" > #include "row.h" > #include "table.h" > +#include "timeval.h" > #include "transaction.h" > #include "transaction-forward.h" > #include "util.h" > @@ -47,8 +48,36 @@ struct relay_ctx { > struct ovsdb_schema *new_schema; > schema_change_callback schema_change_cb; > void *schema_change_aux; > + > + long long int last_connected; > }; > > +#define RELAY_MAX_RECONNECTION_MS 30000 > + > +/* Reports if the database is connected to the relay source and functional, > + * i.e. it actively monitors the source and is able to forward transactions. > */ > +bool > +ovsdb_relay_is_connected(struct ovsdb *db) > +{ > + struct relay_ctx *ctx = shash_find_data(&relay_dbs, db->name); > + > + if (!ctx || !ovsdb_cs_is_alive(ctx->cs)) { > + return false; > + } > + > + if (ovsdb_cs_may_send_transaction(ctx->cs)) { > + return true; > + } > + > + /* Trying to avoid connection state flapping by delaying report for > + * upper layer and giving ovsdb-cs some time to reconnect. */ > + if (time_msec() - ctx->last_connected < RELAY_MAX_RECONNECTION_MS) { > + return true; > + } > + > + return false; > +} > + > static struct json * > ovsdb_relay_compose_monitor_request(const struct json *schema_json, void > *ctx_) > { > @@ -119,6 +148,7 @@ ovsdb_relay_add_db(struct ovsdb *db, const char *remote, > ctx->schema_change_aux = schema_change_aux; > ctx->db = db; > ctx->cs = ovsdb_cs_create(db->name, 3, &relay_cs_ops, ctx); > + ctx->last_connected = 0; > shash_add(&relay_dbs, db->name, ctx); > ovsdb_cs_set_leader_only(ctx->cs, false); > ovsdb_cs_set_remote(ctx->cs, remote, true); > @@ -306,6 +336,10 @@ ovsdb_relay_run(void) > ovsdb_txn_forward_run(ctx->db, ctx->cs); > ovsdb_cs_run(ctx->cs, &events); > > + if (ovsdb_cs_may_send_transaction(ctx->cs)) { > + ctx->last_connected = time_msec(); > + } > + > struct ovsdb_cs_event *event; > LIST_FOR_EACH_POP (event, list_node, &events) { > if (!ctx->db) { > diff --git a/ovsdb/relay.h b/ovsdb/relay.h > index 68586e9db..390ea70c8 100644 > --- a/ovsdb/relay.h > +++ b/ovsdb/relay.h > @@ -17,6 +17,8 @@ > #ifndef OVSDB_RELAY_H > #define OVSDB_RELAY_H 1 > > +#include <stdbool.h> > + > struct json; > struct ovsdb; > struct ovsdb_schema; > @@ -31,4 +33,6 @@ void ovsdb_relay_del_db(struct ovsdb *); > void ovsdb_relay_run(void); > void ovsdb_relay_wait(void); > > +bool ovsdb_relay_is_connected(struct ovsdb *); > + > #endif /* OVSDB_RELAY_H */ >
Acked-by: Mark D. Gray <[email protected]> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
