[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 07/11] tools/xenstore: add wrapper for tdb_fetch()



Add a wrapper function for tdb_fetch taking the name of the node in
the data base as a parameter. Let it return a data pointer and the
length of the data via a length pointer provided as additional
parameter.

This enables to make set_tdb_key() static again.

This is in preparation to replace TDB with a more simple data storage.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 tools/xenstore/xenstored_core.c        | 55 ++++++++++++++++----------
 tools/xenstore/xenstored_core.h        |  3 +-
 tools/xenstore/xenstored_transaction.c | 34 ++++++++--------
 3 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 522b2bbf5f..12c584f09b 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -85,7 +85,7 @@ bool keep_orphans = false;
 static int reopen_log_pipe[2];
 static int reopen_log_pipe0_pollfd_idx = -1;
 char *tracefile = NULL;
-TDB_CONTEXT *tdb_ctx = NULL;
+static TDB_CONTEXT *tdb_ctx = NULL;
 unsigned int trace_flags = TRACE_OBJ | TRACE_IO;
 
 static const char *sockmsg_string(enum xsd_sockmsg_type type);
@@ -556,7 +556,7 @@ static void initialize_fds(int *p_sock_pollfd_idx, int 
*ptimeout)
        }
 }
 
-void set_tdb_key(const char *name, TDB_DATA *key)
+static void set_tdb_key(const char *name, TDB_DATA *key)
 {
        /*
         * Dropping const is fine here, as the key will never be modified
@@ -566,25 +566,39 @@ void set_tdb_key(const char *name, TDB_DATA *key)
        key->dsize = strlen(name);
 }
 
+void *db_fetch(const char *db_name, size_t *size)
+{
+       TDB_DATA key, data;
+
+       set_tdb_key(db_name, &key);
+       data = tdb_fetch(tdb_ctx, key);
+       if (!data.dptr)
+               errno = (tdb_error(tdb_ctx) == TDB_ERR_NOEXIST) ? ENOENT : EIO;
+       else
+               *size = data.dsize;
+
+       return data.dptr;
+}
+
 static void get_acc_data(const char *name, struct node_account_data *acc)
 {
-       TDB_DATA key, old_data;
+       void *old_data;
+       size_t size;
        struct xs_tdb_record_hdr *hdr;
 
        if (acc->memory < 0) {
-               set_tdb_key(name, &key);
-               old_data = tdb_fetch(tdb_ctx, key);
+               old_data = db_fetch(name, &size);
                /* No check for error, as the node might not exist. */
-               if (old_data.dptr == NULL) {
+               if (old_data == NULL) {
                        acc->memory = 0;
                } else {
                        trace_tdb("read %s size %zu\n", name,
-                                 old_data.dsize + key.dsize);
-                       hdr = (void *)old_data.dptr;
-                       acc->memory = old_data.dsize;
+                                 size + strlen(name));
+                       hdr = old_data;
+                       acc->memory = size;
                        acc->domid = hdr->perms[0].id;
                }
-               talloc_free(old_data.dptr);
+               talloc_free(old_data);
        }
 }
 
