[Pvfs2-cvs] commit by mtmoore in pvfs2/src/client/sysint: sys-get-value.sm

CVS commit program cvs at parl.clemson.edu
Tue Jul 14 13:24:52 EDT 2009


Update of /projects/cvsroot/pvfs2/src/client/sysint
In directory parlweb1:/tmp/cvs-serv2757/src/client/sysint

Added Files:
      Tag: Orange-mtmoore
	sys-get-value.sm 
Log Message:
Adding files supporting the attribute/value lookup implementation


--- /dev/null	2004-06-24 14:04:38.000000000 -0400
+++ sys-get-value.sm	2009-07-14 13:24:52.000000000 -0400
@@ -0,0 +1,301 @@
+/* 
+ * (C) 2003 Clemson University and The University of Chicago 
+ *
+ * See COPYING in top-level directory.
+ */
+
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include "client-state-machine.h"
+#include "pvfs2-debug.h"
+#include "pvfs2-util.h"
+#include "job.h"
+#include "gossip.h"
+#include "str-utils.h"
+#include "pint-cached-config.h"
+#include "PINT-reqproto-encode.h"
+#include "pvfs2-internal.h"
+
+struct dbpf_keyval_db_entry {
+    TROVE_handle handle;
+    char key[1024];
+};
+
+extern job_context_id pint_client_sm_context;
+
+static int get_value_comp_fn(
+    void *v_p,
+    struct PVFS_server_resp *resp_p,
+    int i);
+
+%%
+
+machine pvfs2_client_get_value_sm
+{
+    state setup_msgpair
+    {
+        run get_value_setup_msgpair;
+        success => xfer_msgpair;
+        default => cleanup;
+    }
+
+    state xfer_msgpair
+    {
+        jump pvfs2_msgpairarray_sm;
+        default => cleanup;
+    }
+
+    state cleanup
+    {
+        run get_value_cleanup;
+        default => terminate;
+    }
+}
+
+%%
+
+PVFS_error PVFS_isys_getvalue(
+        PVFS_object_ref ref,
+        PVFS_ds_position token,
+        const PVFS_credentials *credentials,
+        PVFS_dirent *dirent_p,
+        PVFS_ds_keyval *key_p,
+        PVFS_ds_keyval *val_p,
+        PVFS_sysresp_getvalue *resp_p,
+        PVFS_sys_op_id *op_id,
+        PVFS_hint hints,
+        void *user_ptr)
+{
+    int ret = -PVFS_EINVAL;
+    PINT_smcb *smcb = NULL;
+    PINT_client_sm *sm_p = NULL;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "[GETVALUE]: PVFS_isys_getvalue enter\n");
+    
+    if( ((ref.fs_id == PVFS_FS_ID_NULL) || (resp_p == NULL) ) )
+    {
+        gossip_err("[GETVALUE]: invalid required argument\n");
+        return ret;
+    }
+
+    PINT_smcb_alloc(&smcb, PVFS_SYS_GETVALUE,
+                    sizeof( struct PINT_client_sm ),
+                    client_op_state_get_machine,
+                    client_state_machine_terminate,
+                    pint_client_sm_context);
+    if( smcb == NULL )
+    {
+        return -PVFS_ENOMEM;
+    }
+
+    sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+
+    PINT_init_msgarray_params(sm_p, ref.fs_id);
+    PINT_init_sysint_credentials(sm_p->cred_p, credentials);
+    sm_p->u.getvalue.pos_token = token;
+    sm_p->u.getvalue.dirent_p = dirent_p;
+    sm_p->u.getvalue.key_p = key_p;
+    sm_p->u.getvalue.val_p = val_p;
+    sm_p->u.getvalue.resp_p = resp_p;
+    sm_p->error_code = 0;
+    sm_p->object_ref = ref;
+    PVFS_hint_copy(hints, &sm_p->hints);
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: PVFS_isys_getvalue: sm_p->u.getvalue: "
+                 "resp_p: %p, pos_token: %llu, key_p: %p, val_p: %p\n",  
+                 sm_p->u.getvalue.resp_p, sm_p->u.getvalue.pos_token, 
+                 sm_p->u.getvalue.val_p, sm_p->u.getvalue.key_p);
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "[GETVALUE]: PVFS_isys_getvalue exit\n");
+    return PINT_client_state_machine_post( smcb, op_id, user_ptr);
+}
+
+PVFS_error PVFS_sys_getvalue(
+        PVFS_object_ref ref,
+        PVFS_ds_position token,
+        const PVFS_credentials *credentials,
+        PVFS_dirent *dirent,
+        PVFS_ds_keyval *key,
+        PVFS_ds_keyval *val,
+        PVFS_sysresp_getvalue *resp_p,
+        PVFS_hint hints)
+{
+    PVFS_error ret = -PVFS_EINVAL, error = 0;
+    PVFS_sys_op_id op_id;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "[GETVALUE]: PVFS_sys_getvalue enter\n");
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: PVFS_sys_getvalue: resp_p: %p, pos_token: %llu, "
+                 "val: %p\n", resp_p, token, val);
+
+    if( resp_p == NULL )
+    {
+        ret = -EINVAL;
+        PVFS_perror_gossip("[GETVALUE]: resp_p is null\n", ret);
+        return ret;
+    }
+
+    ret = PVFS_isys_getvalue(ref, token, credentials, dirent, key, val, 
+                            resp_p, &op_id, hints, NULL);
+
+    if (ret)
+    {
+        PVFS_perror_gossip("PVFS_isys_getvalue call", ret);
+        error = ret;
+    }
+    else
+    {
+        ret = PVFS_sys_wait(op_id, "getvalue", &error);
+        if (ret)
+        {
+            PVFS_perror_gossip("PVFS_sys_wait call", ret);
+            error = ret;
+        }
+    }
+
+    PINT_sys_release(op_id);
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "[GETVALUE]: PVFS_sys_getvalue exit\n");
+    return error;
+}
+
+static PINT_sm_action get_value_setup_msgpair(
+        struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    int ret = -PVFS_EINVAL;
+    PINT_sm_msgpair_state *msg_p;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, 
+                 "[GETVALUE]: get_value_setup_msgpair enter, sm_p: %p\n",
+                sm_p);
+
+    PINT_msgpair_init(&sm_p->msgarray_op);
+    msg_p = &sm_p->msgarray_op.msgpair;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_setup_msgpair: prefill: id: %d, "
+                 "handle: %llu, pos_token: %llu, key_p: %p, val_p: %p,"
+                 "resp_p: %p, resp_p->key: %p\n",
+                 sm_p->object_ref.fs_id, sm_p->object_ref.handle, 
+                 sm_p->u.getvalue.pos_token, sm_p->u.getvalue.key_p,
+                 sm_p->u.getvalue.val_p, sm_p->u.getvalue.resp_p,
+                 sm_p->u.getvalue.resp_p->key);
+
+    PINT_SERVREQ_GETVALUE_FILL(
+        msg_p->req,
+        (*sm_p->cred_p),
+        sm_p->object_ref.fs_id,
+        sm_p->object_ref.handle,
+        sm_p->u.getvalue.pos_token,
+        (*sm_p->u.getvalue.key_p),
+        (*sm_p->u.getvalue.val_p),
+        sm_p->hints
+        );
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_setup_msgpair: postfill: id: %d, "
+                 "handle: %llu, pos_token: %llu, val_p: %p, val: %s\n",
+                 sm_p->object_ref.fs_id, sm_p->object_ref.handle, 
+                 sm_p->u.getvalue.pos_token, sm_p->u.getvalue.val_p,
+                 (char *)sm_p->u.getvalue.val_p->buffer);
+
+    msg_p->fs_id = sm_p->object_ref.fs_id;
+    msg_p->handle = sm_p->object_ref.handle;
+    msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
+    msg_p->comp_fn = get_value_comp_fn;
+
+    ret = PINT_cached_config_map_to_server(
+        &msg_p->svr_addr,
+        msg_p->handle,
+        msg_p->fs_id);
+
+    if (ret)
+    {
+        gossip_err("Failed to map meta server address\n");
+        js_p->error_code = 0;
+    }
+
+    PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op);
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, 
+                 "[GETVALUE]: get_value_setup_msgpair exit\n");
+    return SM_ACTION_COMPLETE;
+}
+
+static PINT_sm_action get_value_cleanup(
+        struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_cleanup enter\n");
+
+    sm_p->error_code  = js_p->error_code;
+
+    PINT_SET_OP_COMPLETE;
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_cleanup exit\n");
+   return SM_ACTION_TERMINATE;
+}
+
+static int get_value_comp_fn(
+    void *v_p,
+    struct PVFS_server_resp *resp_p,
+    int i)
+{
+    PINT_smcb *smcb = v_p;
+    PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
+    int ret=0;
+
+    assert(i==0);
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_comp_fn enter\n");
+    if( resp_p->status != 0 )
+    {
+        return resp_p->status;
+    }
+
+    if (sm_p->msgarray_op.msgarray[i].op_status != 0)
+    {
+      gossip_debug(GOSSIP_GETVALUE_DEBUG,
+                     "[GETVALUE]: msgarray op_status not 0: %d\n",  
+                     sm_p->msgarray_op.msgarray[i].op_status);
+      return sm_p->msgarray_op.msgarray[i].op_status;
+    }
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_comp_fn: resp: token: %llu, "
+                 "dirent handle: %llu, dirent name: %s, "
+                 "key->buffer: %s, key->buffer_sz: %d, "
+                 "val->buffer: %s, val->buffer_sz: %d\n",
+                 resp_p->u.getvalue.token,
+                 resp_p->u.getvalue.dirent.handle,
+                 resp_p->u.getvalue.dirent.d_name,
+                 (char *)(resp_p->u.getvalue.key.buffer+sizeof(TROVE_handle)),
+                 resp_p->u.getvalue.key.buffer_sz,
+                 (char *)resp_p->u.getvalue.val.buffer,
+                 resp_p->u.getvalue.val.buffer_sz);
+
+    sm_p->u.getvalue.resp_p->token = resp_p->u.getvalue.token;
+
+    sm_p->u.getvalue.resp_p->key->read_sz = resp_p->u.getvalue.key.buffer_sz;
+    sm_p->u.getvalue.resp_p->key->buffer_sz = resp_p->u.getvalue.key.buffer_sz;
+    memcpy(sm_p->u.getvalue.resp_p->key->buffer, resp_p->u.getvalue.key.buffer,
+        sm_p->u.getvalue.resp_p->key->buffer_sz);
+
+    sm_p->u.getvalue.resp_p->val->read_sz = resp_p->u.getvalue.val.buffer_sz;
+    sm_p->u.getvalue.resp_p->val->buffer_sz = resp_p->u.getvalue.val.buffer_sz;
+    memcpy(sm_p->u.getvalue.resp_p->val->buffer, resp_p->u.getvalue.val.buffer,
+        sm_p->u.getvalue.resp_p->val->buffer_sz);
+
+    memcpy(&(sm_p->u.getvalue.resp_p->dirent), &(resp_p->u.getvalue.dirent), 
+        sizeof(PVFS_dirent));
+                
+    gossip_debug(GOSSIP_CLIENT_DEBUG,
+                 "[GETVALUE]: get_value_comp_fn exit\n");
+    return ret;
+}
+



More information about the Pvfs2-cvs mailing list