[ovs-dev] [db-backup 2/5] ovsdb: New function ovsdb_file_read_schema() for reading schema from db.

Ethan Jackson ethan at nicira.com
Mon Feb 14 22:29:33 UTC 2011


Looks Good.

On Tue, Feb 8, 2011 at 4:00 PM, Ben Pfaff <blp at nicira.com> wrote:
> This new function saves reading the whole database when only the schema is
> of interest.  This commit adapts ovsdb-tool to use it for the "db-version"
> command.  Upcoming commits will introduce another caller.
> ---
>  ovsdb/file.c       |   86 ++++++++++++++++++++++++++++++++++++++++------------
>  ovsdb/file.h       |    6 +++-
>  ovsdb/ovsdb-tool.c |   10 +++---
>  3 files changed, 76 insertions(+), 26 deletions(-)
>
> diff --git a/ovsdb/file.c b/ovsdb/file.c
> index d09395c..a02b651 100644
> --- a/ovsdb/file.c
> +++ b/ovsdb/file.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010 Nicira Networks
> +/* Copyright (c) 2009, 2010, 2011 Nicira Networks
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -121,24 +121,16 @@ ovsdb_file_open_as_schema(const char *file_name,
>  }
>
>  static struct ovsdb_error *
> -ovsdb_file_open__(const char *file_name,
> -                  const struct ovsdb_schema *alternate_schema,
> -                  bool read_only, struct ovsdb **dbp,
> -                  struct ovsdb_file **filep)
> +ovsdb_file_open_log(const char *file_name, enum ovsdb_log_open_mode open_mode,
> +                    struct ovsdb_log **logp, struct ovsdb_schema **schemap)
>  {
> -    enum ovsdb_log_open_mode open_mode;
> -    long long int oldest_commit;
> -    unsigned int n_transactions;
>     struct ovsdb_schema *schema = NULL;
> -    struct ovsdb_error *error;
>     struct ovsdb_log *log = NULL;
> -    struct json *json;
> -    struct ovsdb *db = NULL;
> +    struct ovsdb_error *error;
> +    struct json *json = NULL;
>
> -    /* In read-only mode there is no ovsdb_file so 'filep' must be null. */
> -    assert(!(read_only && filep));
> +    assert(logp || schemap);
>
> -    open_mode = read_only ? OVSDB_LOG_READ_ONLY : OVSDB_LOG_READ_WRITE;
>     error = ovsdb_log_open(file_name, open_mode, -1, &log);
>     if (error) {
>         goto error;
> @@ -153,9 +145,7 @@ ovsdb_file_open__(const char *file_name,
>         goto error;
>     }
>
> -    if (alternate_schema) {
> -        schema = ovsdb_schema_clone(alternate_schema);
> -    } else {
> +    if (schemap) {
>         error = ovsdb_schema_from_json(json, &schema);
>         if (error) {
>             json_destroy(json);
> @@ -167,8 +157,54 @@ ovsdb_file_open__(const char *file_name,
>     }
>     json_destroy(json);
>
> -    db = ovsdb_create(schema);
> -    schema = NULL;
> +    if (logp) {
> +        *logp = log;
> +    } else {
> +        ovsdb_log_close(log);
> +    }
> +    if (schemap) {
> +        *schemap = schema;
> +    }
> +    return NULL;
> +
> +error:
> +    ovsdb_log_close(log);
> +    json_destroy(json);
> +    if (logp) {
> +        *logp = NULL;
> +    }
> +    if (schemap) {
> +        *schemap = NULL;
> +    }
> +    return error;
> +}
> +
> +static struct ovsdb_error *
> +ovsdb_file_open__(const char *file_name,
> +                  const struct ovsdb_schema *alternate_schema,
> +                  bool read_only, struct ovsdb **dbp,
> +                  struct ovsdb_file **filep)
> +{
> +    enum ovsdb_log_open_mode open_mode;
> +    long long int oldest_commit;
> +    unsigned int n_transactions;
> +    struct ovsdb_schema *schema = NULL;
> +    struct ovsdb_error *error;
> +    struct ovsdb_log *log;
> +    struct json *json;
> +    struct ovsdb *db = NULL;
> +
> +    /* In read-only mode there is no ovsdb_file so 'filep' must be null. */
> +    assert(!(read_only && filep));
> +
> +    open_mode = read_only ? OVSDB_LOG_READ_ONLY : OVSDB_LOG_READ_WRITE;
> +    error = ovsdb_file_open_log(file_name, open_mode, &log,
> +                                alternate_schema ? NULL : &schema);
> +    if (error) {
> +        goto error;
> +    }
> +
> +    db = ovsdb_create(schema ? schema : ovsdb_schema_clone(alternate_schema));
>
>     oldest_commit = LLONG_MAX;
>     n_transactions = 0;
> @@ -225,7 +261,6 @@ error:
>         *filep = NULL;
>     }
>     ovsdb_destroy(db);
> -    ovsdb_schema_destroy(schema);
>     ovsdb_log_close(log);
>     return error;
>  }
> @@ -460,6 +495,17 @@ ovsdb_file_save_copy(const char *file_name, int locking,
>  {
>     return ovsdb_file_save_copy__(file_name, locking, comment, db, NULL);
>  }
> +
> +/* Opens database 'file_name', reads its schema, and closes it.  On success,
> + * stores the schema into '*schemap' and returns NULL; the caller then owns the
> + * schema.  On failure, returns an ovsdb_error (which the caller must destroy)
> + * and sets '*dbp' to NULL. */
> +struct ovsdb_error *
> +ovsdb_file_read_schema(const char *file_name, struct ovsdb_schema **schemap)
> +{
> +    assert(schemap != NULL);
> +    return ovsdb_file_open_log(file_name, OVSDB_LOG_READ_ONLY, NULL, schemap);
> +}
>
>  /* Replica implementation. */
>
> diff --git a/ovsdb/file.h b/ovsdb/file.h
> index b28c318..19d51c0 100644
> --- a/ovsdb/file.h
> +++ b/ovsdb/file.h
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010 Nicira Networks
> +/* Copyright (c) 2009, 2010, 2011 Nicira Networks
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -40,4 +40,8 @@ struct ovsdb_error *ovsdb_file_save_copy(const char *file_name, int locking,
>
>  struct ovsdb_error *ovsdb_file_compact(struct ovsdb_file *);
>
> +struct ovsdb_error *ovsdb_file_read_schema(const char *file_name,
> +                                           struct ovsdb_schema **)
> +    WARN_UNUSED_RESULT;
> +
>  #endif /* ovsdb/file.h */
> diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
> index 130e737..2e134ce 100644
> --- a/ovsdb/ovsdb-tool.c
> +++ b/ovsdb/ovsdb-tool.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2009, 2010 Nicira Networks.
> + * Copyright (c) 2009, 2010, 2011 Nicira Networks.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -245,11 +245,11 @@ static void
>  do_db_version(int argc OVS_UNUSED, char *argv[])
>  {
>     const char *db_file_name = argv[1];
> -    struct ovsdb *db;
> +    struct ovsdb_schema *schema;
>
> -    check_ovsdb_error(ovsdb_file_open(db_file_name, true, &db, NULL));
> -    puts(db->schema->version);
> -    ovsdb_destroy(db);
> +    check_ovsdb_error(ovsdb_file_read_schema(db_file_name, &schema));
> +    puts(schema->version);
> +    ovsdb_schema_destroy(schema);
>  }
>
>  static void
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
>




More information about the dev mailing list