@@ -698,7 +712,8 @@ int db_delete(struct connection *conn, const char *name,
 struct node *read_node(struct connection *conn, const void *ctx,
                       const char *name)
 {
-       TDB_DATA key, data;
+       void *data;
+       size_t size;
        struct xs_tdb_record_hdr *hdr;
        struct node *node;
        const char *db_name;
@@ -717,29 +732,27 @@ struct node *read_node(struct connection *conn, const 
void *ctx,
        }
 
        db_name = transaction_prepend(conn, name);
-       set_tdb_key(db_name, &key);
+       data = db_fetch(db_name, &size);
 
-       data = tdb_fetch(tdb_ctx, key);
-
-       if (data.dptr == NULL) {
-               if (tdb_error(tdb_ctx) == TDB_ERR_NOEXIST) {
+       if (data == NULL) {
+               if (errno == ENOENT) {
                        node->generation = NO_GENERATION;
                        err = access_node(conn, node, NODE_ACCESS_READ, NULL);
                        errno = err ? : ENOENT;
                } else {
-                       log("TDB error on read: %s", tdb_errorstr(tdb_ctx));
+                       log("DB error on read: %s", strerror(errno));
                        errno = EIO;
                }
                goto error;
        }
 
-       trace_tdb("read %s size %zu\n", key.dptr, data.dsize + key.dsize);
+       trace_tdb("read %s size %zu\n", db_name, size + strlen(db_name));
 
        node->parent = NULL;
-       talloc_steal(node, data.dptr);
+       talloc_steal(node, data);
 
        /* Datalen, childlen, number of permissions */
-       hdr = (void *)data.dptr;
+       hdr = data;
        node->generation = hdr->generation;
        node->perms.num = hdr->num_perms;
        node->datalen = hdr->datalen;
@@ -748,7 +761,7 @@ struct node *read_node(struct connection *conn, const void 
*ctx,
        /* Permissions are struct xs_permissions. */
        node->perms.p = hdr->perms;
        node->acc.domid = get_node_owner(node);
-       node->acc.memory = data.dsize;
+       node->acc.memory = size;
        if (domain_adjust_node_perms(node))
                goto error;
 
diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h
index c4a995f745..e922dce775 100644
--- a/tools/xenstore/xenstored_core.h
+++ b/tools/xenstore/xenstored_core.h
@@ -310,7 +310,6 @@ do {                                                \
                trace("tdb: " __VA_ARGS__);     \
 } while (0)
 
-extern TDB_CONTEXT *tdb_ctx;
 extern int dom0_domid;
 extern int dom0_event;
 extern int priv_domid;
@@ -359,7 +358,7 @@ extern xengnttab_handle **xgt_handle;
 int remember_string(struct hashtable *hash, const char *str);
 
 /* Data base access functions. */
-void set_tdb_key(const char *name, TDB_DATA *key);
+void *db_fetch(const char *db_name, size_t *size);
 int db_write(struct connection *conn, const char *db_name, void *data,
             size_t size, struct node_account_data *acc, int flag,
             bool no_quota_check);
diff --git a/tools/xenstore/xenstored_transaction.c 
b/tools/xenstore/xenstored_transaction.c
index 029819e90c..c51edf432f 100644
--- a/tools/xenstore/xenstored_transaction.c
+++ b/tools/xenstore/xenstored_transaction.c
@@ -356,26 +356,26 @@ static int finalize_transaction(struct connection *conn,
                                struct transaction *trans, bool *is_corrupt)
 {
        struct accessed_node *i, *n;
-       TDB_DATA key, data;
+       void *data;
+       size_t size;
        struct xs_tdb_record_hdr *hdr;
        uint64_t gen;
        int flag;
 
        list_for_each_entry_safe(i, n, &trans->accessed, list) {
                if (i->check_gen) {
-                       set_tdb_key(i->node, &key);
-                       data = tdb_fetch(tdb_ctx, key);
-                       hdr = (void *)data.dptr;
-                       if (!data.dptr) {
-                               if (tdb_error(tdb_ctx) != TDB_ERR_NOEXIST)
-                                       return EIO;
+                       data = db_fetch(i->node, &size);
+                       hdr = data;
+                       if (!data) {
+                               if (errno != ENOENT)
+                                       return errno;
                                gen = NO_GENERATION;
                        } else {
                                trace_tdb("read %s size %zu\n", i->node,
-                                         key.dsize + data.dsize);
+                                         strlen(i->node) + size);
                                gen = hdr->generation;
                        }
-                       talloc_free(data.dptr);
+                       talloc_free(data);
                        if (i->generation != gen)
                                return EAGAIN;
                }
@@ -393,19 +393,17 @@ static int finalize_transaction(struct connection *conn,
 
        while ((i = list_top(&trans->accessed, struct accessed_node, list))) {
                if (i->ta_node) {
-                       set_tdb_key(i->trans_name, &key);
-                       data = tdb_fetch(tdb_ctx, key);
-                       if (data.dptr) {
+                       data = db_fetch(i->trans_name, &size);
+                       if (data) {
                                trace_tdb("read %s size %zu\n", i->trans_name,
-                                         key.dsize + data.dsize);
-                               hdr = (void *)data.dptr;
+                                         strlen(i->trans_name) + size);
+                               hdr = data;
                                hdr->generation = ++generation;
                                flag = (i->generation == NO_GENERATION)
                                       ? NODE_CREATE : NODE_MODIFY;
-                               *is_corrupt |= db_write(conn, i->node,
-                                                       data.dptr, data.dsize,
-                                                       NULL, flag, true);
-                               talloc_free(data.dptr);
+                               *is_corrupt |= db_write(conn, i->node, data,
+                                                       size, NULL, flag, true);
+                               talloc_free(data);
                                if (db_delete(conn, i->trans_name, NULL))
                                        *is_corrupt = true;
                        } else {
-- 
2.35.3




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.