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

Ilya Maximets i.maximets at ovn.org
Wed Sep 16 14:00:11 UTC 2020


On 8/6/20 12:03 AM, Han Zhou wrote:
> 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>

Thanks!

Applied to master.

Best regards, Ilya Maximets.


More information about the dev mailing list