diff --git a/config.save b/config.save index dc18b21..53bd387 100755 --- a/config.save +++ b/config.save @@ -525,7 +525,7 @@ s,@ECHO_C@,,;t t s,@ECHO_N@,-n,;t t s,@ECHO_T@,,;t t s,@LIBS@, -lcrypto -lssl -ldl,;t t -s,@PVFS2_VERSION@,2.8.6-orangefs-2012-07-19-212817,;t t +s,@PVFS2_VERSION@,2.8.6-orangefs-2012-09-15-003549,;t t s,@PVFS2_VERSION_MAJOR@,2,;t t s,@PVFS2_VERSION_MINOR@,8,;t t s,@PVFS2_VERSION_SUB@,6,;t t diff --git a/src/apps/admin/pvfs2-chmod.c b/src/apps/admin/pvfs2-chmod.c index e2f74fe..0f95ee5 100644 --- a/src/apps/admin/pvfs2-chmod.c +++ b/src/apps/admin/pvfs2-chmod.c @@ -155,7 +155,7 @@ int pvfs2_chmod (PVFS_permissions perms, char *destfile) { } memset(&resp_getattr,0,sizeof(PVFS_sysresp_getattr)); attrmask = (PVFS_ATTR_SYS_ALL_SETABLE); - + ret = PVFS_sys_getattr(resp_lookup.ref,attrmask,&credentials,&resp_getattr, NULL); if (ret < 0) { diff --git a/src/apps/admin/pvfs2-cp.c b/src/apps/admin/pvfs2-cp.c index 69b98b8..6a03c1a 100644 --- a/src/apps/admin/pvfs2-cp.c +++ b/src/apps/admin/pvfs2-cp.c @@ -159,7 +159,6 @@ int main (int argc, char ** argv) ret = generic_open(&dest, &credentials, user_opts->num_datafiles, user_opts->strip_size, user_opts->srcfile, OPEN_DEST); - if (ret < 0) { fprintf(stderr, "Could not open %s\n", user_opts->destfile); diff --git a/src/apps/admin/pvfs2-mkdir.c b/src/apps/admin/pvfs2-mkdir.c index 6c22b47..53ea953 100644 --- a/src/apps/admin/pvfs2-mkdir.c +++ b/src/apps/admin/pvfs2-mkdir.c @@ -106,7 +106,7 @@ int main(int argc, char **argv) fprintf(stderr, "Unable to allocate memory\n"); return(-1); } - + ret = PVFS_util_init_defaults(); if (ret < 0) { diff --git a/src/client/sysint/acache.c b/src/client/sysint/acache.c index 0e5e16d..760f153 100644 --- a/src/client/sysint/acache.c +++ b/src/client/sysint/acache.c @@ -549,7 +549,7 @@ int PINT_acache_update( gossip_debug(GOSSIP_ACACHE_DEBUG, "acache: update(): H=%llu\n", llu(refn.handle)); - + if(!attr && !size) { return(-PVFS_EINVAL); @@ -605,6 +605,7 @@ int PINT_acache_update( if(attr->mask & PVFS_ATTR_META_DIST) { tmp_payload->dist = PINT_dist_copy(attr->u.meta.dist); + if(!tmp_payload->dist) { ret = -PVFS_ENOMEM; @@ -670,7 +671,7 @@ int PINT_acache_update( } gen_mutex_unlock(&acache_mutex); - + return(0); err: diff --git a/src/client/sysint/client-state-machine.h b/src/client/sysint/client-state-machine.h index 66c9298..4867b3f 100644 --- a/src/client/sysint/client-state-machine.h +++ b/src/client/sysint/client-state-machine.h @@ -825,6 +825,9 @@ extern struct PINT_state_machine_s pvfs2_client_datafile_getattr_sizes_sm; extern struct PINT_state_machine_s pvfs2_client_setattr_sm; extern struct PINT_state_machine_s pvfs2_client_io_sm; extern struct PINT_state_machine_s pvfs2_client_osd_io_sm; +extern struct PINT_state_machine_s pvfs2_client_osd_dirops_sm; +extern struct PINT_state_machine_s pvfs2_client_osd_dirops_attr1_sm; +extern struct PINT_state_machine_s pvfs2_client_osd_dirops_attr4_sm; extern struct PINT_state_machine_s pvfs2_client_small_io_sm; extern struct PINT_state_machine_s pvfs2_client_flush_sm; extern struct PINT_state_machine_s pvfs2_client_sysint_readdir_sm; diff --git a/src/client/sysint/module.mk.in b/src/client/sysint/module.mk.in index fa8ee23..3935350 100644 --- a/src/client/sysint/module.mk.in +++ b/src/client/sysint/module.mk.in @@ -53,7 +53,8 @@ CLIENT_SMCGEN := \ $(DIR)/mgmt-get-dirdata-handle.c \ $(DIR)/mgmt-get-uid-list.c \ $(DIR)/osdsm.c \ - $(DIR)/sys-osd-io.c + $(DIR)/sys-osd-io.c \ + $(DIR)/sys-osd-dir.c # track generated .c files that need to be removed during dist clean, etc. SMCGEN += $(CLIENT_SMCGEN) diff --git a/src/client/sysint/remove.sm b/src/client/sysint/remove.sm index 74d56e6..f7dfe78 100644 --- a/src/client/sysint/remove.sm +++ b/src/client/sysint/remove.sm @@ -105,7 +105,7 @@ nested machine pvfs2_client_remove_helper_sm state object_remove_xfer_osd_msgpair { jump pvfs2_osd_msgpairarray_sm; - success => remove_helper_cleanup; + success => remove_collection; default => object_remove_failure; } @@ -289,7 +289,7 @@ static PINT_sm_action remove_object_remove_setup_msgpair( gossip_debug(GOSSIP_CLIENT_DEBUG, "remove state: object_remove_setup_msgpair\n"); - if (is_osd_md) { + if (is_osd_md && (sm_p->getattr.attr.objtype != PVFS_TYPE_DIRECTORY)) { /* no mdfile to remove */ js_p->error_code = OSD_MDFILE_MSGPAIR; return SM_ACTION_COMPLETE; diff --git a/src/client/sysint/server-get-config.sm b/src/client/sysint/server-get-config.sm index 0dceba2..1ac4e6e 100644 --- a/src/client/sysint/server-get-config.sm +++ b/src/client/sysint/server-get-config.sm @@ -19,6 +19,8 @@ #include "pint-util.h" #include "pint-cached-config.h" #include "PINT-reqproto-encode.h" +#include "osd-util/osd-sense.h" +#include "osd-initiator/sense.h" extern job_context_id pint_client_sm_context; @@ -30,6 +32,10 @@ static int server_parse_config( static int server_get_config_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int i); +enum { + OSD_MSGPAIR = 2001, +}; + %% nested machine pvfs2_server_get_config_nested_sm @@ -37,10 +43,18 @@ nested machine pvfs2_server_get_config_nested_sm state setup_msgpair { run server_get_config_setup_msgpair; + OSD_MSGPAIR => osd_xfer_msgpair; success => xfer_msgpair; default => cleanup; } + state osd_xfer_msgpair + { + jump pvfs2_osd_msgpairarray_sm; + success => parse; + default => cleanup; + } + state xfer_msgpair { jump pvfs2_msgpairarray_sm; @@ -318,16 +332,31 @@ static PINT_sm_action server_get_config_setup_msgpair( return SM_ACTION_COMPLETE; } - PINT_SERVREQ_GETCONFIG_FILL(msg_p->req, *sm_p->cred_p, sm_p->hints); + if (server_is_osd(serv_addr)) { + struct osd_command *command = &msg_p->osd_command; + int len = 64 * 1024; + + ret = osd_command_set_read(command, PVFS_OSD_META_PID, + PVFS_OSD_FSCONF_OID, len, 0); + command->inlen_alloc = len; + command->indata = malloc(len); + if (!command->indata) { + js_p->error_code = -ENOMEM; + return SM_ACTION_COMPLETE; + } + js_p->error_code = OSD_MSGPAIR; + } else { + PINT_SERVREQ_GETCONFIG_FILL(msg_p->req, *sm_p->cred_p, sm_p->hints); + js_p->error_code = 0; + } msg_p->fs_id = PVFS_FS_ID_NULL; msg_p->handle = PVFS_HANDLE_NULL; msg_p->retry_flag = PVFS_MSGPAIR_RETRY; msg_p->comp_fn = server_get_config_comp_fn; msg_p->svr_addr = serv_addr; - + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); - js_p->error_code = 0; return SM_ACTION_COMPLETE; } @@ -421,6 +450,29 @@ static int server_get_config_comp_fn( { PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); + PINT_sm_msgpair_state *msg_p = &sm_p->msgarray_op.msgarray[0]; + + if (server_is_osd(msg_p->svr_addr)) { + struct osd_command *command = &msg_p->osd_command; + + if (command->status == SAM_STAT_CHECK_CONDITION) { + int key, code; + osd_sense_extract(command->sense, command->sense_len, &key, &code); + /* ignore "read past end of user object" */ + if (key == OSD_SSK_RECOVERED_ERROR && + code == OSD_ASC_READ_PAST_END_OF_USER_OBJECT) { + command->status = 0; + } + } + if (command->status != 0) + return osd_errno_from_status(command->status); + if (command->inlen == 0) + return -ENOENT; + sm_p->u.get_config.fs_config_buf = strdup(command->indata); + sm_p->u.get_config.fs_config_buf_size = command->inlen + 1; + free(command->indata); + return 0; + } /* only posted one msgpair */ assert(i==0); diff --git a/src/client/sysint/sys-create.sm b/src/client/sysint/sys-create.sm index 4a1b7fa..3de80e2 100644 --- a/src/client/sysint/sys-create.sm +++ b/src/client/sysint/sys-create.sm @@ -45,6 +45,8 @@ static int create_crdirent_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int index); static int create_delete_handles_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int index); +static int create_set_oid_comp_fn( + void *v_p, struct PVFS_server_resp *resp_p, int index); /* misc helper functions */ static PINT_dist* get_default_distribution(PVFS_fs_id fs_id); @@ -53,7 +55,8 @@ enum { OSD_MSGPAIR = 2001, OSD_CREATE_MSGPAIR = 2002, OSD_MDFILE_MSGPAIR = 2003, - OSD_POST_CREATE = 2004 + OSD_POST_CREATE = 2004, + OSD_OID_SET_MSGPAIR = 2005 }; %% @@ -85,6 +88,7 @@ machine pvfs2_client_create_sm run create_create_setup_msgpair; OSD_MSGPAIR => create_xfer_osd_msgpair; OSD_CREATE_MSGPAIR => create_xfer_datafile_msgpair; + OSD_MDFILE_MSGPAIR => datafiles_setup_msgpair_array; success => create_xfer_msgpair; default => cleanup; } @@ -113,10 +117,18 @@ machine pvfs2_client_create_sm state crdirent_setup_msgpair { run create_crdirent_setup_msgpair; + OSD_MSGPAIR => crdirent_osd_msgpair; success => crdirent_xfer_msgpair; default => crdirent_failure; } + state crdirent_osd_msgpair + { + jump pvfs2_client_osd_dirops_sm; + success => cleanup; + default => crdirent_failure; + } + state datafiles_setup_msgpair_array { run create_datafiles_setup_msgpair_array; @@ -125,6 +137,21 @@ machine pvfs2_client_create_sm } state datafiles_xfer_osd_msgpair_array + { + jump pvfs2_osd_msgpairarray_sm; + OSD_OID_SET_MSGPAIR => create_set_oid_msgpair; + success => crdirent_setup_msgpair; + default => crdirent_failure; + } + + state create_set_oid_msgpair + { + run create_set_oid_msgpair; + success => create_set_oid_xfer_msgpair; + default => cleanup; + } + + state create_set_oid_xfer_msgpair { jump pvfs2_osd_msgpairarray_sm; success => crdirent_setup_msgpair; @@ -499,6 +526,7 @@ static int create_datafiles_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index) { + int ret; PVFS_error status; PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); @@ -546,7 +574,6 @@ static int create_datafiles_comp_fn(void *v_p, /* otherwise, just stash the newly created data file handle */ if (is_osd) { - int ret; uint64_t oid; PVFS_handle_extent_array *ea @@ -554,16 +581,22 @@ static int create_datafiles_comp_fn(void *v_p, PVFS_handle first = ea->extent_array[0].first; PVFS_handle last = ea->extent_array[0].last; -/* ret = osd_command_attr_resolve(&sm_p->msgarray_op.msgarray[index].osd_command);*/ + ret = osd_command_attr_resolve(&sm_p->msgarray_op.msgarray[index].osd_command); -/* if (ret)*/ -/* osd_error_xerrno(ret, "%s: attr_resolve failed", __func__);*/ -/* oid = get_ntohll(sm_p->msgarray_op.msgarray[index].osd_command.attr[0].val);*/ - oid = sm_p->u.create.datafile_handles[index]; + if (ret) + osd_error_xerrno(ret, "%s: attr_resolve failed", __func__); + + if (sm_p->u.create.datafile_handles[index]) + oid = sm_p->u.create.datafile_handles[index]; + else { + ret = OSD_OID_SET_MSGPAIR; + oid = get_ntohll(sm_p->msgarray_op.msgarray[index].osd_command.attr[6].val); + sm_p->u.create.datafile_handles[index] = oid; + } + if (oid < first || oid > last) gossip_err("%s: OSD-assigned oid %llu out of range %llu-%llu\n", __func__, llu(oid), llu(first), llu(last)); -/* sm_p->u.create.datafile_handles[index] = oid;*/ /* The first datafile also happens to be the metafile */ if (is_osd_md && index == 0) { @@ -571,13 +604,15 @@ static int create_datafiles_comp_fn(void *v_p, sm_p->u.create.create_resp->ref.handle = oid; sm_p->u.create.create_resp->ref.fs_id = sm_p->object_ref.fs_id; } -/* osd_command_attr_free(&sm_p->msgarray_op.msgarray[index].osd_command);*/ + + sm_p->u.create.datafile_count = 1; + osd_command_attr_free(&sm_p->msgarray_op.msgarray[index].osd_command); } gossip_debug(GOSSIP_CLIENT_DEBUG, "Datafile handle %d is %llu\n", index, llu(sm_p->u.create.datafile_handles[index])); - return 0; + return ret; } static int create_crdirent_comp_fn(void *v_p, @@ -611,12 +646,24 @@ static PINT_sm_action create_create_setup_msgpair( int is_osd_md = fsid_is_osd_md(sm_p->object_ref.fs_id); int is_osd_meta = fsid_is_osd_meta(sm_p->object_ref.fs_id); int is_osd = fsid_is_osd(sm_p->object_ref.fs_id); - + gossip_debug(GOSSIP_CLIENT_DEBUG, "create state: " "dspace_create_setup_msgpair\n"); gossip_debug(GOSSIP_CLIENT_DEBUG," create: posting create req\n"); + if (is_osd_md) { + /* + * OK, so osd_type == OSD_MDFILE which means that we're storing the + * file metadata as attributes of the first datafile. There is nothing + * else to be done here so we'll go ahead and skip the + * dspace_create_xfer state and jump directly to the + * datafiles_setup_msgpair_array state. + */ + js_p->error_code = OSD_MDFILE_MSGPAIR; + return SM_ACTION_COMPLETE; + } + /* reset the attributes to what got passed in to the sysint call. the retry * path comes through here so we'll want to reset it after each try. * force the mask to all meta attributes. */ @@ -703,6 +750,68 @@ static PINT_sm_action create_create_setup_msgpair( return SM_ACTION_COMPLETE; } +static PINT_sm_action create_set_oid_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 = NULL; + + gossip_debug(GOSSIP_CLIENT_DEBUG, "create state: " + "set_oid_msgpair\n"); + + js_p->error_code = 0; + + PINT_msgpair_init(&sm_p->msgarray_op); + msg_p = &sm_p->msgarray_op.msgpair; + + struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; + + struct attribute_list attrs = {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 6, sm_p->u.create.datafile_handles, sizeof(PVFS_handle) * sm_p->u.create.num_data_files}; + + ret = osd_command_set_set_attributes(command, PVFS_OSD_DATA_PID, sm_p->u.create.datafile_handles[0]); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_set_attributes failed", + __func__); + js_p->error_code = ret; + return 1; + } + + ret = osd_command_attr_build(command, &attrs, 1); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_build failed", + __func__); + js_p->error_code = ret; + return 1; + } + + msg_p->fs_id = sm_p->object_ref.fs_id; + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = create_set_oid_comp_fn; + msg_p->handle = sm_p->u.create.io_handle_extent_array[0]. + extent_array[0].first; + msg_p->svr_addr = sm_p->u.create.data_server_addrs[0]; + + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); + return SM_ACTION_COMPLETE; +} + +static int create_set_oid_comp_fn(void *v_p, + struct PVFS_server_resp *resp_p, + int index) +{ + int status; + PINT_smcb *smcb = v_p; + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); + + gossip_debug(GOSSIP_CLIENT_DEBUG, "create_set_oid_comp_fn\n"); + + osd_command_attr_free(&sm_p->msgarray_op.msgpair.osd_command); + status = osd_errno_from_status(sm_p->msgarray_op.msgpair.osd_command.status); + + return status; +} + static PINT_sm_action create_datafiles_setup_msgpair_array( struct PINT_smcb *smcb, job_status_s *js_p) { @@ -712,6 +821,7 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( int is_osd; int is_osd_md = fsid_is_osd_md(sm_p->object_ref.fs_id); PINT_sm_msgpair_state *msg_p = NULL; + int num_attr = 8, i; gossip_debug(GOSSIP_CLIENT_DEBUG, "create state: " "datafiles_setup_msgpair_array\n"); @@ -749,7 +859,7 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( js_p->error_code = -PVFS_ENOMEM; return SM_ACTION_COMPLETE; } - + ret = PINT_cached_config_map_servers( sm_p->object_ref.fs_id, &sm_p->u.create.num_data_files, @@ -774,6 +884,9 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; +#define CURRENT_COMMAND_PAGE 0xfffffffeUL +#define CURRENT_COMMAND_PAGE_OID 4 + if (is_osd) { uint64_t attrval; struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; @@ -802,23 +915,65 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( return 1; } PINT_dist_encode(dist_buf, sm_p->u.create.dist); + + struct attribute_list attrs[num_attr]; + + for (i = 0; i < 6; i++) { + attrs[i].type = ATTR_SET; + attrs[i].page = PVFS_USEROBJECT_ATTR_PG; + attrs[i].number = i; + } + + attrs[0].val = &sm_p->u.create.attr.owner; + attrs[0].len = sizeof(PVFS_uid); + + attrs[1].val = &sm_p->u.create.attr.group; + attrs[1].len = sizeof(PVFS_gid); + + attrs[2].val = &sm_p->u.create.attr.perms; + attrs[2].len = sizeof(PVFS_permissions); + + attrs[3].val = &sm_p->u.create.attr.mask; + attrs[3].len = sizeof(uint32_t); + + attrs[4].val = &sm_p->u.create.attr.objtype; + attrs[4].len = sizeof(PVFS_ds_type); - struct attribute_list attrs[] = { - {ATTR_SET, USER_COLL_PG, 1, &attrval, 8}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 0, &sm_p->u.create.attr.owner, sizeof(PVFS_uid)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 1, &sm_p->u.create.attr.group, sizeof(PVFS_gid)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 2, &sm_p->u.create.attr.perms, sizeof(PVFS_permissions)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 3, &sm_p->u.create.attr.mask, sizeof(uint32_t)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 4, &sm_p->u.create.attr.objtype, sizeof(PVFS_ds_type)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 5, dist_buf, PINT_DIST_PACK_SIZE(sm_p->u.create.dist)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 6, sm_p->u.create.datafile_handles, sizeof(PVFS_handle) * sm_p->u.create.num_data_files}}; + attrs[5].val = dist_buf; + attrs[5].len = PINT_DIST_PACK_SIZE(sm_p->u.create.dist); if(!sm_p->getattr.attr.cid) { sm_p->getattr.attr.cid = COLLECTION_OID_LB; /* root directory */ } set_htonll(&attrval, sm_p->getattr.attr.cid); - ret = osd_command_set_create(command, PVFS_OSD_DATA_PID, sm_p->u.create.datafile_handles[0], 1); + attrs[7].type = ATTR_SET; + attrs[7].page = USER_COLL_PG; + attrs[7].number = 7; + attrs[7].val = &attrval; + attrs[7].len = 8; + + if (sm_p->u.create.datafile_handles) + { + attrs[6].type = ATTR_SET; + attrs[6].page = PVFS_USEROBJECT_ATTR_PG; + attrs[6].number = 6; + attrs[6].val = sm_p->u.create.datafile_handles; + attrs[6].len = sizeof(PVFS_handle) * sm_p->u.create.num_data_files; + ret = osd_command_set_create(command, PVFS_OSD_DATA_PID, sm_p->u.create.datafile_handles[0], 1); + } + else + { + /* retrieve oid */ + attrs[6].type = ATTR_GET; + attrs[6].page = CUR_CMD_ATTR_PG; + attrs[6].number = CCAP_OID; + attrs[6].val = NULL; + attrs[6].len = CCAP_OID_LEN; + + ret = osd_command_set_create(command, PVFS_OSD_DATA_PID, 0, 1); + } + if (ret) { osd_error_xerrno(ret, "%s: osd_command_set_create failed", __func__); @@ -826,7 +981,8 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( return 1; } - ret = osd_command_attr_build(command, attrs, 8); + ret = osd_command_attr_build(command, attrs, num_attr); + if (ret) { osd_error_xerrno(ret, "%s: osd_command_attr_build failed", __func__); @@ -883,8 +1039,6 @@ static PINT_sm_action create_crdirent_setup_msgpair( gossip_debug(GOSSIP_CLIENT_DEBUG, "create state: crdirent_setup_msgpair\n"); - js_p->error_code = 0; - gossip_debug(GOSSIP_CLIENT_DEBUG, "create: %s: posting crdirent req: parent handle: %llu, " "name: %s, handle: %llu\n", @@ -895,20 +1049,6 @@ static PINT_sm_action create_crdirent_setup_msgpair( PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; - PINT_SERVREQ_CRDIRENT_FILL( - msg_p->req, - *sm_p->cred_p, - sm_p->u.create.object_name, - sm_p->u.create.metafile_handle, - sm_p->object_ref.handle, - sm_p->object_ref.fs_id, - sm_p->hints); - - msg_p->fs_id = sm_p->object_ref.fs_id; - msg_p->handle = sm_p->object_ref.handle; - msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; - msg_p->comp_fn = create_crdirent_comp_fn; - ret = PINT_cached_config_map_to_server( &msg_p->svr_addr, sm_p->object_ref.handle, sm_p->object_ref.fs_id); @@ -919,6 +1059,30 @@ static PINT_sm_action create_crdirent_setup_msgpair( js_p->error_code = ret; } + if (server_is_osd(msg_p->svr_addr)) { + /* + * Directory operations for metafile and mdfile. We don't do anything + * here because we'll handle the individual directory operations in + * different states. + */ + js_p->error_code = OSD_MSGPAIR; + return SM_ACTION_COMPLETE; + } else { + PINT_SERVREQ_CRDIRENT_FILL( + msg_p->req, + *sm_p->cred_p, + sm_p->u.create.object_name, + sm_p->u.create.metafile_handle, + sm_p->object_ref.handle, + sm_p->object_ref.fs_id, + sm_p->hints); + js_p->error_code = 0; + } + msg_p->fs_id = sm_p->object_ref.fs_id; + msg_p->handle = sm_p->object_ref.handle; + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = create_crdirent_comp_fn; + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -967,7 +1131,7 @@ static PINT_sm_action create_cleanup( metafile_ref.handle = sm_p->u.create.metafile_handle; metafile_ref.fs_id = sm_p->object_ref.fs_id; metafile_ref.cid = sm_p->getattr.attr.cid; - + /* fill in outgoing response fields */ sm_p->u.create.create_resp->ref = metafile_ref; @@ -1250,7 +1414,6 @@ static PINT_sm_action create_parent_getattr_inspect( sm_p->u.create.dist, num_dfiles_requested, &sm_p->u.create.num_data_files); - if(ret < 0) { gossip_err("Error: failed to get number of data servers\n"); diff --git a/src/client/sysint/sys-getattr.sm b/src/client/sysint/sys-getattr.sm index a02efcf..dd87743 100644 --- a/src/client/sysint/sys-getattr.sm +++ b/src/client/sysint/sys-getattr.sm @@ -680,8 +680,9 @@ static int getattr_object_getattr_comp_fn( struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; status = osd_errno_from_status(command->status); - if (status != 0) return status; - + if (status != 0) + return status; + ret = osd_command_attr_resolve(command); if (ret) { osd_error_xerrno(ret, "%s: osd_command_attr_resolve failed", @@ -691,14 +692,6 @@ static int getattr_object_getattr_comp_fn( /* memcpy the attributes from osd_command attr to sm_p attr object */ if (*(PVFS_ds_type*)command->attr[4].val == PVFS_TYPE_DIRECTORY) { - - if (sm_p->getattr.req_attrmask & PVFS_ATTR_DIR_HINT) { - /* we do not provide dir hints, always come back zero, but - * lie that the server provided a hint so that acache works - */ - *(uint32_t *) command->attr[3].val |= PVFS_ATTR_DIR_HINT; - } - PINT_copy_osd_dir_attr(attr, command); } else { PINT_copy_osd_object_attr(attr, command); @@ -1382,7 +1375,7 @@ static PINT_sm_action getattr_datafile_getattr_cleanup( static PINT_sm_action getattr_acache_insert( struct PINT_smcb *smcb, job_status_s *js_p) -{ +{ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); PVFS_size* tmp_size = NULL; @@ -1393,7 +1386,7 @@ static PINT_sm_action getattr_acache_insert( /* see if we have a size value to cache */ if (sm_p->getattr.attr.objtype == PVFS_TYPE_METAFILE && sm_p->getattr.req_attrmask & PVFS_ATTR_DATA_SIZE) - { + { if(!(sm_p->getattr.attr.mask & PVFS_ATTR_META_UNSTUFFED)) { /* stuffed file case */ diff --git a/src/client/sysint/sys-io.sm b/src/client/sysint/sys-io.sm index bcffab6..514f624 100644 --- a/src/client/sysint/sys-io.sm +++ b/src/client/sysint/sys-io.sm @@ -2049,8 +2049,6 @@ static inline int io_decode_ack_response( { PVFS_perror_gossip("io_process_context_recv (op_status)", cur_ctx->msg.op_status); - gossip_err("server: %s\n" - , BMI_addr_rev_lookup(cur_ctx->msg.svr_addr)); ret = cur_ctx->msg.op_status; } @@ -2647,7 +2645,6 @@ static int io_find_target_datafiles( for(i = 0; i < input_handle_count; i++) { int max_unexp_payload; - ret = io_get_max_unexp_size( file_req, input_handle_array[i], fs_id, io_type, &max_unexp_payload); diff --git a/src/client/sysint/sys-lookup.sm b/src/client/sysint/sys-lookup.sm index 9ba50a4..8e55f6d 100644 --- a/src/client/sysint/sys-lookup.sm +++ b/src/client/sysint/sys-lookup.sm @@ -23,6 +23,7 @@ #include "pint-cached-config.h" #include "PINT-reqproto-encode.h" #include "pvfs2-internal.h" +#include "osd-util/osd-util.h" extern job_context_id pint_client_sm_context; @@ -35,6 +36,10 @@ extern job_context_id pint_client_sm_context; #define GET_CURRENT_SEGMENT(__sm_p) \ (GET_SEGMENT_AT(__sm_p, (GET_CURRENT_CONTEXT(__sm_p))->current_segment)) +enum { + OSD_MSGPAIR = 2001 +}; + enum { LOOKUP_CONTINUE = 2, @@ -79,9 +84,17 @@ machine pvfs2_client_lookup_sm { run lookup_segment_setup_msgpair; success => lookup_segment_lookup_xfer_msgpair; + OSD_MSGPAIR => lookup_segment_lookup_xfer_osd_msgpair; default => lookup_segment_lookup_failure; } + state lookup_segment_lookup_xfer_osd_msgpair + { + jump pvfs2_osd_msgpairarray_sm; + success => lookup_segment_verify_attr_present; + default => lookup_segment_lookup_failure; + } + state lookup_segment_lookup_xfer_msgpair { jump pvfs2_msgpairarray_sm; @@ -683,38 +696,84 @@ static PINT_sm_action lookup_segment_setup_msgpair(struct PINT_smcb *smcb, char *seg_to_lookup = NULL; gossip_debug(GOSSIP_CLIENT_DEBUG, "%s\n", __func__); - js_p->error_code = 0; /* do a lookup on the current segment of the current context */ cur_seg = GET_CURRENT_SEGMENT(sm_p); assert(cur_seg); - /* - the pvfs2 lookup_path server operation has an optimization that - allows several path components to be resolved at once. this - code here resolves on a segment-by-segment basis, but we can - handle the multi-segment resolution by advancing through all - handles/attrs returned and populating the segments on - completion. the lookup_comp_fn does just this. - - one way to disable use of this optimization is to make sure - seg_to_lookup is set to seg_name, and never seg_remaining. that - guarantees we're issuing a lookup on a single path segment - */ - seg_to_lookup = cur_seg->seg_remaining ? cur_seg->seg_remaining : - cur_seg->seg_name; - PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; - PINT_SERVREQ_LOOKUP_PATH_FILL( - msg_p->req, - *sm_p->cred_p, - seg_to_lookup, - cur_seg->seg_starting_refn.fs_id, - cur_seg->seg_starting_refn.handle, - PVFS_ATTR_COMMON_ALL, - sm_p->hints); + ret = PINT_cached_config_map_to_server(&msg_p->svr_addr, + cur_seg->seg_starting_refn.handle, + cur_seg->seg_starting_refn.fs_id); + + if (ret) + { + gossip_err("Failed to map meta server address\n"); + js_p->error_code = ret; + } + + if (server_is_osd(msg_p->svr_addr)) { + uint64_t oid; + struct attribute_list attr; + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; + + /* Disable multi-segment resolution optimization */ + seg_to_lookup = cur_seg->seg_name; + + attr.type = ATTR_GET; + attr.page = PVFS_USEROBJECT_DIR_PG; + attr.number = jenkins_one_at_a_time_hash((uint8_t *)seg_to_lookup, + strlen(seg_to_lookup) + 1); + attr.len = 1024; + + oid = cur_seg->seg_starting_refn.handle; + ret = osd_command_set_get_attributes(command, PVFS_OSD_META_PID, oid); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_get_attributes failed", + __func__); + js_p->error_code = ret; + return SM_ACTION_COMPLETE; + } + + ret = osd_command_attr_build(command, &attr, 1); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_build failed", + __func__); + js_p->error_code = ret; + return SM_ACTION_COMPLETE; + } + + js_p->error_code = OSD_MSGPAIR; + + } else { + /* + the pvfs2 lookup_path server operation has an optimization that + allows several path components to be resolved at once. this + code here resolves on a segment-by-segment basis, but we can + handle the multi-segment resolution by advancing through all + handles/attrs returned and populating the segments on + completion. the lookup_comp_fn does just this. + + one way to disable use of this optimization is to make sure + seg_to_lookup is set to seg_name, and never seg_remaining. that + guarantees we're issuing a lookup on a single path segment + */ + seg_to_lookup = cur_seg->seg_remaining ? cur_seg->seg_remaining : + cur_seg->seg_name; + + PINT_SERVREQ_LOOKUP_PATH_FILL( + msg_p->req, + *sm_p->cred_p, + seg_to_lookup, + cur_seg->seg_starting_refn.fs_id, + cur_seg->seg_starting_refn.handle, + PVFS_ATTR_COMMON_ALL, + sm_p->hints); + + js_p->error_code = 0; + } gossip_debug( GOSSIP_LOOKUP_DEBUG, "Looking up segment %s under handle %llu\n", @@ -725,15 +784,6 @@ static PINT_sm_action lookup_segment_setup_msgpair(struct PINT_smcb *smcb, msg_p->retry_flag = PVFS_MSGPAIR_RETRY; msg_p->comp_fn = lookup_segment_lookup_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 = ret; - } - PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -778,6 +828,7 @@ static PINT_sm_action lookup_segment_verify_attr_present( This second case is handled in check_attr_type method. */ + if ((cur_seg->seg_attr.objtype == PVFS_TYPE_NONE) || (cur_seg->seg_attr.objtype == PVFS_TYPE_SYMLINK)) { @@ -1168,6 +1219,45 @@ static int lookup_segment_lookup_comp_fn( gossip_debug(GOSSIP_CLIENT_DEBUG, "lookup_segment_lookup_comp_fn\n"); + if (server_is_osd(sm_p->msgarray_op.msgpair.svr_addr)) { + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; + int status = osd_errno_from_status(command->status); + int ret; + + if (status != 0) { + gossip_debug(GOSSIP_CLIENT_DEBUG, + "osd_command_set_get_attributes failed %d\n", index); + return status; + } + + ret = osd_command_attr_resolve(command); + if (ret) { + osd_error_xerrno(ret, "%s: attr_resolve failed", __func__); + return ret; + } + + /* dirent with this handle not present on server */ + if (command->attr->outlen == 0) + return -PVFS_ENOENT; + + cur_seg = GET_SEGMENT_AT(sm_p, current_seg_index); + cur_seg->seg_resolved_refn.handle = get_ntohll(command->attr->val); + cur_seg->seg_resolved_refn.fs_id = cur_seg->seg_starting_refn.fs_id; + + gossip_debug(GOSSIP_NCACHE_DEBUG, "*** ncache update on %s " + "target (%llu|%d) parent (%llu|%d)\n", + cur_seg->seg_name, llu(cur_seg->seg_resolved_refn.handle), + cur_seg->seg_resolved_refn.fs_id, + llu(cur_seg->seg_starting_refn.handle), + cur_seg->seg_starting_refn.fs_id); + + PINT_ncache_update(cur_seg->seg_name, &cur_seg->seg_resolved_refn, + &cur_seg->seg_starting_refn); + + osd_command_attr_free(command); + return 0; + } + assert(resp_p->op == PVFS_SERV_LOOKUP_PATH); if (resp_p->status != 0) diff --git a/src/client/sysint/sys-mkdir.sm b/src/client/sysint/sys-mkdir.sm index d93559b..54bea6e 100644 --- a/src/client/sysint/sys-mkdir.sm +++ b/src/client/sysint/sys-mkdir.sm @@ -75,6 +75,7 @@ machine pvfs2_client_mkdir_sm state mkdir_msg_setup_msgpair { run mkdir_msg_setup_msgpair; + OSD_MKDIR_MSGPAIR => mkdir_msg_xfer_osd_msgpair; success => mkdir_msg_xfer_msgpair; default => mkdir_msg_failure; } @@ -86,6 +87,13 @@ machine pvfs2_client_mkdir_sm default => mkdir_msg_failure; } + state mkdir_msg_xfer_osd_msgpair + { + jump pvfs2_osd_msgpairarray_sm; + success => create_collection; + default => mkdir_msg_failure; + } + state mkdir_msg_failure { run mkdir_msg_failure; @@ -132,6 +140,14 @@ machine pvfs2_client_mkdir_sm { run mkdir_crdirent_setup_msgpair; success => mkdir_crdirent_xfer_msgpair; + OSD_MKDIR_MSGPAIR => mkdir_crdirent_osd_msgpair; + default => mkdir_crdirent_failure; + } + + state mkdir_crdirent_osd_msgpair + { + jump pvfs2_client_osd_dirops_sm; + success => cleanup; default => mkdir_crdirent_failure; } @@ -311,22 +327,44 @@ static int mkdir_msg_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index) { + int ret; + uint64_t oid; PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); PVFS_object_attr attr; + PINT_sm_msgpair_state *msg_p = &sm_p->msgarray_op.msgpair; gossip_debug(GOSSIP_CLIENT_DEBUG, "mkdir_msg_comp_fn\n"); - assert(resp_p->op == PVFS_SERV_MKDIR); + if (server_is_osd(msg_p->svr_addr)) { + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; + + if (command->status == 0) { + /* Stash the newly created meta handle */ + ret = osd_command_attr_resolve(command); + if (ret) { + osd_error_xerrno(ret, "%s: attr_resolve failed", __func__); + return ret; + } + oid = get_ntohll(command->attr[5].val); + sm_p->u.mkdir.metafile_handle = oid; + } - if (resp_p->status != 0) - { - return resp_p->status; - } + osd_command_attr_free(command); + return osd_errno_from_status(command->status); + + } else { + assert(resp_p->op == PVFS_SERV_MKDIR); + + if (resp_p->status != 0) + { + return resp_p->status; + } - /* otherwise, just stash the newly created meta handle */ - sm_p->u.mkdir.metafile_handle = resp_p->u.mkdir.handle; - sm_p->u.mkdir.cid = resp_p->u.mkdir.cid; + /* otherwise, just stash the newly created meta handle */ + sm_p->u.mkdir.metafile_handle = resp_p->u.mkdir.handle; + sm_p->u.mkdir.cid = resp_p->u.mkdir.cid; + } /* also insert entry into attr cache */ PINT_CONVERT_ATTR(&attr, &sm_p->u.mkdir.sys_attr, 0); @@ -370,8 +408,6 @@ static PINT_sm_action mkdir_msg_setup_msgpair( gossip_debug(GOSSIP_CLIENT_DEBUG, "mkdir state: mkdir_msg_setup_msgpair\n"); - js_p->error_code = 0; - gossip_debug(GOSSIP_CLIENT_DEBUG," mkdir: posting mkdir req\n"); PINT_msgpair_init(&sm_p->msgarray_op); @@ -388,13 +424,82 @@ static PINT_sm_action mkdir_msg_setup_msgpair( return SM_ACTION_COMPLETE; } - PINT_SERVREQ_MKDIR_FILL( - msg_p->req, - *sm_p->cred_p, - sm_p->object_ref.fs_id, - meta_handle_extent_array, - sm_p->u.mkdir.sys_attr, - sm_p->hints); + if (server_is_osd(msg_p->svr_addr)) { + /* Create a directory object and fill in the default attributes */ + int i, numattrs = 6; + struct attribute_list attr[numattrs]; + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; + + /* Set attr type, page and number */ + for (i = 0; i < numattrs - 1; i++) { + attr[i].type = ATTR_SET; + attr[i].page = PVFS_USEROBJECT_ATTR_PG; + attr[i].number = i; + } + + /* uid */ + attr[0].val = &sm_p->u.mkdir.sys_attr.owner; + attr[0].len = sizeof(PVFS_uid); + + /* gid */ + attr[1].val = &sm_p->u.mkdir.sys_attr.group; + attr[1].len = sizeof(PVFS_gid); + + /* XXX Default to PVFS_PERM_VALID till we can figure out the umask */ + sm_p->u.mkdir.sys_attr.perms = PVFS_PERM_VALID; + attr[2].val = &sm_p->u.mkdir.sys_attr.perms; + attr[2].len = sizeof(PVFS_permissions); + + /* mask */ + sm_p->u.mkdir.sys_attr.mask = PVFS_ATTR_COMMON_UID | + PVFS_ATTR_COMMON_GID | + PVFS_ATTR_COMMON_PERM | + PVFS_ATTR_COMMON_ATIME | + PVFS_ATTR_COMMON_CTIME | + PVFS_ATTR_COMMON_MTIME | + PVFS_ATTR_COMMON_TYPE; + attr[3].val = &sm_p->u.mkdir.sys_attr.mask; + attr[3].len = sizeof(uint32_t); + + /* object type */ + sm_p->u.mkdir.sys_attr.objtype = PVFS_TYPE_DIRECTORY; + attr[4].val = &sm_p->u.mkdir.sys_attr.objtype; + attr[4].len = sizeof(PVFS_ds_type); + + /* retrieve oid */ + attr[5].type = ATTR_GET; + attr[5].page = CUR_CMD_ATTR_PG; + attr[5].number = CCAP_OID; + attr[5].val = NULL; + attr[5].len = CCAP_OID_LEN; + + ret = osd_command_set_create(command, PVFS_OSD_META_PID, 0, 1); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_create failed", + __func__); + js_p->error_code = ret; + return SM_ACTION_COMPLETE; + } + + /* Set/Retrieve the dir. attributes */ + ret = osd_command_attr_build(command, attr, numattrs); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_build failed", + __func__); + js_p->error_code = ret; + return SM_ACTION_COMPLETE; + } + js_p->error_code = OSD_MKDIR_MSGPAIR; + } else { + PINT_SERVREQ_MKDIR_FILL( + msg_p->req, + *sm_p->cred_p, + sm_p->object_ref.fs_id, + meta_handle_extent_array, + sm_p->u.mkdir.sys_attr, + sm_p->hints); + js_p->error_code = 0; + } msg_p->fs_id = sm_p->object_ref.fs_id; msg_p->handle = meta_handle_extent_array.extent_array[0].first; @@ -466,10 +571,6 @@ static PINT_sm_action create_collection_setup_msgpair( struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; -/* struct attribute_list attr = { ATTR_GET, CUR_CMD_ATTR_PG,*/ -/* CCAP_OID, NULL, CCAP_OID_LEN };*/ - - ret = osd_command_set_create_collection(command, PVFS_OSD_DATA_PID, sm_p->u.mkdir.cid); if (ret) { @@ -479,14 +580,6 @@ static PINT_sm_action create_collection_setup_msgpair( return 1; } -/* ret = osd_command_attr_build(command, &attr, 1);*/ -/* if (ret) {*/ -/* osd_error_xerrno(ret, "%s: osd_command_attr_build failed",*/ -/* __func__);*/ -/* js_p->error_code = ret;*/ -/* return SM_ACTION_COMPLETE;*/ -/* }*/ - PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -516,16 +609,8 @@ static int create_collection_comp_fn(void *v_p, return status; } -/* ret = osd_command_attr_resolve(&sm_p->msgarray_op.msgpair.osd_command);*/ -/* if (ret) {*/ -/* osd_error_xerrno(ret, "%s: attr_resolve failed", __func__);*/ -/* }*/ - -/* sm_p->object_ref.cid = get_ntohll(sm_p->msgarray_op.msgpair.osd_command.attr[0].val);*/ - sm_p->object_ref.cid = sm_p->u.mkdir.cid; - -/* osd_command_attr_free(&sm_p->msgarray_op.msgpair.osd_command);*/ + return 0; } @@ -539,8 +624,6 @@ static PINT_sm_action mkdir_crdirent_setup_msgpair( gossip_debug(GOSSIP_CLIENT_DEBUG, "mkdir state: crdirent_setup_msgpair\n"); - js_p->error_code = 0; - gossip_debug(GOSSIP_CLIENT_DEBUG," mkdir: posting crdirent req\n"); gossip_debug(GOSSIP_CLIENT_DEBUG, "hooking dirent %s (%llu) under " @@ -551,20 +634,6 @@ static PINT_sm_action mkdir_crdirent_setup_msgpair( PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; - PINT_SERVREQ_CRDIRENT_FILL( - msg_p->req, - *sm_p->cred_p, - sm_p->u.mkdir.object_name, - sm_p->u.mkdir.metafile_handle, - sm_p->object_ref.handle, - sm_p->object_ref.fs_id, - sm_p->hints); - - msg_p->fs_id = sm_p->object_ref.fs_id; - msg_p->handle = sm_p->object_ref.handle; - msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; - msg_p->comp_fn = mkdir_crdirent_comp_fn; - ret = PINT_cached_config_map_to_server( &msg_p->svr_addr, sm_p->object_ref.handle, sm_p->object_ref.fs_id); @@ -574,6 +643,33 @@ static PINT_sm_action mkdir_crdirent_setup_msgpair( gossip_err("Failed to map meta server address\n"); js_p->error_code = ret; } + + if (server_is_osd(msg_p->svr_addr)) { + /* + * Directory operations for metafile and mdfile. We don't do anything + * here because we'll handle the individual directory operations in a + * different state machine. + */ + js_p->error_code = OSD_MKDIR_MSGPAIR; + return SM_ACTION_COMPLETE; + } else { + + PINT_SERVREQ_CRDIRENT_FILL( + msg_p->req, + *sm_p->cred_p, + sm_p->u.mkdir.object_name, + sm_p->u.mkdir.metafile_handle, + sm_p->object_ref.handle, + sm_p->object_ref.fs_id, + sm_p->hints); + + js_p->error_code = 0; + } + + msg_p->fs_id = sm_p->object_ref.fs_id; + msg_p->handle = sm_p->object_ref.handle; + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = mkdir_crdirent_comp_fn; PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; diff --git a/src/client/sysint/sys-osd-dir.sm b/src/client/sysint/sys-osd-dir.sm index ab93b9c..016e432 100644 --- a/src/client/sysint/sys-osd-dir.sm +++ b/src/client/sysint/sys-osd-dir.sm @@ -232,9 +232,7 @@ nested machine pvfs2_client_osd_dirops_attr4_sm static PINT_sm_action osd_dirops_init( struct PINT_smcb *smcb, job_status_s *js_p) { - struct PINT_client_sm *sm_p; - - sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); + struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); gossip_debug(GOSSIP_CLIENT_DEBUG, "osd_dirops state: init\n"); if (smcb->op == PVFS_SYS_REMOVE) { @@ -711,7 +709,7 @@ static PINT_sm_action osd_dirops_attr4_setup_lock_msgpair( js_p->error_code = -PVFS_ENOMEM; return 1; } - + memset(inbuf, 0, command->inlen_alloc); command->indata = inbuf; @@ -728,6 +726,7 @@ static PINT_sm_action osd_dirops_attr4_setup_lock_msgpair( js_p->error_code = ret; } + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -751,11 +750,11 @@ static int osd_dirops_attr4_lock_comp_fn(void *v_p, } /* osd_command.indata should contain the previous value of the lock */ - inbuf = (uint8_t *)sm_p->msgarray_op.msgpair.osd_command.indata; - outbuf = (uint8_t *)sm_p->msgarray_op.msgpair.osd_command.outdata; + inbuf = &(sm_p->msgarray_op.msgpair.osd_command.indata); + outbuf = &(sm_p->msgarray_op.msgpair.osd_command.outdata); assert(inbuf); assert(outbuf); - + if (get_ntohll(&inbuf[0]) != get_ntohll(&outbuf[0])) { /* lock failed */ gossip_debug(GOSSIP_CLIENT_DEBUG, @@ -832,6 +831,7 @@ static PINT_sm_action osd_dirops_attr4_remove_setup_msgpair( js_p->error_code = ret; } + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -842,7 +842,7 @@ static int osd_dirops_attr4_remove_comp_fn(void *v_p, int ret; PVFS_error status = 0; PINT_smcb *smcb = v_p; - PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; gossip_debug(GOSSIP_CLIENT_DEBUG, "osd_dirops_attr4_remove_comp_fn\n"); @@ -863,7 +863,7 @@ static int osd_dirops_attr4_remove_comp_fn(void *v_p, sm_p->object_ref.handle = get_ntohll(command->attr->val); sm_p->object_ref.fs_id = sm_p->parent_ref.fs_id; osd_command_attr_free(&sm_p->msgarray_op.msgpair.osd_command); - + return status; } @@ -941,6 +941,7 @@ static PINT_sm_action osd_dirops_attr4_setup_lookup_msgpair( js_p->error_code = ret; } + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -951,7 +952,7 @@ static int osd_dirops_attr4_lookup_comp_fn(void *v_p, int ret = 0; PVFS_error status = 0; PINT_smcb *smcb = v_p; - PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); gossip_debug(GOSSIP_CLIENT_DEBUG, "osd_dirops_attr4_lookup_comp_fn\n"); @@ -968,15 +969,14 @@ static int osd_dirops_attr4_lookup_comp_fn(void *v_p, goto out; } - ret = 0; - /* * If the operation is either PVFS_SYS_CREATE or PVFS_SYS_MKDIR and the * outlen contains a positive value, then the dirent already exists: * return 1. */ + if ((smcb->op == PVFS_SYS_CREATE || smcb->op == PVFS_SYS_MKDIR) && - sm_p->msgarray_op.msgpair.osd_command.attr->outlen) { + sm_p->msgarray_op.msgpair.osd_command.attr->val) { ret = 1; gossip_debug(GOSSIP_CLIENT_DEBUG, "osd_dirops_attr4_lookup_comp_fn: dirent exists\n"); @@ -1090,6 +1090,7 @@ static PINT_sm_action osd_dirops_attr4_setup_insert_remove_msgpair( js_p->error_code = ret; } + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -1099,7 +1100,8 @@ static int osd_dirops_attr4_insert_remove_comp_fn(void *v_p, { PVFS_error status = 0; PINT_smcb *smcb = v_p; - PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); + int ret = 0; + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); gossip_debug(GOSSIP_CLIENT_DEBUG, "%s\n", __func__); @@ -1109,6 +1111,12 @@ static int osd_dirops_attr4_insert_remove_comp_fn(void *v_p, "%s: failed to insert/remove dirent %d\n", __func__, index); + ret = osd_command_attr_resolve(&sm_p->msgarray_op.msgpair.osd_command); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_resolve failed", __func__); + return ret; + } + /* free data alloced for the create, if this was an insert */ if (sm_p->msgarray_op.msgpair.osd_command.attr->len) free(sm_p->msgarray_op.msgpair.osd_command.attr->val); @@ -1195,6 +1203,7 @@ static PINT_sm_action osd_dirops_attr4_setup_unlock_msgpair( js_p->error_code = ret; } + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -1216,8 +1225,8 @@ static int osd_dirops_attr4_unlock_comp_fn(void *v_p, } /* osd_command.indata should contain the previous value of the lock */ - inbuf = (uint8_t *)sm_p->msgarray_op.msgpair.osd_command.indata; - outbuf = (uint8_t *)sm_p->msgarray_op.msgpair.osd_command.outdata; + inbuf = &(sm_p->msgarray_op.msgpair.osd_command.indata); + outbuf = &(sm_p->msgarray_op.msgpair.osd_command.outdata); assert(inbuf); assert(outbuf); diff --git a/src/client/sysint/sys-osd-io.sm b/src/client/sysint/sys-osd-io.sm index a470a86..e5db041 100644 --- a/src/client/sysint/sys-osd-io.sm +++ b/src/client/sysint/sys-osd-io.sm @@ -408,14 +408,14 @@ static int osd_io_setup_msgpairs(struct PINT_smcb *smcb, job_status_s *js_p) PINT_dist_encode(dist_buf, sm_p->getattr.attr.u.meta.dist); struct attribute_list attrs[] = { - {ATTR_SET, USER_COLL_PG, 1, &attrval, 8}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 0, &attr->owner, sizeof(PVFS_uid)}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 1, &attr->group, sizeof(PVFS_gid)}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 2, &attr->perms, sizeof(PVFS_permissions)}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 3, &attr->mask, sizeof(uint32_t)}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 4, &attr->objtype, sizeof(PVFS_ds_type)}, {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 5, dist_buf, PINT_DIST_PACK_SIZE(sm_p->getattr.attr.u.meta.dist)}, - {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 6, attr->u.meta.dfile_array, sizeof(PVFS_handle) * sm_p->getattr.attr.u.meta.dfile_count }}; + {ATTR_SET, PVFS_USEROBJECT_ATTR_PG, 6, attr->u.meta.dfile_array, sizeof(PVFS_handle) * sm_p->getattr.attr.u.meta.dfile_count }, + {ATTR_SET, USER_COLL_PG, 7, &attrval, 8}}; if(!sm_p->getattr.attr.cid) { sm_p->getattr.attr.cid = COLLECTION_OID_LB; /* root directory */ @@ -883,7 +883,7 @@ out: } static int osd_io_cleanup(struct PINT_smcb *smcb, job_status_s *js_p) -{ +{ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); struct PINT_client_io_sm *io = &sm_p->u.io; struct server_configuration_s *server_config; diff --git a/src/client/sysint/sys-readdir.sm b/src/client/sysint/sys-readdir.sm index 41bcbd2..1083b7a 100644 --- a/src/client/sysint/sys-readdir.sm +++ b/src/client/sysint/sys-readdir.sm @@ -22,9 +22,15 @@ #include "ncache.h" #include "pint-util.h" #include "pvfs2-internal.h" +#include "osd-util/osd-util.h" extern job_context_id pint_client_sm_context; + +enum { + OSD_MSGPAIR = 2001 +}; + static int readdir_msg_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int index); @@ -48,10 +54,18 @@ nested machine pvfs2_client_readdir_sm state readdir_msg_setup_msgpair { run readdir_msg_setup_msgpair; + OSD_MSGPAIR => readdir_msg_xfer_osd_msgpair; success => readdir_msg_xfer_msgpair; default => readdir_msg_failure; } + state readdir_msg_xfer_osd_msgpair + { + jump pvfs2_osd_msgpairarray_sm; + success => cleanup; + default => readdir_msg_failure; + } + state readdir_msg_xfer_msgpair { jump pvfs2_msgpairarray_sm; @@ -206,6 +220,7 @@ PVFS_error PVFS_sys_readdir( static PINT_sm_action readdir_init( struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("readdir_init\n"); struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); gossip_debug(GOSSIP_CLIENT_DEBUG, "readdir state: init\n"); @@ -224,6 +239,7 @@ static PINT_sm_action readdir_init( static PINT_sm_action readdir_msg_setup_msgpair( struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("readdir_msg_setup_msgpair\n"); struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); int ret = -PVFS_EINVAL; PINT_sm_msgpair_state *msg_p = NULL; @@ -255,19 +271,8 @@ static PINT_sm_action readdir_msg_setup_msgpair( PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; - PINT_SERVREQ_READDIR_FILL( - msg_p->req, - *sm_p->cred_p, - sm_p->object_ref.fs_id, - sm_p->object_ref.handle, - sm_p->u.readdir.pos_token, - sm_p->u.readdir.dirent_limit, - sm_p->hints); - 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 = readdir_msg_comp_fn; ret = PINT_cached_config_map_to_server( &msg_p->svr_addr, sm_p->object_ref.handle, @@ -279,6 +284,44 @@ static PINT_sm_action readdir_msg_setup_msgpair( js_p->error_code = ret; } + if (server_is_osd(msg_p->svr_addr)) { + uint64_t oid; + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; + + js_p->error_code = OSD_MSGPAIR; + + /* Retrieve all the directory entries */ + oid = sm_p->object_ref.handle; + ret = osd_command_set_get_attributes(command, PVFS_OSD_META_PID, oid); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_get_attributes failed", + __func__); + js_p->error_code = ret; + return 1; + } + + ret = osd_command_attr_all_build(command, PVFS_USEROBJECT_DIR_PG); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_all_build failed", + __func__); + js_p->error_code = ret; + return 1; + } + } else { + js_p->error_code = 0; + PINT_SERVREQ_READDIR_FILL( + msg_p->req, + *sm_p->cred_p, + sm_p->object_ref.fs_id, + sm_p->object_ref.handle, + sm_p->u.readdir.pos_token, + sm_p->u.readdir.dirent_limit, + sm_p->hints); + } + + msg_p->retry_flag = PVFS_MSGPAIR_RETRY; + msg_p->comp_fn = readdir_msg_comp_fn; + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -287,37 +330,91 @@ static int readdir_msg_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index) { + int ret = 0; PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); + PINT_sm_msgpair_state *msg_p = &sm_p->msgarray_op.msgpair; gossip_debug(GOSSIP_CLIENT_DEBUG, "readdir_msg_comp_fn\n"); - assert(resp_p->op == PVFS_SERV_READDIR); + if (server_is_osd(msg_p->svr_addr)) { + int i = 0, dirent_array_len = 0; + struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; - if (resp_p->status != 0) - { - return resp_p->status; - } + ret = osd_errno_from_status(command->status); + if (ret != 0) { + return ret; + } - /* convert servresp_readdir response to a sysresp_readdir obj */ + ret = osd_command_attr_all_resolve(command); + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_attr_all_resolve failed", + __func__); + return ret; + } - *(sm_p->readdir.token) = resp_p->u.readdir.token; - *(sm_p->readdir.directory_version) = - resp_p->u.readdir.directory_version; - *(sm_p->readdir.dirent_outcount) = - resp_p->u.readdir.dirent_count; - if (*(sm_p->readdir.dirent_outcount) > 0) - { - int dirent_array_len = - (sizeof(PVFS_dirent) * *(sm_p->readdir.dirent_outcount)); + /* + * XXX readdir.token and readdir.directory_version are used when we + * use multiple passes to retrieve the dirents. For now, we retrieve + * all the dirents in a single pass. So we don't really need token and + * directory_version. + */ + *(sm_p->readdir.token) = 0; + *(sm_p->readdir.directory_version) = 0; + *(sm_p->readdir.dirent_outcount) = command->numattr; + + dirent_array_len = command->numattr * sizeof(PVFS_dirent); - /* this dirent_array MUST be freed by caller */ - *(sm_p->readdir.dirent_array) = - (PVFS_dirent *) malloc(dirent_array_len); + /* The dirent_array must be freed by caller */ + *(sm_p->readdir.dirent_array) = malloc(dirent_array_len); assert(*(sm_p->readdir.dirent_array)); - memcpy(*(sm_p->readdir.dirent_array), - resp_p->u.readdir.dirent_array, dirent_array_len); + /* populate dirent_array */ + for (i = 0; i < command->numattr; i++) { + PVFS_dirent *dirent = &(*sm_p->readdir.dirent_array)[i]; + + if (command->attr[i].outlen < 9) { + gossip_err("%s: short dirent %d/%d len %d\n", __func__, + i, command->numattr, command->attr[i].outlen); + *(sm_p->readdir.dirent_outcount) = 0; + return -EINVAL; + } + dirent->handle = get_ntohll(command->attr[i].val); + memcpy(dirent->d_name, (uint8_t *)command->attr[i].val + 8, + command->attr[i].outlen - 8); + dirent->d_name[command->attr[i].outlen - 8] = '\0'; + } + + /* free the returned attributes */ + osd_command_attr_all_free(command); + } else { + assert(resp_p->op == PVFS_SERV_READDIR); + + if (resp_p->status != 0) + { + return resp_p->status; + } + + /* convert servresp_readdir response to a sysresp_readdir obj */ + + *(sm_p->readdir.token) = resp_p->u.readdir.token; + *(sm_p->readdir.directory_version) = + resp_p->u.readdir.directory_version; + *(sm_p->readdir.dirent_outcount) = + resp_p->u.readdir.dirent_count; + if (*(sm_p->readdir.dirent_outcount) > 0) + { + int dirent_array_len = + (sizeof(PVFS_dirent) * *(sm_p->readdir.dirent_outcount)); + + /* this dirent_array MUST be freed by caller */ + *(sm_p->readdir.dirent_array) = + (PVFS_dirent *) malloc(dirent_array_len); + assert(*(sm_p->readdir.dirent_array)); + + memcpy(*(sm_p->readdir.dirent_array), + resp_p->u.readdir.dirent_array, dirent_array_len); + } } gossip_debug(GOSSIP_READDIR_DEBUG, "*** Got %d directory entries " diff --git a/src/client/sysint/sys-readdirplus.sm b/src/client/sysint/sys-readdirplus.sm index 55edd73..428406c 100644 --- a/src/client/sysint/sys-readdirplus.sm +++ b/src/client/sysint/sys-readdirplus.sm @@ -496,6 +496,7 @@ static int list_of_meta_servers(PINT_client_sm *sm_p) static PINT_sm_action readdirplus_fetch_attrs_setup_msgpair(struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("readdirplus_fetch_attrs_setup_msgpair\n"); int i, ret; struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); PINT_sm_msgpair_state *msg_p = NULL; @@ -590,14 +591,18 @@ static int readdirplus_fetch_attrs_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index) { + gossip_err("readdirplus_fetch_attrs_comp_fn\n"); PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); gossip_debug(GOSSIP_LISTATTR_DEBUG, "readdirplus_fetch_attrs_comp_fn called\n"); + + gossip_err("status: %d\n", sm_p->msgarray_op.msgarray[index].op_status); assert(resp_p->op == PVFS_SERV_LISTATTR); /* Mark all handles in this server range as having failed a stat */ + gossip_err("status: %d\n", sm_p->msgarray_op.msgarray[index].op_status); if (sm_p->msgarray_op.msgarray[index].op_status != 0) { int i, handle_index; for (i = 0; i < sm_p->u.readdirplus.handle_count[index]; i++) { @@ -750,6 +755,7 @@ static int list_of_data_servers(PINT_client_sm *sm_p) static PINT_sm_action readdirplus_fetch_sizes_setup_msgpair( struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("readdirplus_fetch_sizes_setup_msgpair\n"); int i, ret; struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); PINT_sm_msgpair_state *msg_p; @@ -811,7 +817,6 @@ static PINT_sm_action readdirplus_fetch_sizes_setup_msgpair( struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; - gossip_err("msg_p->handle: %d\n", msg_p->handle); ret = osd_command_set_get_member_attributes(command, PVFS_OSD_DATA_PID, sm_p->object_ref.cid, msg_p->handle); if (ret) { osd_error_xerrno(ret, "%s: osd_command_set_get_member_attributes failed", diff --git a/src/client/sysint/sys-remove.sm b/src/client/sysint/sys-remove.sm index e16d89a..5afd525 100644 --- a/src/client/sysint/sys-remove.sm +++ b/src/client/sysint/sys-remove.sm @@ -45,7 +45,8 @@ enum { RMDIRENT_RETRY = 1, CRDIRENT_RETRY, - RETURN_STORED_ERROR_CODE + RETURN_STORED_ERROR_CODE, + OSD_MSGPAIR = 2001 }; static int remove_rmdirent_comp_fn( @@ -73,10 +74,18 @@ machine pvfs2_client_remove_sm state rmdirent_setup_msgpair { run remove_rmdirent_setup_msgpair; + OSD_MSGPAIR => rmdirent_osd_msgpair; success => rmdirent_xfer_msgpair; default => rmdirent_retry_or_fail; } + state rmdirent_osd_msgpair + { + jump pvfs2_client_osd_dirops_sm; + success => do_remove; + default => rmdirent_retry_or_fail; + } + state rmdirent_xfer_msgpair { jump pvfs2_msgpairarray_sm; @@ -263,28 +272,11 @@ static PINT_sm_action remove_rmdirent_setup_msgpair( gossip_debug(GOSSIP_CLIENT_DEBUG, "remove state: rmdirent_setup_msgpair\n"); - js_p->error_code = 0; - PINT_msgpair_init(&sm_p->msgarray_op); msg_p = &sm_p->msgarray_op.msgpair; - PINT_SERVREQ_RMDIRENT_FILL( - msg_p->req, - *sm_p->cred_p, - sm_p->parent_ref.fs_id, - sm_p->parent_ref.handle, - sm_p->u.remove.object_name, - sm_p->hints); - - gossip_debug(GOSSIP_REMOVE_DEBUG, "- doing RMDIRENT on %s " - "under %llu,%d\n", sm_p->u.remove.object_name, - llu(sm_p->parent_ref.handle), - sm_p->parent_ref.fs_id); - msg_p->fs_id = sm_p->parent_ref.fs_id; msg_p->handle = sm_p->parent_ref.handle; - msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; - msg_p->comp_fn = remove_rmdirent_comp_fn; ret = PINT_cached_config_map_to_server( &msg_p->svr_addr, msg_p->handle, msg_p->fs_id); @@ -292,9 +284,37 @@ static PINT_sm_action remove_rmdirent_setup_msgpair( if (ret) { gossip_err("Failed to map meta server address\n"); - js_p->error_code = ret; + js_p->error_code = ret; } + if (server_is_osd(msg_p->svr_addr)) { + /* + * Directory operations for metafile and mdfile. We don't do anything + * here because we'll handle the individual directory operations in a + * different state machine. + */ + js_p->error_code = OSD_MSGPAIR; + return SM_ACTION_COMPLETE; + } else { + /* If the parent directory is /pvfs, let regular pvfs handle dirent */ + js_p->error_code = 0; + PINT_SERVREQ_RMDIRENT_FILL( + msg_p->req, + *sm_p->cred_p, + sm_p->parent_ref.fs_id, + sm_p->parent_ref.handle, + sm_p->u.remove.object_name, + sm_p->hints); + } + + gossip_debug(GOSSIP_REMOVE_DEBUG, "- doing RMDIRENT on %s " + "under %llu,%d\n", sm_p->u.remove.object_name, + llu(sm_p->parent_ref.handle), + sm_p->parent_ref.fs_id); + + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = remove_rmdirent_comp_fn; + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } @@ -355,26 +375,34 @@ static int remove_rmdirent_comp_fn( struct PVFS_server_resp *resp_p, int index) { + int status; PINT_smcb *smcb = v_p; PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); - - assert(resp_p->op == PVFS_SERV_RMDIRENT); - - if (resp_p->status == 0) - { - assert(resp_p->u.rmdirent.entry_handle != PVFS_HANDLE_NULL); - assert(sm_p->parent_ref.fs_id != PVFS_FS_ID_NULL); - - /* pull handle out of response, also copy in fs_id from before */ - sm_p->object_ref.handle = resp_p->u.rmdirent.entry_handle; - sm_p->object_ref.fs_id = sm_p->parent_ref.fs_id; - - gossip_debug( - GOSSIP_CLIENT_DEBUG, - " remove_rmdirent_comp_fn: metafile handle = %llu\n", - llu(sm_p->object_ref.handle)); + PINT_sm_msgpair_state *msg_p = &sm_p->msgarray_op.msgpair; + + if (server_is_osd(msg_p->svr_addr)) { + status = osd_errno_from_status(sm_p->msgarray_op.msgpair.osd_command.status); + } else { + assert(resp_p->op == PVFS_SERV_RMDIRENT); + status = resp_p->status; + + if (status == 0) + { + assert(resp_p->u.rmdirent.entry_handle != PVFS_HANDLE_NULL); + assert(sm_p->parent_ref.fs_id != PVFS_FS_ID_NULL); + + /* pull handle out of response, also copy in fs_id from before */ + sm_p->object_ref.handle = resp_p->u.rmdirent.entry_handle; + sm_p->object_ref.fs_id = sm_p->parent_ref.fs_id; + } } - return resp_p->status; + + gossip_debug( + GOSSIP_CLIENT_DEBUG, + " remove_rmdirent_comp_fn: metafile handle = %llu\n", + llu(sm_p->object_ref.handle)); + + return status; } static int remove_crdirent_comp_fn( diff --git a/src/client/sysint/sys-setattr.sm b/src/client/sysint/sys-setattr.sm index a80ef50..c84bc9c 100644 --- a/src/client/sysint/sys-setattr.sm +++ b/src/client/sysint/sys-setattr.sm @@ -232,7 +232,7 @@ static PINT_sm_action setattr_msg_setup_msgpair( int is_osd_md = fsid_is_osd_md(sm_p->object_ref.fs_id); int is_osd_meta = fsid_is_osd_meta(sm_p->object_ref.fs_id); - js_p->error_code = (is_osd_meta || (is_osd_md && !(sm_p->u.setattr.sys_attr.objtype & PVFS_TYPE_DIRECTORY))) ? OSD_MSGPAIR : 0; + js_p->error_code = (is_osd_meta || is_osd_md ) ? OSD_MSGPAIR : 0; gossip_debug(GOSSIP_CLIENT_DEBUG," setattr: posting setattr req\n"); @@ -242,8 +242,8 @@ static PINT_sm_action setattr_msg_setup_msgpair( objtype = ((sm_p->u.setattr.sys_attr.mask & PVFS_ATTR_SYS_TYPE) ? sm_p->u.setattr.sys_attr.objtype : PVFS_TYPE_NONE); - /* if we have a directory object and osd_md, the dir object still exists in pvfs mds*/ - if (is_osd_meta || (is_osd_md && !(sm_p->u.setattr.sys_attr.objtype & PVFS_TYPE_DIRECTORY))) { + /* if we have a pvfs dir mds and osd_md, the dir object still exists in pvfs mds*/ + if (is_osd_meta || is_osd_md) { /* * Fill in the metadata as attributes of the datafile. A list of * attributes that PVFS2 currently stores in the MDS can be found here: @@ -280,8 +280,6 @@ static PINT_sm_action setattr_msg_setup_msgpair( PVFS_ATTR_COMMON_ATIME | PVFS_ATTR_COMMON_CTIME | PVFS_ATTR_COMMON_MTIME | - PVFS_ATTR_META_DIST | - PVFS_ATTR_META_DFILES | PVFS_ATTR_COMMON_TYPE; attr[3].val = &sm_p->u.setattr.sys_attr.mask; attr[3].len = sizeof(uint32_t); @@ -291,7 +289,7 @@ static PINT_sm_action setattr_msg_setup_msgpair( attr[4].len = sizeof(PVFS_ds_type); oid = sm_p->object_ref.handle; - ret = osd_command_set_set_attributes(command, is_osd_md ? PVFS_OSD_DATA_PID : PVFS_OSD_META_PID, oid); + ret = osd_command_set_set_attributes(command, (is_osd_md && (sm_p->u.setattr.sys_attr.objtype != PVFS_TYPE_DIRECTORY)) ? PVFS_OSD_DATA_PID : PVFS_OSD_META_PID, oid); if (ret) { osd_error_xerrno(ret, "%s: osd_command_set_set_attributes failed", __func__); diff --git a/src/common/misc/msgpairarray.sm b/src/common/misc/msgpairarray.sm index 47f75e1..c2c80d3 100644 --- a/src/common/misc/msgpairarray.sm +++ b/src/common/misc/msgpairarray.sm @@ -105,6 +105,7 @@ nested machine pvfs2_msgpairarray_sm static PINT_sm_action msgpairarray_init( struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("msgpairarray_init\n"); PINT_sm_msgarray_op *mop = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); int i = 0; PINT_sm_msgpair_state *msg_p = NULL; @@ -230,6 +231,7 @@ static PINT_sm_action msgpairarray_post( try_next_encoding: assert(ENCODING_IS_VALID(msg_p->enc_type)); + gossip_err("svr_addr: %d\n", msg_p->svr_addr); ret = PINT_encode(&msg_p->req, PINT_ENCODE_REQ, &msg_p->encoded_req, msg_p->svr_addr, msg_p->enc_type); diff --git a/src/common/misc/pint-cached-config.c b/src/common/misc/pint-cached-config.c index 67ab1f1..ee1feb0 100644 --- a/src/common/misc/pint-cached-config.c +++ b/src/common/misc/pint-cached-config.c @@ -512,6 +512,9 @@ int PINT_cached_config_get_next_meta( cur_config_cache->meta_server_cursor = cur_config_cache->fs->meta_handle_ranges; + cur_mapping = PINT_llist_head( + cur_config_cache->meta_server_cursor); + while(randsrv--) { cur_config_cache->meta_server_cursor = PINT_llist_next( @@ -528,17 +531,20 @@ int PINT_cached_config_get_next_meta( break; } + cur_mapping = PINT_llist_head( + cur_config_cache->meta_server_cursor); + /* first jitter across all, regardless of acceptability, then * keep looping until find one that matches */ if (randsrv == 0) + { if (want_osd ^ alias_is_osd(cur_mapping->alias_mapping->bmi_address)) continue; + } + --randsrv; } - cur_mapping = PINT_llist_head( - cur_config_cache->meta_server_cursor); - meta_server_bmi_str = cur_mapping->alias_mapping->bmi_address; ext_array->extent_count = diff --git a/src/common/misc/server-config.c b/src/common/misc/server-config.c index 169d806..a64a6ac 100644 --- a/src/common/misc/server-config.c +++ b/src/common/misc/server-config.c @@ -1133,7 +1133,7 @@ int PINT_parse_config( config_s->private_data = configfile; configfile->errorhandler = (dotconf_errorhandler_t)errorhandler; configfile->contextchecker = (dotconf_contextchecker_t)contextchecker; - + if(PINT_dotconf_command_loop(configfile) == 0) { /* NOTE: dotconf error handler will log message */ diff --git a/src/io/bmi/bmi.c b/src/io/bmi/bmi.c index 19d5942..de51f79 100644 --- a/src/io/bmi/bmi.c +++ b/src/io/bmi/bmi.c @@ -1639,7 +1639,6 @@ int BMI_query_addr_range (BMI_addr_t addr, const char *id_string, int netmask) int BMI_addr_lookup(BMI_addr_t * new_addr, const char *id_string) { - ref_st_p new_ref = NULL; bmi_method_addr_p meth_addr = NULL; int ret = -1; diff --git a/src/io/bmi/bmi_osd/osd.c b/src/io/bmi/bmi_osd/osd.c index 5776f14..6515e3b 100644 --- a/src/io/bmi/bmi_osd/osd.c +++ b/src/io/bmi/bmi_osd/osd.c @@ -421,7 +421,7 @@ static struct osd_connection *new_connection(PVFS_BMI_addr_t addr) c->pfs_index = -1; for (i=0; i