[PVFS2-CVS]
commit by walt in pvfs2-1/src/io/trove/trove-dbpf: dbpf-keyval.c
dbpf.h
CVS commit program
cvs at parl.clemson.edu
Fri Jul 15 17:34:00 EDT 2005
Update of /projects/cvsroot/pvfs2-1/src/io/trove/trove-dbpf
In directory parlweb:/tmp/cvs-serv13826/src/io/trove/trove-dbpf
Modified Files:
Tag: WALT2
dbpf-keyval.c dbpf.h
Log Message:
everything works in get/set eattr and get/set eattr-list
Index: dbpf-keyval.c
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/io/trove/trove-dbpf/dbpf-keyval.c,v
diff -p -u -r1.48.12.1 -r1.48.12.2
--- dbpf-keyval.c 16 Jun 2005 23:50:09 -0000 1.48.12.1
+++ dbpf-keyval.c 15 Jul 2005 20:33:59 -0000 1.48.12.2
@@ -35,6 +35,7 @@
static int dbpf_keyval_read_op_svc(struct dbpf_op *op_p);
static int dbpf_keyval_read_list_op_svc(struct dbpf_op *op_p);
static int dbpf_keyval_write_op_svc(struct dbpf_op *op_p);
+static int dbpf_keyval_write_list_op_svc(struct dbpf_op *op_p);
static int dbpf_keyval_remove_op_svc(struct dbpf_op *op_p);
static int dbpf_keyval_iterate_op_svc(struct dbpf_op *op_p);
static int dbpf_keyval_flush_op_svc(struct dbpf_op *op_p);
@@ -837,7 +838,148 @@ static int dbpf_keyval_write_list(TROVE_
TROVE_context_id context_id,
TROVE_op_id *out_op_id_p)
{
- return -TROVE_ENOSYS;
+ dbpf_queued_op_t *q_op_p = NULL;
+ struct dbpf_collection *coll_p = NULL;
+
+ coll_p = dbpf_collection_find_registered(coll_id);
+ if (coll_p == NULL)
+ {
+ return -TROVE_EINVAL;
+ }
+ q_op_p = dbpf_queued_op_alloc();
+ if (q_op_p == NULL)
+ {
+ return -TROVE_ENOMEM;
+ }
+
+ /* initialize all the common members */
+ dbpf_queued_op_init(q_op_p,
+ KEYVAL_WRITE_LIST,
+ handle,
+ coll_p,
+ dbpf_keyval_write_list_op_svc,
+ user_ptr,
+ flags,
+ context_id);
+
+ /* initialize the op-specific members */
+ q_op_p->op.u.k_write_list.key_array = key_array;
+ q_op_p->op.u.k_write_list.val_array = val_array;
+ q_op_p->op.u.k_write_list.count = count;
+
+ *out_op_id_p = dbpf_queued_op_queue(q_op_p);
+
+ return 0;
+}
+
+static int dbpf_keyval_write_list_op_svc(struct dbpf_op *op_p)
+{
+ int ret = -TROVE_EINVAL, got_db = 0;
+ struct open_cache_ref tmp_ref;
+ DBT key, data;
+ dbpf_attr_cache_elem_t *cache_elem = NULL;
+ TROVE_object_ref ref = {op_p->handle, op_p->coll_p->coll_id};
+ TROVE_size k_size;
+ DB_BTREE_STAT *k_stat_p = NULL;
+ int k;
+
+ ret = dbpf_open_cache_get(
+ op_p->coll_p->coll_id, op_p->handle, 1, DBPF_OPEN_DB, &tmp_ref);
+ if (ret < 0)
+ {
+ goto return_error;
+ }
+ else
+ {
+ got_db = 1;
+ }
+
+ for (k = 0; k < op_p->u.k_write_list.count; k++)
+ {
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ key.data = op_p->u.k_write_list.key_array[k].buffer;
+ key.size = op_p->u.k_write_list.key_array[k].buffer_sz;
+ data.data = op_p->u.k_write_list.val_array[k].buffer;
+ data.size = op_p->u.k_write_list.val_array[k].buffer_sz;
+
+ ret = tmp_ref.db_p->put(tmp_ref.db_p, NULL, &key, &data, 0);
+ if (ret != 0)
+ {
+ tmp_ref.db_p->err(tmp_ref.db_p, ret, "DB->put");
+ ret = -dbpf_db_error_to_trove_error(ret);
+ goto return_error;
+ }
+
+ gossip_debug(GOSSIP_DBPF_ATTRCACHE_DEBUG, "*** Trove KeyVal Write "
+ "of %s\n", (char *)op_p->u.k_write_list.key_array[k].buffer);
+
+ /*
+ now that the data is written to disk, update the cache if it's
+ an attr keyval we manage.
+ */
+ cache_elem = dbpf_attr_cache_elem_lookup(ref);
+ if (cache_elem)
+ {
+ if (dbpf_attr_cache_elem_set_data_based_on_key(
+ ref, op_p->u.k_write_list.key_array[k].buffer,
+ op_p->u.k_write_list.val_array[k].buffer, data.size))
+ {
+ /*
+ NOTE: this can happen if the keyword isn't registered,
+ or if there is no associated cache_elem for this key
+ */
+ gossip_debug(
+ GOSSIP_DBPF_ATTRCACHE_DEBUG,"** CANNOT cache data written "
+ "(key is %s)\n", (char *)op_p->u.k_write_list.key_array[k].buffer);
+ }
+ else
+ {
+ gossip_debug(
+ GOSSIP_DBPF_ATTRCACHE_DEBUG,"*** cached keyval data "
+ "written (key is %s)\n",
+ (char *)op_p->u.k_write_list.key_array[k].buffer);
+ }
+ }
+ }
+
+ /* this may have increased the number of keyvals stored in this
+ * object; update the k_size in the cache
+ */
+ ret = tmp_ref.db_p->stat(tmp_ref.db_p,
+#ifdef HAVE_TXNID_PARAMETER_TO_DB_STAT
+ (DB_TXN *) NULL,
+#endif
+ &k_stat_p,
+#ifdef HAVE_UNKNOWN_PARAMETER_TO_DB_STAT
+ NULL,
+#endif
+ 0);
+ if (ret == 0)
+ {
+ k_size = (TROVE_size)k_stat_p->bt_ndata;
+ free(k_stat_p);
+
+ dbpf_attr_cache_ds_attr_update_cached_data_ksize(ref, k_size);
+ }
+ else
+ {
+ tmp_ref.db_p->err(tmp_ref.db_p, ret, "DB->stat");
+ ret = -dbpf_db_error_to_trove_error(ret);
+ goto return_error;
+ }
+
+ DBPF_DB_SYNC_IF_NECESSARY(op_p, tmp_ref.db_p);
+
+ dbpf_open_cache_put(&tmp_ref);
+ return 1;
+
+ return_error:
+ if (got_db)
+ {
+ dbpf_open_cache_put(&tmp_ref);
+ }
+ return ret;
}
static int dbpf_keyval_flush(TROVE_coll_id coll_id,
Index: dbpf.h
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/io/trove/trove-dbpf/dbpf.h,v
diff -p -u -r1.54.12.1 -r1.54.12.2
--- dbpf.h 16 Jun 2005 23:50:09 -0000 1.54.12.1
+++ dbpf.h 15 Jul 2005 20:33:59 -0000 1.54.12.2
@@ -221,6 +221,13 @@ struct dbpf_keyval_write_op
/* vtag? */
};
+struct dbpf_keyval_write_list_op
+{
+ TROVE_keyval_s *key_array;
+ TROVE_keyval_s *val_array;
+ int count; /* TODO: MAKE INOUT? */
+};
+
struct dbpf_keyval_remove_op
{
TROVE_keyval_s key;
@@ -373,6 +380,7 @@ struct dbpf_op
struct dbpf_keyval_remove_op k_remove;
struct dbpf_keyval_iterate_op k_iterate;
struct dbpf_keyval_read_list_op k_read_list;
+ struct dbpf_keyval_read_list_op k_write_list;
} u;
};
More information about the PVFS2-CVS
mailing list