[ovs-dev] [PATCH v2 7/9] ovsdb: relay: Reflect connection status in _Server database.
Mark Gray
mark.d.gray at redhat.com
Fri Jul 2 10:48:53 UTC 2021
On 12/06/2021 03:00, 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.
Yeah this makes sense. I guess there are some deployment scenarios we
should think about. For example:
* Are there any special considerations for upgrades? The relays seem to
be quite ephemeral and could be stopped/started without much risk?
* What about raft leader elections?
* I suppose there is a risk that inconsistencies could build up between
relays in case of error?
* Everything will be eventually consistent but I guess that is OK for OVN.
I don't know a whole lot about this so I am just prompting you to see
have you considered these?
>
> Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
> ---
> 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 414be6715..b4606b25b 100644
> --- a/ovsdb/_server.xml
> +++ b/ovsdb/_server.xml
> @@ -70,6 +70,15 @@
> case of a relay database - until it connects to the relay 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
> @@ -77,14 +86,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. Always false for relay.
> diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
> index 77b1fbe40..cdd6cf7fd 100644
> --- a/ovsdb/ovsdb-server.c
> +++ b/ovsdb/ovsdb-server.c
> @@ -1190,7 +1190,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 ef689c649..4a8f5c206 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 connected to the relay source and functional, i.e.
s/database connected/database is connected/
> + * 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_)
> {
> @@ -118,6 +147,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);
> @@ -302,6 +332,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 */
>
More information about the dev
mailing list