[Pvfs2-cvs] commit by slang in pvfs2/src/io/trove/trove-dbpf: dbpf-keyval.c dbpf.h

CVS commit program cvs at parl.clemson.edu
Thu Jan 24 16:34:37 EST 2008


Update of /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf
In directory parlweb1:/tmp/cvs-serv5668/src/io/trove/trove-dbpf

Modified Files:
      Tag: small-file-branch
	dbpf-keyval.c dbpf.h 
Log Message:
inode stuffing operation.  also added a keyval_remove_list.


Index: dbpf-keyval.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf-keyval.c,v
diff -p -u -r1.85 -r1.85.6.1
--- dbpf-keyval.c	8 Nov 2007 21:48:22 -0000	1.85
+++ dbpf-keyval.c	24 Jan 2008 21:34:37 -0000	1.85.6.1
@@ -119,6 +119,7 @@ static int dbpf_keyval_read_list_op_svc(
 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_remove_list_op_svc(struct dbpf_op *op_p);
 static int dbpf_keyval_iterate_op_svc(struct dbpf_op *op_p);
 static int dbpf_keyval_iterate_keys_op_svc(struct dbpf_op *op_p);
 static int dbpf_keyval_flush_op_svc(struct dbpf_op *op_p);
@@ -589,6 +590,131 @@ return_error:
     return ret;
 }
 
+static int dbpf_keyval_remove_list(TROVE_coll_id coll_id,
+                                  TROVE_handle handle,
+                                  TROVE_keyval_s *key_array,
+                                  TROVE_keyval_s *val_array,
+                                  int *error_array,
+                                  int count,
+                                  TROVE_ds_flags flags,
+                                  TROVE_vtag_s *vtag,
+                                  void *user_ptr,
+                                  TROVE_context_id context_id,
+                                  TROVE_op_id *out_op_id_p)
+{
+    dbpf_queued_op_t *q_op_p = NULL;
+    struct dbpf_op op;
+    struct dbpf_op *op_p;
+    struct dbpf_collection *coll_p = NULL;
+    int ret;
+
+    coll_p = dbpf_collection_find_registered(coll_id);
+    if (coll_p == NULL)
+    {
+        return -TROVE_EINVAL;
+    }
+
+    ret = dbpf_op_init_queued_or_immediate(
+        &op, &q_op_p,
+        KEYVAL_WRITE_LIST,
+        coll_p,
+        handle,
+        dbpf_keyval_remove_list_op_svc,
+        flags,
+        NULL,
+        user_ptr,
+        context_id,
+        &op_p);
+    if(ret < 0)
+    {
+        return ret;
+    }
+
+   /* initialize the op-specific members */
+    op_p->u.k_remove_list.key_array = key_array;
+    op_p->u.k_remove_list.val_array = val_array;
+    op_p->u.k_remove_list.error_array = error_array;
+    op_p->u.k_remove_list.count = count;
+
+    PINT_perf_count(PINT_server_pc, PINT_PERF_METADATA_KEYVAL_OPS,
+                    1, PINT_PERF_ADD);
+
+    return dbpf_queue_or_service(op_p, q_op_p, coll_p, out_op_id_p);
+}
+
+static int dbpf_keyval_remove_list_op_svc(struct dbpf_op *op_p)
+{
+    int ret = -TROVE_EINVAL;
+    DBT key, data;
+    int k;
+    TROVE_keyval_handle_info info;
+    struct dbpf_keyval_db_entry key_entry;
+    int remove_count = 0;
+
+    /* read each key to see if it is present */
+    for (k = 0; k < op_p->u.k_remove_list.count; k++)
+    {
+        ret = dbpf_keyval_do_remove(op_p->coll_p->keyval_db,
+                                    op_p->handle,
+                                    &op_p->u.k_remove_list.key_array[k],
+                                    &op_p->u.k_remove_list.val_array[k]);
+        if(ret != 0)
+        {
+            op_p->u.k_remove_list.error_array[k] = ret;
+        }
+        else
+        {
+            remove_count++;
+        }
+    }
+
+    if(op_p->flags & TROVE_KEYVAL_HANDLE_COUNT)
+    {
+        key_entry.handle = op_p->handle;
+        memset(&key, 0, sizeof(key));
+        memset(&data, 0, sizeof(data));
+        key.flags = DB_DBT_USERMEM;
+        key.data = &key_entry;
+        key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(0);
+        data.data = &info;
+        data.ulen = sizeof(TROVE_keyval_handle_info);
+        data.flags = DB_DBT_USERMEM;
+
+        ret = op_p->coll_p->keyval_db->get(
+            op_p->coll_p->keyval_db, NULL, &key, &data, 0);
+        if(ret == DB_NOTFOUND)
+        {
+            /* doesn't exist yet so we can set to 0 */
+            memset(&info, 0, sizeof(TROVE_keyval_handle_info));
+            data.size = sizeof(TROVE_keyval_handle_info);
+        }
+        else if(ret != 0)
+        {
+            op_p->coll_p->keyval_db->err(
+                op_p->coll_p->keyval_db, ret, "DB->get");
+            return -dbpf_db_error_to_trove_error(ret);
+        }
+
+        info.count -= remove_count;
+
+        ret = op_p->coll_p->keyval_db->put(
+            op_p->coll_p->keyval_db, NULL, &key, &data, 0);
+        if(ret != 0)
+        {
+            op_p->coll_p->keyval_db->err(
+                op_p->coll_p->keyval_db, ret, 
+                "keyval_db->put keyval handle info ops");
+            return -dbpf_db_error_to_trove_error(ret);
+        }
+    }
+
+    ret = DBPF_OP_COMPLETE;
+    PINT_perf_count(PINT_server_pc, PINT_PERF_METADATA_KEYVAL_OPS,
+                    1, PINT_PERF_SUB);
+
+    return ret;
+}
+
 static int dbpf_keyval_validate(TROVE_coll_id coll_id,
                                 TROVE_handle handle,
                                 TROVE_ds_flags flags,
@@ -1862,6 +1988,7 @@ struct TROVE_keyval_ops dbpf_keyval_ops 
     dbpf_keyval_read,
     dbpf_keyval_write,
     dbpf_keyval_remove,
+    dbpf_keyval_remove_list,
     dbpf_keyval_validate,
     dbpf_keyval_iterate,
     dbpf_keyval_iterate_keys,

Index: dbpf.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf.h,v
diff -p -u -r1.83 -r1.83.2.1
--- dbpf.h	18 Jan 2008 18:41:13 -0000	1.83
+++ dbpf.h	24 Jan 2008 21:34:37 -0000	1.83.2.1
@@ -312,6 +312,14 @@ struct dbpf_keyval_remove_op
     /* vtag? */
 };
 
+struct dbpf_keyval_remove_list_op
+{
+    TROVE_keyval_s *key_array;
+    TROVE_keyval_s *val_array;
+    int *error_array;
+    int count; /* TODO: MAKE INOUT? */
+};
+
 struct dbpf_keyval_iterate_op
 {
     TROVE_keyval_s *key_array;
@@ -519,6 +527,7 @@ struct dbpf_op
         struct dbpf_keyval_iterate_keys_op k_iterate_keys;
         struct dbpf_keyval_read_list_op k_read_list;
         struct dbpf_keyval_read_list_op k_write_list;
+        struct dbpf_keyval_remove_list_op k_remove_list;
         struct dbpf_dspace_getattr_list_op d_getattr_list;
         struct dbpf_keyval_get_handle_info_op k_get_handle_info;
     } u;



More information about the Pvfs2-cvs mailing list