diff options
Diffstat (limited to 'src/H5FPclient.c')
-rw-r--r-- | src/H5FPclient.c | 284 |
1 files changed, 209 insertions, 75 deletions
diff --git a/src/H5FPclient.c b/src/H5FPclient.c index c74a97c..cae4c60 100644 --- a/src/H5FPclient.c +++ b/src/H5FPclient.c @@ -37,12 +37,45 @@ static int interface_initialize_g = 0; #define INTERFACE_INIT NULL /* local functions */ -static unsigned int H5FP_gen_request_id(void); -static herr_t H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *msg); +static unsigned H5FP_gen_request_id(void); +static herr_t H5FP_update_file_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *msg); /** Public Library (non-API) Functions **/ /* + * Function: H5FP_fill_fphdf5_struct + * Purpose: Nice function to fill in the H5O_fphdf5_t structure + * before transmission to the SAP. + * Return: Nothing: Doesn't fail after asserts pass. + * Programmer: Bill Wendling, 13. November, 2002 + * Modifications: + */ +void +H5FP_fill_fphdf5_struct(H5O_fphdf5_t *fphdf5, uint8_t *oid, haddr_t header, + struct H5S_simple_t *sdim, H5T_t *dtype, time_t *mtime, + H5O_layout_t *layout, H5O_name_t *group, H5O_name_t *dataset, + struct H5P_genplist_t *plist) +{ + /* check args */ + assert(fphdf5); + assert(oid); + assert(sdim); + assert(dtype); + assert(layout); + assert(plist); + + HDmemcpy(fphdf5->oid, oid, sizeof(fphdf5->oid)); + fphdf5->header = header; + fphdf5->layout = layout; + fphdf5->sdim = sdim; + fphdf5->mtime = mtime; + fphdf5->group = group; + fphdf5->dset = dataset; + fphdf5->dtype = dtype; + fphdf5->plist = plist; +} + +/* * Function: H5FP_request_open * Purpose: Request an open of a file from the SAP. You pass in the * metadata string (MDATA) (the filename), it's length in @@ -50,6 +83,11 @@ static herr_t H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_syn * open (OBJ_TYPE). The request ID is returned in a pointer * supplied by the user. * + * The so-called "captain" process is in charge of telling + * the SAP that the processes opened a file. All processes + * opening the file, though, should call this function so + * that they can get the file ID that the SAP assigns to it. + * * N.B. This could be expanded to handle the opening of more * than just a file, if that becomes necessary. Right now, * we are only keeping track of file opens. @@ -69,9 +107,11 @@ H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type, FUNC_ENTER_NOAPI(H5FP_request_open, FAIL); + /* check args */ assert(mdata); assert(file_id); assert(req_id); + HDmemset(&mpi_status, 0, sizeof(MPI_Status)); if (H5FP_my_rank == H5FP_capt_rank) { @@ -86,8 +126,6 @@ H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type, H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); - /* The first MPI_Send will have been sent before this one will be read. */ - if (H5FP_send_metadata(mdata, md_len, (int)H5FP_sap_rank)) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't send metadata to server"); @@ -250,10 +288,13 @@ done: * Modifications: */ herr_t -H5FP_request_change(unsigned int sap_file_id, enum sap_obj_type obj_type, - enum sap_action action, int mdata_len, const char *mdata, - unsigned *req_id) +H5FP_request_change(unsigned int sap_file_id, unsigned char *obj_oid, + enum sap_obj_type obj_type, enum sap_action action, + int mdata_len, const char *mdata, unsigned *req_id, + enum sap_status *status) { + struct SAP_reply sap_reply; + MPI_Status mpi_status; struct SAP_request req; herr_t ret_value = SUCCEED; int mrc; @@ -271,6 +312,11 @@ H5FP_request_change(unsigned int sap_file_id, enum sap_obj_type obj_type, req.md_len = mdata_len; req.proc_rank = H5FP_my_rank; + if (obj_oid) + H5FP_COPY_OID(req.oid, obj_oid); + else + HDmemset(req.oid, '\0', sizeof(req.oid)); + if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank, H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); @@ -279,11 +325,81 @@ H5FP_request_change(unsigned int sap_file_id, enum sap_obj_type obj_type, if (H5FP_send_metadata(mdata, mdata_len, (int)H5FP_sap_rank) != SUCCEED) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't send metadata to server"); + HDmemset(&mpi_status, 0, sizeof(mpi_status)); + + if ((mrc = MPI_Recv(&sap_reply, 1, SAP_reply_t, (int)H5FP_sap_rank, + H5FP_TAG_REPLY, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc); + + *status = sap_reply.status; + + if (sap_reply.status != H5FP_STATUS_OK) + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTUNLOCK, FAIL, "can't register change with server"); + done: *req_id = req.req_id; FUNC_LEAVE(ret_value); } +#if 0 +herr_t +H5FP_generate_message(fid_t fid, const char *dataset, const char *group, + H5D_t *dset, H5S_t *space, H5O_fphdf5_t *fphdf5 /* out */) +{ + hobj_ref_t gr_ref, ds_ref; + H5O_efl_t efl; + H5F_t *file = NULL; + H5S_t *space = NULL; + H5G_entry_t *ent = NULL; + int i; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5FP_generate_message, FAIL); + + if ((file = H5I_object(file_id)) == NULL) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier"); + + if ((grp = H5G_open(file, group)) == NULL) + HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group"); + + if ((ent = H5G_entof(grp)) == NULL) + /* this will never be executed */ + HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to get entry info of group"); + + memcpy(fphdf5->oid, (void *)&ent->header, sizeof(ent->header)); + + if ((loc = H5G_loc(did)) == NULL) { + exit(1); + } + + memcpy(ds_ref.oid, (void *)&loc->header, sizeof(loc->header)); + + memcpy(fphdf5.oid, ds_ref.oid, sizeof(ds_ref.oid)); + fphdf5->header = dset->ent.header; + fphdf5->layout = &dset->layout; + fphdf5->sdim = &(space->extent.u.simple); +#if 0 + fphdf5->mtime = ; +#endif + fphdf5->group = group; + fphdf5->dset = dataset; + fphdf5->dtype = dset->type; + + if ((fphdf5->plist = H5P_object_verify(dset->dcpl_id, + H5P_DATASET_CREATE)) == NULL) { + exit(1); + } + + if (H5P_get(fphdf5->plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list"); + + fphdf5->efl = &efl; + +done: + FUNC_LEAVE(ret_value); +} +#endif + /* * Function: H5FP_request_sync * Purpose: Tell the SAP that we want all of the structural changes @@ -336,13 +452,11 @@ H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id, HGOTO_DONE(FAIL); } - if (sap_sync.last_msg) - break; - - /* use the info in the SAP_sync_t structure to update the - * metadata */ + /* + * use the info in the SAP_sync_t structure to update the + * metadata + */ if (sap_sync.md_len) { - H5O_fphdf5_t *fmeta; uint8_t *buf; if ((buf = (uint8_t *)HDcalloc((size_t)sap_sync.md_len + 1, 1)) == NULL) @@ -360,13 +474,14 @@ H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id, * FIXME: perform whatever metadata updates we can with the * metadata returned from the SAP */ - if (H5FP_update_metadata_cache(hdf_file_id, &sap_sync, buf) != SUCCEED) { - H5O_FPHDF5[0].free(fmeta); + if (H5FP_update_file_cache(hdf_file_id, &sap_sync, buf) != SUCCEED) HGOTO_DONE(FAIL); - } HDfree(buf); } + + if (sap_sync.last_msg) + break; } done: @@ -374,18 +489,82 @@ done: FUNC_LEAVE(ret_value); } +/* + * Function: H5FP_request_close + * Purpose: Tell the SAP that we want all of the structural changes + * made on the file and then close the file. The request ID + * is returned in a pointer passed to the function by the + * user. + * Return: Success: SUCCEED + * Failure: FAIL + * Programmer: Bill Wendling, 02. August, 2002 + * Modifications: + */ +herr_t +H5FP_request_close(unsigned sap_file_id, unsigned *req_id) +{ + struct SAP_request req; + int ret_value = SUCCEED, mrc; + + FUNC_ENTER_NOAPI(H5FP_request_close, FAIL); + + HDmemset(&req, 0, sizeof(req)); + req.req_type = H5FP_REQ_CLOSE; + req.req_id = H5FP_gen_request_id(); + req.sap_file_id = sap_file_id; + req.proc_rank = H5FP_my_rank; + + if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank, + H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); + + *req_id = req.req_id; + +done: + FUNC_LEAVE(ret_value); +} + +/** Private Functions **/ + +/* + * Function: H5FP_gen_request_id + * Purpose: Generate a unique request ID to send along with a + * message. + * Return: Integer >= 0 - Doesn't fail. + * Programmer: Bill Wendling, 30. July, 2002 + * Modifications: + */ +static unsigned +H5FP_gen_request_id() +{ + static unsigned int i = 0; + + FUNC_ENTER_NOINIT(H5FP_gen_request_id); + FUNC_LEAVE(i++); +} + +/* + * Function: H5FP_update_file_cache + * Purpose: Take the information returned by a "sync" call and update + * the file cache. The MSG parameter should be an encoded + * version of the H5O_fphdf5_t object. + * Return: Success: SUCCEED + * Failure: FAIL + * Programmer: Bill Wendling, 16. December, 2002 + * Modifications: + */ static herr_t -H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *msg) +H5FP_update_file_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *msg) { herr_t ret_value = SUCCEED; - H5G_entry_t *ent = NULL; + H5G_entry_t *ent = NULL, *file_ent = NULL; H5O_fphdf5_t *fmeta = NULL; H5S_t *space = NULL; H5F_t *file = NULL; H5G_t *grp = NULL; H5D_t *dset = NULL; - FUNC_ENTER_NOINIT(H5FP_update_metadata_cache); + FUNC_ENTER_NOINIT(H5FP_update_file_cache); /* check args */ assert(sap_sync); @@ -397,12 +576,17 @@ H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *ms if ((fmeta = H5O_FPHDF5[0].decode(file, msg, NULL)) == NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "out of memory"); - if ((grp = H5G_open(file, fmeta->group->s)) == NULL) + if ((file_ent = H5G_loc(file_id)) == NULL) + HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group"); + + if ((grp = H5G_open(file_ent, fmeta->group->s)) == NULL) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group"); switch (sap_sync->action) { case H5FP_ACT_CREATE: if (sap_sync->obj_type == H5FP_OBJ_DATASET) { + H5O_efl_t efl; + if ((ent = H5MM_malloc(sizeof(H5G_entry_t))) == NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "out of memory"); @@ -420,8 +604,10 @@ H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *ms FALSE, fmeta->header) == FAIL) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINIT, FAIL, "can't update metadata cache"); - if (H5D_update_external_storage_cache(file, ent, fmeta->efl, - fmeta->layout) == FAIL) + if (H5P_get(fmeta->plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list"); + + if (H5D_update_external_storage_cache(file, ent, &efl, fmeta->layout) == FAIL) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINIT, FAIL, "can't update external file layout metadata cache"); } @@ -445,6 +631,7 @@ H5FP_update_metadata_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *ms } done: + /* cleanup */ if (fmeta) H5O_FPHDF5[0].free(fmeta); @@ -463,57 +650,4 @@ done: FUNC_LEAVE(ret_value); } -/* - * Function: H5FP_request_close - * Purpose: Tell the SAP that we want all of the structural changes - * made on the file and then close the file. The request ID - * is returned in a pointer passed to the function by the - * user. - * Return: Success: SUCCEED - * Failure: FAIL - * Programmer: Bill Wendling, 02. August, 2002 - * Modifications: - */ -herr_t -H5FP_request_close(unsigned sap_file_id, unsigned *req_id) -{ - struct SAP_request req; - int ret_value = SUCCEED, mrc; - - FUNC_ENTER_NOAPI(H5FP_request_close, FAIL); - - HDmemset(&req, 0, sizeof(req)); - req.req_type = H5FP_REQ_CLOSE; - req.req_id = H5FP_gen_request_id(); - req.sap_file_id = sap_file_id; - req.proc_rank = H5FP_my_rank; - - if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank, - H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS) - HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); - - *req_id = req.req_id; - -done: - FUNC_LEAVE(ret_value); -} - -/** Private Functions **/ - -/* - * Function: H5FP_gen_request_id - * Purpose: Generate a unique request ID to send along with a - * message. - * Return: Integer >= 0 - Doesn't fail. - * Programmer: Bill Wendling, 30. July, 2002 - * Modifications: - */ -static unsigned int H5FP_gen_request_id() -{ - static unsigned int i = 0; - - FUNC_ENTER_NOINIT(H5FP_gen_request_id); - FUNC_LEAVE(i++); -} - #endif /* H5_HAVE_FPHDF5 */ |