diff --git a/src/client/sysint/sys-create.sm b/src/client/sysint/sys-create.sm index eeda35b..fc800a6 100644 --- a/src/client/sysint/sys-create.sm +++ b/src/client/sysint/sys-create.sm @@ -130,25 +130,10 @@ machine pvfs2_client_create_sm state datafiles_xfer_osd_msgpair_array { jump pvfs2_osd_msgpairarray_sm; - /*success => test_fetch_attrs;*/ success => create_setattr_setup_msgpair; default => crdirent_failure; } - state test_fetch_attrs - { - run test_fetch_attrs_func; - success => test_fetch_attrs_xfer_msgpair; - default => cleanup; - } - - state test_fetch_attrs_xfer_msgpair - { - jump pvfs2_osd_msgpairarray_sm; - success => create_setattr_setup_msgpair; - default => cleanup; - } - state create_setattr_setup_msgpair { run create_setattr_setup_msgpair; @@ -501,43 +486,6 @@ static int create_comp_fn(void *v_p, return 0; } -static int test_fetch_attrs_comp_fn(void *v_p, - struct PVFS_server_resp *resp_p, - int index) -{ - gossip_err("test_fetch_attrs_comp_fn\n"); - PINT_smcb *smcb = v_p; - PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); - PVFS_error status; - int64_t size[sm_p->msgarray_op.count]; - int i; - - status = osd_errno_from_status( - sm_p->msgarray_op.msgarray[index].osd_command.status); - - if (status != 0) - { - return status; - } - - struct osd_command *command = &sm_p->msgarray_op.msgarray[index].osd_command; - int ret = osd_command_attr_resolve(command); - if (ret) { - osd_error_xerrno(ret, "%s: osd_command_attr_resolve failed", - __func__); - return ret; - } - - for (i=0; imsgarray_op.count; i++) { - size[i] = get_ntohll(command->attr[i].val); - gossip_err("%lu\n", size[i]); - } - - osd_command_attr_free(command); - - return 0; -} - static int create_datafiles_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index) @@ -852,103 +800,56 @@ static PINT_sm_action create_datafiles_setup_msgpair_array( return SM_ACTION_COMPLETE; } - PINT_msgpair_init(&sm_p->msgarray_op); - msg_p = &sm_p->msgarray_op.msgpair; + if(server_config->post_create) { + 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) { - struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; - uint64_t attrval; - struct attribute_list attrs[] = {{ ATTR_GET, CUR_CMD_ATTR_PG, + if (is_osd) { + struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; + uint64_t attrval; + struct attribute_list attrs[] = {{ ATTR_GET, CUR_CMD_ATTR_PG, CCAP_OID, NULL, CCAP_OID_LEN }, { ATTR_SET, USER_COLL_PG, 1, &attrval, 8}}; - set_htonll(&attrval, COLLECTION_OID_LB); + set_htonll(&attrval, COLLECTION_OID_LB); - /* - * A hack in PVFS_util_init_defaults has set up an object an the - * low bound of the extent array. So as we create handles, we get - * them in increasing order that satisfies our extent bounds. - */ - ret = osd_command_set_create(command, PVFS_OSD_DATA_PID, 0, 1); - if (ret) { - osd_error_xerrno(ret, "%s: osd_command_set_create failed", + /* + * A hack in PVFS_util_init_defaults has set up an object an the + * low bound of the extent array. So as we create handles, we get + * them in increasing order that satisfies our extent bounds. + */ + 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__); - js_p->error_code = ret; - return 1; - } + js_p->error_code = ret; + return 1; + } - ret = osd_command_attr_build(command, attrs, 2); - if (ret) { - osd_error_xerrno(ret, "%s: osd_command_attr_build failed", + ret = osd_command_attr_build(command, attrs, 2); + 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->handle = sm_p->u.create.io_handle_extent_array[0]. - extent_array[0].first; - msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; - msg_p->comp_fn = create_datafiles_comp_fn; - 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 PINT_sm_action test_fetch_attrs_func( - struct PINT_smcb *smcb, job_status_s *js_p) -{ - gossip_err("test_fetch_attrs_func\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; - int i; - - js_p->error_code = 0; - - PINT_msgpair_init(&sm_p->msgarray_op); - msg_p = &sm_p->msgarray_op.msgpair; + js_p->error_code = ret; + return 1; + } + } - msg_p->fs_id = sm_p->object_ref.fs_id; - msg_p->handle = sm_p->u.create.io_handle_extent_array[0]. + msg_p->fs_id = sm_p->object_ref.fs_id; + msg_p->handle = sm_p->u.create.io_handle_extent_array[0]. extent_array[0].first; - msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; - msg_p->comp_fn = test_fetch_attrs_comp_fn; - msg_p->svr_addr = sm_p->u.create.data_server_addrs[0]; - - struct attribute_list attr[sm_p->msgarray_op.count]; - struct osd_command *command = &sm_p->msgarray_op.msgpair.osd_command; - - /* Set attr type, page and number */ - for (i = 0; i < sm_p->msgarray_op.count; i++) { - attr[i].type = ATTR_GET; - attr[i].page = 0x1; - attr[i].number = 0x82; /* logical length (not used capacity) */ - attr[i].len = sizeof(uint64_t); - } + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = create_datafiles_comp_fn; + msg_p->svr_addr = sm_p->u.create.data_server_addrs[0]; - ret = osd_command_set_get_member_attributes(command, PVFS_OSD_DATA_PID, COLLECTION_OID_LB); - if (ret) { - osd_error_xerrno(ret, "%s: osd_command_set_get_member_attributes failed", - __func__); - js_p->error_code = ret; - return 1; - } - - ret = osd_command_attr_build(command, attr, sm_p->msgarray_op.count); - if (ret) { - osd_error_xerrno(ret, "%s: osd_command_attr_build failed", - __func__); - js_p->error_code = ret; - return 1; + PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); + } else { + js_p->error_code = 0; } - PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op); return SM_ACTION_COMPLETE; } diff --git a/src/client/sysint/sys-getattr.sm b/src/client/sysint/sys-getattr.sm index 70757e5..c9b39ad 100644 --- a/src/client/sysint/sys-getattr.sm +++ b/src/client/sysint/sys-getattr.sm @@ -51,7 +51,8 @@ enum GETATTR_ACACHE_MISS = 1, GETATTR_NEED_DATAFILE_SIZES = 2, GETATTR_IO_RETRY = 3, - OSD_MSGPAIR = 2001 + OSD_MSGPAIR = 2001, + IO_DO_OSD = 2002 }; /* completion function prototypes */ @@ -106,6 +107,7 @@ nested machine pvfs2_client_getattr_sm run getattr_acache_lookup; GETATTR_ACACHE_MISS => object_getattr_setup_msgpair; GETATTR_NEED_DATAFILE_SIZES => datafile_get_sizes; + IO_DO_OSD => acache_insert; default => cleanup; } @@ -359,6 +361,13 @@ static PINT_sm_action getattr_acache_lookup( &attr_status, &sm_p->getattr.size, &size_status); + + if(sm_p->u.io.io_type == PVFS_IO_WRITE && !sm_p->getattr.attr.u.meta.dfile_count) { + /* the object that we are trying to write to has not been created */ + js_p->error_code = IO_DO_OSD; + return SM_ACTION_COMPLETE; + } + if(ret < 0 || attr_status < 0) { gossip_debug(GOSSIP_ACACHE_DEBUG, "acache: clean acache miss: " @@ -1428,7 +1437,7 @@ static PINT_sm_action getattr_cleanup( free(getattr->size_array); /* cleanup getattr when an error occurs */ - if (js_p->error_code) + if (js_p->error_code && js_p->error_code != IO_DO_OSD) { if (getattr->attr.mask & PVFS_ATTR_META_DFILES) { diff --git a/src/client/sysint/sys-io.sm b/src/client/sysint/sys-io.sm index b542afb..78a435e 100644 --- a/src/client/sysint/sys-io.sm +++ b/src/client/sysint/sys-io.sm @@ -24,15 +24,16 @@ #include "PINT-reqproto-encode.h" #include "pint-util.h" #include "pvfs2-internal.h" +#include "osd-util/osd-util.h" #define IO_MAX_SEGMENT_NUM 50 #define IO_ATTR_MASKS (PVFS_ATTR_META_ALL|PVFS_ATTR_COMMON_TYPE) extern job_context_id pint_client_sm_context; -enum -{ - IO_DO_OSD_IO = 2001 +enum { + IO_DO_OSD_IO = 2001, + IO_OSD_NOT_CREATED = 2002 }; enum @@ -169,6 +170,7 @@ machine pvfs2_client_io_sm { jump pvfs2_client_getattr_sm; success => inspect_attr; + IO_OSD_NOT_CREATED => osd_io; default => io_cleanup; } diff --git a/src/client/sysint/sys-mkdir.sm b/src/client/sysint/sys-mkdir.sm index 19e578f..9ac5c07 100644 --- a/src/client/sysint/sys-mkdir.sm +++ b/src/client/sysint/sys-mkdir.sm @@ -26,13 +26,15 @@ #include "pint-util.h" #include "ncache.h" #include "pvfs2-internal.h" +#include "osd-util/osd-util.h" extern job_context_id pint_client_sm_context; enum { MKDIR_RETRY = 180, - MKDIR_SKIP_EATTR = 181 + MKDIR_SKIP_EATTR = 181, + OSD_MKDIR_MSGPAIR = 2001 }; static int mkdir_msg_comp_fn( @@ -41,6 +43,9 @@ static int mkdir_crdirent_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int index); static int mkdir_delete_handle_comp_fn( void *v_p, struct PVFS_server_resp *resp_p, int index); +static int create_collection_comp_fn(void *v_p, + struct PVFS_server_resp *resp_p, + int index); %% @@ -117,6 +122,20 @@ machine pvfs2_client_mkdir_sm state mkdir_crdirent_xfer_msgpair { jump pvfs2_msgpairarray_sm; + success => create_collection; + default => mkdir_crdirent_failure; + } + + state create_collection + { + run create_collection_setup_msgpair; + success => create_collection_xfer_msgpair; + default => mkdir_crdirent_failure; + } + + state create_collection_xfer_msgpair + { + jump pvfs2_osd_msgpairarray_sm; success => cleanup; default => mkdir_crdirent_failure; } @@ -393,6 +412,118 @@ static PINT_sm_action mkdir_msg_failure( return SM_ACTION_COMPLETE; } +static PINT_sm_action create_collection_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 = NULL; + struct server_configuration_s *server_config; + PINT_llist *cur = NULL; + struct host_alias_s *cur_alias; + PVFS_BMI_addr_t addr; + int is_osd = fsid_is_osd(sm_p->object_ref.fs_id); + + gossip_debug(GOSSIP_CLIENT_DEBUG, + "mkdir state: create_collection_setup_msgpair\n"); + + js_p->error_code = 0; + + if (!is_osd) { + return SM_ACTION_COMPLETE; + } + + server_config = PINT_get_server_config_struct( + sm_p->object_ref.fs_id); + PINT_put_server_config_struct(server_config); + + cur = server_config->host_aliases; + while(cur) + { + cur_alias = PINT_llist_head(cur); + if (!cur_alias) + { + break; + } + if(!strncmp(cur_alias->bmi_address, "osd", 3)) { + BMI_addr_lookup(&addr,cur_alias->bmi_address); + } + + cur = PINT_llist_next(cur); + } + + PINT_msgpair_init(&sm_p->msgarray_op); + msg_p = &sm_p->msgarray_op.msgpair; + + msg_p->fs_id = sm_p->object_ref.fs_id; + msg_p->retry_flag = PVFS_MSGPAIR_RETRY; + msg_p->svr_addr = addr; + msg_p->comp_fn = create_collection_comp_fn; + + 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 }; + + gossip_err("handle_mkdir: %d\n", sm_p->u.mkdir.metafile_handle); + + ret = osd_command_set_create_collection(command, PVFS_OSD_DATA_PID, 0); + + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_create_collection failed", + __func__); + js_p->error_code = ret; + 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; +} + +static int create_collection_comp_fn(void *v_p, + struct PVFS_server_resp *resp_p, + int index) +{ + PINT_smcb *smcb = v_p; + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); + PVFS_error status; + int ret; + int is_osd = fsid_is_osd(sm_p->object_ref.fs_id); + + gossip_debug(GOSSIP_CLIENT_DEBUG, "create_collection_comp_fn\n"); + + if (is_osd) { + status = osd_errno_from_status( + sm_p->msgarray_op.msgarray[index].osd_command.status); + } else { + assert(resp_p->op == PVFS_SERV_CRDIRENT); + status = resp_p->status; + } + + if (status != 0) + { + 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__); + } + + get_ntohll(sm_p->msgarray_op.msgpair.osd_command.attr[0].val); + + osd_command_attr_free(&sm_p->msgarray_op.msgpair.osd_command); + return 0; +} + static PINT_sm_action mkdir_crdirent_setup_msgpair( struct PINT_smcb *smcb, job_status_s *js_p) { diff --git a/src/client/sysint/sys-osd-io.sm b/src/client/sysint/sys-osd-io.sm index 167ec65..c82048f 100755 --- a/src/client/sysint/sys-osd-io.sm +++ b/src/client/sysint/sys-osd-io.sm @@ -36,10 +36,14 @@ enum { LOOP_NEXT_CHUNK = 1012, + OSD_CREATE_WRITE = 2001 }; static int osd_io_completion_fn(void *user_args, struct PVFS_server_resp *resp_p, int index); +static int create_and_write_comp_fn(void *v_p, + struct PVFS_server_resp *resp_p, + int index); %% @@ -49,9 +53,22 @@ nested machine pvfs2_client_osd_io_sm { run osd_io_init; success => setup_msgpairs; + OSD_CREATE_WRITE => create_and_write; default => return; } + state create_and_write + { + run create_and_write_setup_msgpair; + default => xfer_create_and_write; + } + + state xfer_create_and_write + { + jump pvfs2_osd_msgpairarray_sm; + default => cleanup; + } + state setup_msgpairs { run osd_io_setup_msgpairs; @@ -96,6 +113,12 @@ static int osd_io_init(struct PINT_smcb *smcb, job_status_s *js_p) PVFS_object_attr *attr = &sm_p->getattr.attr; int i, ret; + if(io->buffer && !io->datafile_count) { + /* object has not been created */ + js_p->error_code = OSD_CREATE_WRITE; + return SM_ACTION_COMPLETE; + } + ret = PINT_msgpairarray_init(&sm_p->msgarray_op, io->datafile_count); if (ret) goto out; @@ -601,6 +624,150 @@ out: return 1; } +static PINT_sm_action create_and_write_setup_msgpair( + struct PINT_smcb *smcb, job_status_s *js_p) +{ + gossip_err("create_and_write_setup_msgpair\n"); + struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); + int ret = -PVFS_EINVAL; + struct server_configuration_s *server_config; + int is_osd; + uint32_t len; + PINT_sm_msgpair_state *msg_p = NULL; + + server_config = PINT_get_server_config_struct( + sm_p->object_ref.fs_id); + PINT_put_server_config_struct(server_config); + is_osd = (server_config->osd_type != OSD_NONE); + + js_p->error_code = 0; + + len = sm_p->u.io.mem_req->aggregate_size - sm_p->u.io.file_req_offset; + + sm_p->u.io.datafile_count = 1; + sm_p->u.create.layout.algorithm = PVFS_SYS_LAYOUT_ROUND_ROBIN; + + /* allocate handle extent array objects */ + if (sm_p->u.create.io_handle_extent_array == NULL) + { + sm_p->u.create.io_handle_extent_array = (PVFS_handle_extent_array *) + malloc(sm_p->u.create.num_data_files * + sizeof(PVFS_handle_extent_array)); + } + if (!sm_p->u.create.io_handle_extent_array) + { + gossip_err("create: failed to allocate handle_extent_array\n"); + js_p->error_code = -PVFS_ENOMEM; + return SM_ACTION_COMPLETE; + } + + /* allocate data server bmi address array */ + if (sm_p->u.create.data_server_addrs == NULL) + { + sm_p->u.create.data_server_addrs = (PVFS_BMI_addr_t *)malloc( + sm_p->u.create.num_data_files * sizeof(PVFS_BMI_addr_t)); + } + if (!sm_p->u.create.data_server_addrs) + { + gossip_err("create: failed to allocate data server addrs\n"); + 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.io.datafile_count, + &sm_p->u.create.layout, + sm_p->u.create.data_server_addrs, + sm_p->u.create.io_handle_extent_array); + + if(ret < 0) + { + gossip_err("create: failed to map the layout to a set of IO servers\n"); + js_p->error_code = ret; + return 1; + } + + if (ret) + { + gossip_err("Failed to retrieve data server addresses\n"); + js_p->error_code = ret; + return SM_ACTION_COMPLETE; + } + + 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) { + struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; + uint64_t attrval; + struct attribute_list attrs[] = {{ ATTR_GET, CUR_CMD_ATTR_PG, CCAP_OID, NULL, CCAP_OID_LEN }, + { ATTR_SET, USER_COLL_PG, 1, &attrval, 8}}; + + set_htonll(&attrval, COLLECTION_OID_LB); + + ret = osd_command_set_create_and_write(command, PVFS_OSD_DATA_PID, 0, len, 0); + command->outdata = sm_p->u.io.buffer; + command->outlen = len; + + if (ret) { + osd_error_xerrno(ret, "%s: osd_command_set_create failed", + __func__); + js_p->error_code = ret; + return 1; + } + + ret = osd_command_attr_build(command, attrs, 2); + 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->handle = sm_p->u.create.io_handle_extent_array[0]. + extent_array[0].first; + msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY; + msg_p->comp_fn = create_and_write_comp_fn; + 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_and_write_comp_fn(void *v_p, + struct PVFS_server_resp *resp_p, + int index) +{ + PVFS_error status; + PINT_smcb *smcb = v_p; + PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM); + int ret; + + status = osd_errno_from_status( + sm_p->msgarray_op.msgarray[index].osd_command.status); + + if (status != 0) + { + PVFS_perror_gossip("osd io failure", status); + 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__); + } + + gossip_err("%d\n", get_ntohll(sm_p->msgarray_op.msgarray[index].osd_command.attr[0].val)); + + return 0; +} + /** * We assume that the response buffer hasn't been freed yet (before the * completion function is called. The msgpairarray.sm doesn't free the @@ -818,8 +985,11 @@ out: static int osd_io_cleanup(struct PINT_smcb *smcb, job_status_s *js_p) { + gossip_err("osd_io_cleanup\n"); struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); struct PINT_client_io_sm *io = &sm_p->u.io; + int skip = 0; + if(skip) { free(sm_p->msgarray_op.msgarray); sm_p->msgarray_op.msgarray = NULL; sm_p->msgarray_op.count = 0; @@ -831,6 +1001,8 @@ static int osd_io_cleanup(struct PINT_smcb *smcb, job_status_s *js_p) /* return this to PVFS_sys_io */ io->io_resp_p->total_completed = sm_p->u.io.total_size; + } + io->io_resp_p->total_completed = sm_p->u.io.mem_req->aggregate_size - sm_p->u.io.file_req_offset;; return 1; } diff --git a/src/client/sysint/sys-readdirplus.sm b/src/client/sysint/sys-readdirplus.sm index 16585c9..a603213 100644 --- a/src/client/sysint/sys-readdirplus.sm +++ b/src/client/sysint/sys-readdirplus.sm @@ -46,6 +46,8 @@ static int readdirplus_fetch_sizes_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, int index); +static uint64_t find_min_handle(struct handle_to_index *input_handle_array, int nhandles); + %% machine pvfs2_client_readdirplus_sm @@ -766,7 +768,7 @@ static PINT_sm_action readdirplus_fetch_sizes_setup_msgpair( return SM_ACTION_COMPLETE; } - ret = PINT_msgpairarray_init(&sm_p->msgarray_op, sm_p->u.readdirplus.nhandles); + ret = PINT_msgpairarray_init(&sm_p->msgarray_op, sm_p->u.readdirplus.svr_count); if(ret != 0) { gossip_err("Failed to initialize %d msgpairs\n", @@ -784,7 +786,12 @@ static PINT_sm_action readdirplus_fetch_sizes_setup_msgpair( msg_p->retry_flag = PVFS_MSGPAIR_RETRY; msg_p->svr_addr = sm_p->u.readdirplus.server_addresses[0]; msg_p->comp_fn = readdirplus_fetch_sizes_comp_fn; - msg_p->handle = sm_p->u.readdirplus.input_handle_array[0].handle; + + if(sm_p->u.readdirplus.nhandles == 1) { + msg_p->handle = sm_p->u.readdirplus.input_handle_array[0].handle; + } else { + msg_p->handle = find_min_handle(sm_p->u.readdirplus.input_handle_array, sm_p->u.readdirplus.nhandles); + } struct osd_command *command = &sm_p->msgarray_op.msgarray[0].osd_command; @@ -801,7 +808,7 @@ static PINT_sm_action readdirplus_fetch_sizes_setup_msgpair( attr[i].len = sizeof(uint64_t); } - ret = osd_command_set_get_member_attributes(command, PVFS_OSD_DATA_PID, COLLECTION_OID_LB); + ret = osd_command_set_get_member_attributes(command, PVFS_OSD_DATA_PID, COLLECTION_OID_LB, msg_p->handle); if (ret) { osd_error_xerrno(ret, "%s: osd_command_set_get_member_attributes failed", __func__); @@ -891,7 +898,7 @@ static int readdirplus_fetch_sizes_comp_fn(void *v_p, if (is_osd) { struct osd_command *command = &sm_p->msgarray_op.msgarray[index].osd_command; - + int ret = osd_command_attr_resolve(command); if (ret) { osd_error_xerrno(ret, "%s: osd_command_attr_resolve failed", @@ -935,16 +942,22 @@ static int readdirplus_fetch_sizes_comp_fn(void *v_p, sm_p->u.readdirplus.size_array[handle_index][aux_index] = size[0]; } } else { - //osd_debug("%d\n", ((struct attribute_get_multi_results *)attr[0].val)->oid[((struct attribute_get_multi_results *)attr[0].val)->numoid-(sm_p->u.readdirplus.nhandles-i)]); - osd_debug("%d\n", sm_p->u.readdirplus.input_handle_array[i].handle); - if(((struct attribute_get_multi_results *)attr[0].val)->oid[((struct attribute_get_multi_results *)attr[0].val)->numoid-(sm_p->u.readdirplus.nhandles-i)] == sm_p->u.readdirplus.input_handle_array[i].handle) - { - handle_index = sm_p->u.readdirplus.input_handle_array[i].handle_index; - aux_index = sm_p->u.readdirplus.input_handle_array[i].aux_index; + for (i = 0; i < sm_p->u.readdirplus.handle_count[index]; i++) { + //gossip_err("%d\n", sm_p->u.readdirplus.input_handle_array[i]); + //gossip_err("%d\n", ((struct attribute_get_multi_results *)attr[0].val)->oid[((struct attribute_get_multi_results *)attr[0].val)->numoid-(sm_p->u.readdirplus.nhandles-i)]); + } + + for (i = 0; i < sm_p->u.readdirplus.handle_count[index]; i++) { + get_handle_index(sm_p->u.readdirplus.input_handle_array, + sm_p->u.readdirplus.nhandles, + ((struct attribute_get_multi_results *)attr[0].val)->oid[((struct attribute_get_multi_results *)attr[0].val)->numoid-(sm_p->u.readdirplus.nhandles-i)], + &handle_index, + &aux_index); sm_p->u.readdirplus.size_array[handle_index][aux_index] = size[i]; } + } - } + } osd_command_attr_free(command); } else { @@ -1125,6 +1138,20 @@ static PINT_sm_action readdirplus_cleanup( return SM_ACTION_TERMINATE; } +static uint64_t find_min_handle(struct handle_to_index *input_handle_array, int nhandles) +{ + int i; + uint64_t ret = input_handle_array[0].handle; + + for(i=1; idata.str; + struct server_configuration_s *config = cmd->context; + const char *ret = NULL; + + if (!strcmp(str, "no")) + config->post_create = NO_POST_CREATE; + else if (!strcmp(str, "yes")) + config->post_create = POST_CREATE; + else + ret = "get_create_type: unknown FileSystem PostCreate option\n"; + return ret; +} + static DOTCONF_CB(get_osd_type) { const char *str = cmd->data.str; diff --git a/src/common/misc/server-config.h b/src/common/misc/server-config.h index c00853a..cb1bd16 100644 --- a/src/common/misc/server-config.h +++ b/src/common/misc/server-config.h @@ -215,6 +215,11 @@ typedef struct server_configuration_s OSD_DIR_OBJ, /* dirs in objs in collections */ } osd_dir_type; + enum { + POST_CREATE, /* delay the creates, create and write at the same time */ + NO_POST_CREATE, /* create the object first and then write to it */ + } post_create; + void *private_data; } server_configuration_s;