diff options
-rw-r--r-- | src/H5FF.c | 25 | ||||
-rw-r--r-- | src/H5VLiod_client.c | 127 | ||||
-rw-r--r-- | src/H5VLiod_index.c | 40 |
3 files changed, 114 insertions, 78 deletions
@@ -794,8 +794,6 @@ H5Dopen_ff(hid_t loc_id, const char *name, hid_t dapl_id, hid_t rcxt_id, hid_t e #ifdef H5_HAVE_INDEXING { - H5_priv_request_t *request = NULL; /* private request struct inserted in event queue */ - void **req = NULL; /* pointer to plugin generate requests (NULL if VOL plugin does not support async) */ H5X_class_t *idx_class = NULL; void *idx_handle = NULL; unsigned plugin_id; @@ -805,30 +803,11 @@ H5Dopen_ff(hid_t loc_id, const char *name, hid_t dapl_id, hid_t rcxt_id, hid_t e H5P_genplist_t *xxpl_plist; /* Property list pointer */ hid_t xapl_id = H5P_INDEX_ACCESS_DEFAULT; - if (estack_id != H5_EVENT_STACK_NULL) { - /* create the private request */ - if (NULL == (request = (H5_priv_request_t *) H5MM_calloc(sizeof(H5_priv_request_t)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - request->req = NULL; - req = &request->req; - request->next = NULL; - request->vol_plugin = vol_plugin; - vol_plugin->nrefs ++; - } - /* Get index info if present */ if (FAIL == H5VL_iod_dataset_get_index_info(dset, &idx_count, &plugin_id, - &metadata_size, &metadata, rcxt_id, req)) + &metadata_size, &metadata, rcxt_id, NULL)) HGOTO_ERROR(H5E_INDEX, H5E_CANTGET, FAIL, "can't get index info for dataset"); - if (request && *req) { - if(H5ES_insert(estack_id, request) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "failed to insert request in event stack"); - } - - /* TODO this is synchronous for now as we need the info first */ -// H5ES_wait(estack_id, ); - if (idx_count) { /* store the read context ID in the xxpl */ if(NULL == (xxpl_plist = (H5P_genplist_t *)H5I_object(xapl_id))) @@ -851,7 +830,7 @@ H5Dopen_ff(hid_t loc_id, const char *name, hid_t dapl_id, hid_t rcxt_id, hid_t e HGOTO_ERROR(H5E_INDEX, H5E_CANTSET, FAIL, "cannot set index plugin ID to dataset"); } } -#endif +#endif /* H5_HAVE_INDEXING */ done: if (ret_value < 0 && dset) diff --git a/src/H5VLiod_client.c b/src/H5VLiod_client.c index 4c54333..eb652af 100644 --- a/src/H5VLiod_client.c +++ b/src/H5VLiod_client.c @@ -1654,52 +1654,85 @@ H5VL_iod_request_complete(H5VL_iod_file_t *file, H5VL_iod_request_t *req) } #ifdef H5_HAVE_INDEXING case HG_DSET_SET_INDEX_INFO: - { - req->data = NULL; - H5VL_iod_request_delete(file, req); - break; - } + { + int *status = (int *)req->data; + + if(SUCCEED != *status) { + HERROR(H5E_FUNC, H5E_CANTINIT, "set_index_info failed at the server\n"); + req->status = H5ES_STATUS_FAIL; + req->state = H5VL_IOD_COMPLETED; + } + + free(status); + req->data = NULL; + H5VL_iod_request_delete(file, req); + break; + } case HG_DSET_GET_INDEX_INFO: - { - H5VL_iod_dataset_get_index_info_t *idx_info = + { + H5VL_iod_dataset_get_index_info_t *idx_info = (H5VL_iod_dataset_get_index_info_t *)req->data; - unsigned plugin_id = idx_info->output->idx_plugin_id; - size_t count = idx_info->output->idx_count; + dset_get_index_info_out_t *output = idx_info->output; - if(!plugin_id) { - HERROR(H5E_INDEX, H5E_BADVALUE, "invalid index plugin ID\n"); - req->status = H5ES_STATUS_FAIL; - req->state = H5VL_IOD_COMPLETED; - } else { - size_t metadata_size = idx_info->output->idx_metadata.buf_size; - void *metadata = idx_info->output->idx_metadata.buf; - void *new_metadata; + if(SUCCEED != output->ret) { + HERROR(H5E_FUNC, H5E_CANTINIT, "set_index_info failed at the server\n"); + req->status = H5ES_STATUS_FAIL; + req->state = H5VL_IOD_COMPLETED; + } + else { + unsigned plugin_id; + size_t count; - if (!metadata_size) - HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "invalid metadata size"); + count = output->idx_count; + /* MSC - for now, idx_plugin_count is always 1 */ + HDassert(1 == count || 0 == count); - if (NULL == (new_metadata = H5MM_calloc(metadata_size))) - HGOTO_ERROR(H5E_INDEX, H5E_NOSPACE, FAIL, "can't allocate metadata"); - if (FAIL == HDmemcpy(new_metadata, metadata, metadata_size)) - HGOTO_ERROR(H5E_INDEX, H5E_CANTCOPY, FAIL, "can't copy metadata"); + plugin_id = (unsigned) output->idx_plugin_id; + if(!plugin_id) { + HERROR(H5E_INDEX, H5E_BADVALUE, "invalid index plugin ID\n"); + req->status = H5ES_STATUS_FAIL; + req->state = H5VL_IOD_COMPLETED; + } else { + size_t metadata_size = idx_info->output->idx_metadata.buf_size; + void *metadata = idx_info->output->idx_metadata.buf; + void *new_metadata; + + if (!metadata_size) + HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "invalid metadata size"); + + if (NULL == (new_metadata = H5MM_calloc(metadata_size))) + HGOTO_ERROR(H5E_INDEX, H5E_NOSPACE, FAIL, "can't allocate metadata"); + HDmemcpy(new_metadata, metadata, metadata_size); + + if (idx_info->count) *idx_info->count = count; + if (idx_info->plugin_id) *idx_info->plugin_id = plugin_id; + if (idx_info->metadata_size) *idx_info->metadata_size = metadata_size; + if (idx_info->metadata) *idx_info->metadata = new_metadata; + } + } - if (idx_info->count) *idx_info->count = count; - if (idx_info->plugin_id) *idx_info->plugin_id = plugin_id; - if (idx_info->metadata_size) *idx_info->metadata_size = metadata_size; - if (idx_info->metadata) *idx_info->metadata = new_metadata; + output = (dset_get_index_info_out_t *)H5MM_xfree(output); + idx_info = (H5VL_iod_dataset_get_index_info_t *)H5MM_xfree(idx_info); + req->data = NULL; + H5VL_iod_request_delete(file, req); + break; } - - req->data = NULL; - H5VL_iod_request_delete(file, req); - break; - } case HG_DSET_RM_INDEX_INFO: - { - req->data = NULL; - H5VL_iod_request_delete(file, req); - break; - } -#endif + { + int *status = (int *)req->data; + + if(SUCCEED != *status) { + HERROR(H5E_FUNC, H5E_CANTINIT, "remove_index_info failed at the server\n"); + req->status = H5ES_STATUS_FAIL; + req->state = H5VL_IOD_COMPLETED; + } + + free(status); + req->data = NULL; + H5VL_iod_request_delete(file, req); + break; + } +#endif /* H5_HAVE_INDEXING */ case HG_LINK_ITERATE: case HG_OBJECT_VISIT: case HG_MAP_ITERATE: @@ -2115,6 +2148,10 @@ H5VL_iod_request_cancel(H5VL_iod_file_t *file, H5VL_iod_request_t *req) case HG_TR_SKIP: case HG_TR_ABORT: case HG_EVICT: +#ifdef H5_HAVE_INDEXING + case HG_DSET_SET_INDEX_INFO: + case HG_DSET_RM_INDEX_INFO: +#endif /* H5_HAVE_INDEXING */ { int *status = (int *)req->data; @@ -2123,6 +2160,20 @@ H5VL_iod_request_cancel(H5VL_iod_file_t *file, H5VL_iod_request_t *req) H5VL_iod_request_delete(file, req); break; } +#ifdef H5_HAVE_INDEXING + case HG_DSET_GET_INDEX_INFO: + { + H5VL_iod_dataset_get_index_info_t *idx_info = + (H5VL_iod_dataset_get_index_info_t *)req->data; + dset_get_index_info_out_t *output = idx_info->output; + + output = (dset_get_index_info_out_t *)H5MM_xfree(output); + idx_info = (H5VL_iod_dataset_get_index_info_t *)H5MM_xfree(idx_info); + req->data = NULL; + H5VL_iod_request_delete(file, req); + break; + } +#endif /* H5_HAVE_INDEXING */ case HG_PREFETCH: case HG_VIEW_CREATE: req->data = NULL; diff --git a/src/H5VLiod_index.c b/src/H5VLiod_index.c index af2de59..8330f6a 100644 --- a/src/H5VLiod_index.c +++ b/src/H5VLiod_index.c @@ -66,7 +66,7 @@ H5VL_iod_server_dset_set_index_info_cb(AXE_engine_t UNUSED axe_engine, HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "can't open MDKV object"); kv.key = H5VL_IOD_IDX_PLUGIN_ID; - kv.key_len = (iod_size_t)strlen(kv.key); + kv.key_len = (iod_size_t)strlen(H5VL_IOD_IDX_PLUGIN_ID); kv.value = &input->idx_plugin_id; kv.value_len = (iod_size_t)sizeof(uint32_t); @@ -84,9 +84,9 @@ H5VL_iod_server_dset_set_index_info_cb(AXE_engine_t UNUSED axe_engine, } kv.key = H5VL_IOD_IDX_PLUGIN_MD; - kv.key_len = (iod_size_t)strlen(kv.key); + kv.key_len = (iod_size_t)strlen(H5VL_IOD_IDX_PLUGIN_MD); kv.value = input->idx_metadata.buf; - kv.value_len = (iod_size_t)input->index_metadata.buf_size; + kv.value_len = (iod_size_t)input->idx_metadata.buf_size; if(cs_scope & H5_CHECKSUM_IOD) { iod_checksum_t cs[2]; @@ -109,7 +109,7 @@ done: if(iod_obj_close(mdkv_oh, NULL, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "can't close object"); - input = (dset_create_in_t *)H5MM_xfree(input); + input = (dset_set_index_info_in_t *)H5MM_xfree(input); op_data = (op_data_t *)H5MM_xfree(op_data); FUNC_LEAVE_NOAPI_VOID @@ -145,8 +145,9 @@ H5VL_iod_server_dset_get_index_info_cb(AXE_engine_t UNUSED axe_engine, iod_handle_t mdkv_oh; iod_size_t key_size = 0; iod_size_t val_size = 0; - void *value = NULL; iod_checksum_t *iod_cs = NULL; + char *key = NULL; + iod_ret_t ret; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -167,10 +168,12 @@ H5VL_iod_server_dset_get_index_info_cb(AXE_engine_t UNUSED axe_engine, key_size = strlen(key); val_size = sizeof(uint32_t); - if(iod_kv_get_value(mdkv_oh, rtid, key, key_size, &output.idx_plugin_id, - &val_size, iod_cs, NULL) < 0) - HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "link_count lookup failed"); - + if((ret = iod_kv_get_value(mdkv_oh, rtid, key, key_size, &output.idx_plugin_id, + &val_size, iod_cs, NULL)) < 0) { + //if(ret == -EBADF) + //fprintf(stderr, "%d (%s).\n", ret, strerror(-ret)); + HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "lookup failed"); + } if(cs_scope & H5_CHECKSUM_IOD) { iod_checksum_t cs[2]; @@ -184,6 +187,7 @@ H5VL_iod_server_dset_get_index_info_cb(AXE_engine_t UNUSED axe_engine, key = H5VL_IOD_IDX_PLUGIN_MD; key_size = strlen(key); + val_size = 0; if(iod_kv_get_value(mdkv_oh, rtid, key, key_size, NULL, &val_size, iod_cs, NULL) < 0) @@ -192,7 +196,7 @@ H5VL_iod_server_dset_get_index_info_cb(AXE_engine_t UNUSED axe_engine, output.idx_metadata.buf_size = val_size; output.idx_metadata.buf = malloc(val_size); - if(iod_kv_get_value(mdkv_oh, rtid, key, key_size, output.idx_metadata.buf, + if(iod_kv_get_value(mdkv_oh, rtid, key, key_size, (char *)output.idx_metadata.buf, &val_size, iod_cs, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "lookup failed"); @@ -207,6 +211,8 @@ H5VL_iod_server_dset_get_index_info_cb(AXE_engine_t UNUSED axe_engine, } output.ret = ret_value; + /* MSC for now, idx_count is always 1 */ + output.idx_count = 1; HG_Handler_start_output(op_data->hg_handle, &output); done: @@ -225,7 +231,7 @@ done: if(iod_obj_close(mdkv_oh, NULL, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "can't close object"); - input = (dset_create_in_t *)H5MM_xfree(input); + input = (dset_get_index_info_in_t *)H5MM_xfree(input); op_data = (op_data_t *)H5MM_xfree(op_data); FUNC_LEAVE_NOAPI_VOID @@ -256,7 +262,7 @@ H5VL_iod_server_dset_remove_index_info_cb(AXE_engine_t UNUSED axe_engine, iod_handle_t coh = input->coh; /* container handle */ iod_obj_id_t mdkv_id = input->mdkv_id; /* The ID of the metadata KV to be created */ iod_trans_id_t wtid = input->trans_num; - uint32_t cs_scope = input->cs_scope; + //uint32_t cs_scope = input->cs_scope; iod_handle_t mdkv_oh; iod_kv_params_t kvs; iod_kv_t kv; @@ -274,17 +280,17 @@ H5VL_iod_server_dset_remove_index_info_cb(AXE_engine_t UNUSED axe_engine, HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "can't open MDKV object"); kv.key = H5VL_IOD_IDX_PLUGIN_ID; - kv.key_len = (iod_size_t)strlen(kv.key); + kv.key_len = (iod_size_t)strlen(H5VL_IOD_IDX_PLUGIN_ID); kvs.kv = &kv; - kvs.cs = &cs; + kvs.cs = NULL; kvs.ret = &ret; if(iod_kv_unlink_keys(mdkv_oh, wtid, NULL, 1, &kvs, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTDEC, FAIL, "Unable to unlink KV pair"); kv.key = H5VL_IOD_IDX_PLUGIN_MD; - kv.key_len = (iod_size_t)strlen(kv.key); + kv.key_len = (iod_size_t)strlen(H5VL_IOD_IDX_PLUGIN_MD); kvs.kv = &kv; - kvs.cs = &cs; + kvs.cs = NULL; kvs.ret = &ret; if(iod_kv_unlink_keys(mdkv_oh, wtid, NULL, 1, &kvs, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTDEC, FAIL, "Unable to unlink KV pair"); @@ -297,7 +303,7 @@ done: if(iod_obj_close(mdkv_oh, NULL, NULL) < 0) HGOTO_ERROR2(H5E_SYM, H5E_CANTINIT, FAIL, "can't close object"); - input = (dset_create_in_t *)H5MM_xfree(input); + input = (dset_rm_index_info_in_t *)H5MM_xfree(input); op_data = (op_data_t *)H5MM_xfree(op_data); FUNC_LEAVE_NOAPI_VOID |