[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