[ovs-dev] [PATCH] ovsdb: Add unixctl command to show storage status.

Han Zhou hzhou at ovn.org
Wed Aug 5 22:03:37 UTC 2020


On Mon, Aug 3, 2020 at 8:05 AM Dumitru Ceara <dceara at redhat.com> wrote:
>
> If a database enters an error state, e.g., in case of RAFT when reading
> the DB file contents if applying the RAFT records triggers constraint
> violations, there's no way to determine this unless a client generates a
> write transaction. Such write transactions would fail with "ovsdb-error:
> inconsistent data".
>
> This commit adds a new command to show the status of the storage that's
> backing a database.
>
> Example, on an inconsistent database:
> $ ovs-appctl -t /tmp/test.ctl ovsdb-server/get-db-storage-status DB
> status: ovsdb error: inconsistent data
>
> Example, on a consistent database:
> $ ovs-appctl -t /tmp/test.ctl ovsdb-server/get-db-storage-status DB
> status: ok
>
> Signed-off-by: Dumitru Ceara <dceara at redhat.com>
> ---
>  ovsdb/ovsdb-server.c | 39 +++++++++++++++++++++++++++++++++++++++
>  ovsdb/storage.c      | 10 ++++++++++
>  ovsdb/storage.h      |  1 +
>  3 files changed, 50 insertions(+)
>
> diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
> index ef4e996..52107f0 100644
> --- a/ovsdb/ovsdb-server.c
> +++ b/ovsdb/ovsdb-server.c
> @@ -90,6 +90,7 @@ static unixctl_cb_func
ovsdb_server_set_active_ovsdb_server_probe_interval;
>  static unixctl_cb_func ovsdb_server_set_sync_exclude_tables;
>  static unixctl_cb_func ovsdb_server_get_sync_exclude_tables;
>  static unixctl_cb_func ovsdb_server_get_sync_status;
> +static unixctl_cb_func ovsdb_server_get_db_storage_status;
>
>  struct server_config {
>      struct sset *remotes;
> @@ -453,6 +454,9 @@ main(int argc, char *argv[])
>      unixctl_command_register("ovsdb-server/sync-status", "",
>                               0, 0, ovsdb_server_get_sync_status,
>                               &server_config);
> +    unixctl_command_register("ovsdb-server/get-db-storage-status", "DB",
1, 1,
> +                             ovsdb_server_get_db_storage_status,
> +                             &server_config);
>
>      /* Simulate the behavior of OVS release prior to version 2.5 that
>       * does not support the monitor_cond method.  */
> @@ -1697,6 +1701,41 @@ ovsdb_server_get_sync_status(struct unixctl_conn
*conn, int argc OVS_UNUSED,
>  }
>
>  static void
> +ovsdb_server_get_db_storage_status(struct unixctl_conn *conn,
> +                                   int argc OVS_UNUSED,
> +                                   const char *argv[],
> +                                   void *config_)
> +{
> +    struct server_config *config = config_;
> +    struct shash_node *node;
> +
> +    node = shash_find(config->all_dbs, argv[1]);
> +    if (!node) {
> +        unixctl_command_reply_error(conn, "Failed to find the
database.");
> +        return;
> +    }
> +
> +    struct db *db = node->data;
> +
> +    if (!db->db) {
> +        unixctl_command_reply_error(conn, "Failed to find the
database.");
> +        return;
> +    }
> +
> +    struct ds ds = DS_EMPTY_INITIALIZER;
> +    char *error = ovsdb_storage_get_error(db->db->storage);
> +
> +    if (!error) {
> +        ds_put_cstr(&ds, "status: ok");
> +    } else {
> +        ds_put_format(&ds, "status: %s", error);
> +        free(error);
> +    }
> +    unixctl_command_reply(conn, ds_cstr(&ds));
> +    ds_destroy(&ds);
> +}
> +
> +static void
>  parse_options(int argc, char *argv[],
>                struct sset *db_filenames, struct sset *remotes,
>                char **unixctl_pathp, char **run_command,
> diff --git a/ovsdb/storage.c b/ovsdb/storage.c
> index 7b4ad16..f662e90 100644
> --- a/ovsdb/storage.c
> +++ b/ovsdb/storage.c
> @@ -198,6 +198,16 @@ ovsdb_storage_get_memory_usage(const struct
ovsdb_storage *storage,
>      }
>  }
>
> +char *
> +ovsdb_storage_get_error(const struct ovsdb_storage *storage)
> +{
> +    if (storage->error) {
> +        return ovsdb_error_to_string(storage->error);
> +    }
> +
> +    return NULL;
> +}
> +
>  void
>  ovsdb_storage_run(struct ovsdb_storage *storage)
>  {
> diff --git a/ovsdb/storage.h b/ovsdb/storage.h
> index a223968..02b6e7e 100644
> --- a/ovsdb/storage.h
> +++ b/ovsdb/storage.h
> @@ -42,6 +42,7 @@ const struct uuid *ovsdb_storage_get_sid(const struct
ovsdb_storage *);
>  uint64_t ovsdb_storage_get_applied_index(const struct ovsdb_storage *);
>  void ovsdb_storage_get_memory_usage(const struct ovsdb_storage *,
>                                      struct simap *usage);
> +char *ovsdb_storage_get_error(const struct ovsdb_storage *);
>
>  void ovsdb_storage_run(struct ovsdb_storage *);
>  void ovsdb_storage_wait(struct ovsdb_storage *);
> --
> 1.8.3.1
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Thanks Dumitru!
Acked-by: Han Zhou <hzhou at ovn.org>


More information about the dev mailing list