summaryrefslogtreecommitdiffstats
path: root/src/H5FPclient.c
diff options
context:
space:
mode:
authorBill Wendling <wendling@ncsa.uiuc.edu>2002-12-19 21:48:07 (GMT)
committerBill Wendling <wendling@ncsa.uiuc.edu>2002-12-19 21:48:07 (GMT)
commitd8198f2f834f818341ecb04104f0321ab2a8299a (patch)
tree16ae01fa8345ded1d0bcd8f3ccd5445d727428bb /src/H5FPclient.c
parentac3d122defac90d983e2f3d604cd9c5e7b9a446f (diff)
downloadhdf5-d8198f2f834f818341ecb04104f0321ab2a8299a.zip
hdf5-d8198f2f834f818341ecb04104f0321ab2a8299a.tar.gz
hdf5-d8198f2f834f818341ecb04104f0321ab2a8299a.tar.bz2
[svn-r6220] Purpose:
Update Description: A few generic changes to the FPHDF5 code. Some error messages reworked a bit. Cleaning up in case of failure improved in some cases. Added another field to the synchronization messages... Platforms tested: Linux
Diffstat (limited to 'src/H5FPclient.c')
-rw-r--r--src/H5FPclient.c284
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 */