X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fovsdb.c;h=4d5f1c5e5270b7267e8290ad4bde05cf99fdac71;hb=b93d3b6cb28a925f530aef2009602c06f2f5ae60;hp=e653758fd0a5975fef1daf4e51e2505d174bd3ba;hpb=f85f8ebbfac946c19b3c6eb0f4170f579d0a4d25;p=openvswitch diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c index e653758f..4d5f1c5e 100644 --- a/ovsdb/ovsdb.c +++ b/ovsdb/ovsdb.c @@ -17,18 +17,12 @@ #include "ovsdb.h" -#include - -#include "file.h" #include "json.h" #include "ovsdb-error.h" #include "ovsdb-parser.h" #include "table.h" #include "transaction.h" -#define THIS_MODULE VLM_ovsdb -#include "vlog.h" - struct ovsdb_schema * ovsdb_schema_create(const char *name, const char *comment) { @@ -153,14 +147,14 @@ ovsdb_schema_to_json(const struct ovsdb_schema *schema) } struct ovsdb * -ovsdb_create(struct ovsdb_file *file, struct ovsdb_schema *schema) +ovsdb_create(struct ovsdb_schema *schema) { struct shash_node *node; struct ovsdb *db; db = xmalloc(sizeof *db); db->schema = schema; - db->file = file; + list_init(&db->replicas); list_init(&db->triggers); db->run_triggers = false; @@ -173,71 +167,20 @@ ovsdb_create(struct ovsdb_file *file, struct ovsdb_schema *schema) return db; } -struct ovsdb_error * -ovsdb_open(const char *file_name, bool read_only, struct ovsdb **dbp) -{ - struct ovsdb_schema *schema; - struct ovsdb_error *error; - struct ovsdb_file *file; - struct json *json; - struct ovsdb *db; - - error = ovsdb_file_open(file_name, read_only ? O_RDONLY : O_RDWR, &file); - if (error) { - return error; - } - - error = ovsdb_file_read(file, &json); - if (error) { - return error; - } else if (!json) { - return ovsdb_io_error(EOF, "%s: database file contains no schema", - file_name); - } - - error = ovsdb_schema_from_json(json, &schema); - if (error) { - json_destroy(json); - return ovsdb_wrap_error(error, - "failed to parse \"%s\" as ovsdb schema", - file_name); - } - json_destroy(json); - - db = ovsdb_create(read_only ? file : NULL, schema); - while ((error = ovsdb_file_read(file, &json)) == NULL && json) { - struct ovsdb_txn *txn; - - error = ovsdb_txn_from_json(db, json, &txn); - json_destroy(json); - if (error) { - break; - } - - ovsdb_txn_commit(txn); - } - if (error) { - char *msg = ovsdb_error_to_string(error); - VLOG_WARN("%s", msg); - free(msg); - - ovsdb_error_destroy(error); - } - - if (read_only) { - ovsdb_file_close(file); - } - - *dbp = db; - return NULL; -} - void ovsdb_destroy(struct ovsdb *db) { if (db) { struct shash_node *node; + /* Remove all the replicas. */ + while (!list_is_empty(&db->replicas)) { + struct ovsdb_replica *r + = CONTAINER_OF(list_pop_back(&db->replicas), + struct ovsdb_replica, node); + ovsdb_remove_replica(db, r); + } + /* Delete all the tables. This also deletes their schemas. */ SHASH_FOR_EACH (node, &db->tables) { struct ovsdb_table *table = node->data; @@ -245,12 +188,12 @@ ovsdb_destroy(struct ovsdb *db) } shash_destroy(&db->tables); - /* Clear the schema's hash of table schemas. The schemas, but not the - * table that points to them, were deleted in the previous step. */ - shash_destroy(&db->schema->tables); + /* The schemas, but not the table that points to them, were deleted in + * the previous step, so we need to clear out the table. We can't + * destroy the table, because ovsdb_schema_destroy() will do that. */ + shash_clear(&db->schema->tables); ovsdb_schema_destroy(db->schema); - ovsdb_file_close(db->file); free(db); } } @@ -260,3 +203,23 @@ ovsdb_get_table(const struct ovsdb *db, const char *name) { return shash_find_data(&db->tables, name); } + +void +ovsdb_replica_init(struct ovsdb_replica *r, + const struct ovsdb_replica_class *class) +{ + r->class = class; +} + +void +ovsdb_add_replica(struct ovsdb *db, struct ovsdb_replica *r) +{ + list_push_back(&db->replicas, &r->node); +} + +void +ovsdb_remove_replica(struct ovsdb *db UNUSED, struct ovsdb_replica *r) +{ + list_remove(&r->node); + (r->class->destroy)(r); +}