[svn-r6336] Purpose:

Update

Description:
    This is the first conversion of the FPHDF5 code to be a metadata
    cache. There's an extra error message. I rewrote the sync/change code
    to be read metadata/write metadata instead.

    I still need to hook these changes into the HDF5 code so that it
    looks at the SAP first before checking the file for metadata.

Platforms tested:
    Linux
This commit is contained in:
Bill Wendling 2003-01-27 15:38:38 -05:00
parent a6542d06b1
commit 749c50fcd8
6 changed files with 597 additions and 817 deletions

View File

@ -175,7 +175,8 @@ static const H5E_minor_mesg_t H5E_minor_mesg_g[] = {
/* FPHDF5 errors */
{H5E_CANTMAKETREE, "Can't create a binary tree node"},
{H5E_CANTRECV, "Can't receive messages from processes"},
{H5E_CANTSENDMDATA, "Can't send metadata message"}
{H5E_CANTSENDMDATA, "Can't send metadata message"},
{H5E_CANTCHANGE, "Can't register change with server"}
};
/* Interface initialization? */

View File

@ -206,7 +206,8 @@ typedef enum H5E_minor_t {
/* FPHDF5 errors */
H5E_CANTMAKETREE, /*can't make a TBBT tree */
H5E_CANTRECV, /*can't receive messages from processes */
H5E_CANTSENDMDATA /*can't send metadata message */
H5E_CANTSENDMDATA, /*can't send metadata message */
H5E_CANTCHANGE /*can't register change on server */
} H5E_minor_t;
/* Information about an error */

View File

@ -29,9 +29,9 @@
#define INTERFACE_INIT NULL
static int interface_initialize_g = 0;
MPI_Datatype SAP_request_t; /* MPI datatype for the SAP_request obj */
MPI_Datatype SAP_reply_t; /* MPI datatype for the SAP_reply obj */
MPI_Datatype SAP_sync_t; /* MPI datatype for the SAP_sync obj */
MPI_Datatype H5FP_request_t; /* MPI datatype for the H5FP_request obj*/
MPI_Datatype H5FP_reply_t; /* MPI datatype for the H5FP_reply obj */
MPI_Datatype H5FP_read_t; /* MPI datatype for the H5FP_read obj */
/* SAP specific variables */
MPI_Comm H5FP_SAP_COMM; /* Comm we use: Supplied by user */
@ -46,7 +46,11 @@ int H5FP_comm_size; /* Size of the COMM */
static herr_t H5FP_commit_sap_datatypes(void);
static herr_t H5FP_request_sap_stop(void);
/** API Functions **/
/*
*===----------------------------------------------------------------------===
* Public (API) Functions
*===----------------------------------------------------------------------===
*/
/*
* Function: H5FPinit
@ -67,16 +71,17 @@ H5FPinit(MPI_Comm comm, int sap_rank)
H5TRACE2("e","McIs",comm,sap_rank);
/* initialize to NULL so that we can release if an error occurs */
SAP_request_t = MPI_DATATYPE_NULL;
SAP_reply_t = MPI_DATATYPE_NULL;
SAP_sync_t = MPI_DATATYPE_NULL;
H5FP_request_t = MPI_DATATYPE_NULL;
H5FP_reply_t = MPI_DATATYPE_NULL;
H5FP_read_t = MPI_DATATYPE_NULL;
H5FP_SAP_COMM = MPI_COMM_NULL;
H5FP_SAP_BARRIER_COMM = MPI_COMM_NULL;
/* Set the global variable to track the SAP's rank */
H5FP_sap_rank = sap_rank;
/* Make a private copy of the communicator we were passed */
/* Make a private copy of the communicator passed to us */
if (MPI_Comm_dup(comm, &H5FP_SAP_COMM) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_dup failed");
@ -84,22 +89,24 @@ H5FPinit(MPI_Comm comm, int sap_rank)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_group failed");
/* Exclude the SAP from the barrier group group */
if (MPI_Group_excl(sap_group, 1, (int *)&H5FP_sap_rank, &sap_barrier_group)
!= MPI_SUCCESS)
if (MPI_Group_excl(sap_group, 1, (int *)&H5FP_sap_rank,
&sap_barrier_group) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Group_excl failed");
/* Create communicator for barrier group (all processes except the SAP) */
if (MPI_Comm_create(H5FP_SAP_COMM, sap_barrier_group, &H5FP_SAP_BARRIER_COMM)
!= MPI_SUCCESS)
if (MPI_Comm_create(H5FP_SAP_COMM, sap_barrier_group,
&H5FP_SAP_BARRIER_COMM) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_create failed");
/* Get the size of all the processes (including the SAP) */
if (MPI_Comm_size(H5FP_SAP_COMM, &H5FP_comm_size) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_size failed");
/* we assign the process right after the sap_rank as the one which
* will tell the SAP that files have been opened or closed.
* we mod it so that we don't go over the size of the communicator. */
/*
* We assign the process right after the sap_rank as the one which
* will tell the SAP that files have been opened or closed. We mod
* it so that we don't go over the size of the communicator.
*/
H5FP_capt_rank = (H5FP_sap_rank + 1) % H5FP_comm_size;
/* Get this processes rank */
@ -119,16 +126,16 @@ H5FPinit(MPI_Comm comm, int sap_rank)
done:
if (ret_value == FAIL) {
/* we've encountered an error...clean up */
if (SAP_request_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&SAP_request_t) != MPI_SUCCESS)
if (H5FP_request_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&H5FP_request_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
if (SAP_reply_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&SAP_reply_t) != MPI_SUCCESS)
if (H5FP_reply_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&H5FP_reply_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
if (SAP_sync_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&SAP_sync_t) != MPI_SUCCESS)
if (H5FP_read_t != MPI_DATATYPE_NULL)
if (MPI_Type_free(&H5FP_read_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
if (H5FP_SAP_BARRIER_COMM != MPI_COMM_NULL)
@ -174,13 +181,13 @@ H5FPfinalize(void)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Error stopping the SAP");
/* Release the MPI types we created */
if (MPI_Type_free(&SAP_request_t) != MPI_SUCCESS)
if (MPI_Type_free(&H5FP_request_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
if (MPI_Type_free(&SAP_reply_t) != MPI_SUCCESS)
if (MPI_Type_free(&H5FP_reply_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
if (MPI_Type_free(&SAP_sync_t) != MPI_SUCCESS)
if (MPI_Type_free(&H5FP_read_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_free failed");
/* Release the barrier communicator */
@ -197,7 +204,11 @@ done:
FUNC_LEAVE_API(ret_value);
}
/** Public Libarary (non-API) Functions **/
/*
*===----------------------------------------------------------------------===
* Public Library (non-API) Functions
*===----------------------------------------------------------------------===
*/
/*
* Function: H5FP_send_metadata
@ -219,6 +230,7 @@ H5FP_send_metadata(const char *mdata, int len, int rank)
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5FP_send_metadata, FAIL);
assert(mdata);
assert(len);
@ -231,11 +243,15 @@ done:
FUNC_LEAVE_NOAPI(ret_value);
}
/** Private Functions **/
/*
*===----------------------------------------------------------------------===
* Private Functions
*===----------------------------------------------------------------------===
*/
/*
* Function: H5FP_commit_sap_datatypes
* Purpose: Commit the SAP_request_t, SAP_reply_t, and SAP_sync_t
* Purpose: Commit the H5FP_request_t, H5FP_reply_t, and H5FP_read_t
* structure datatypes to MPI.
* Return: Success: SUCCEED
* Failure: FAIL
@ -245,56 +261,67 @@ done:
static herr_t
H5FP_commit_sap_datatypes(void)
{
int block_length[2];
MPI_Aint displs[2];
MPI_Datatype old_types[2];
struct SAP_request req;
struct SAP_sync sap_sync;
int block_length[3];
MPI_Aint displs[3];
MPI_Datatype old_types[3];
H5FP_request req;
H5FP_read sap_read;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5FP_commit_sap_datatypes, FAIL);
/* Commit the SAP_request_t datatype */
block_length[0] = 10;
block_length[1] = sizeof(req.oid);
/* Commit the H5FP_request_t datatype */
block_length[0] = 8;
block_length[1] = 1;
block_length[2] = sizeof(req.oid);
old_types[0] = MPI_INT;
old_types[1] = MPI_UNSIGNED_CHAR;
old_types[1] = HADDR_AS_MPI_TYPE;
old_types[2] = MPI_UNSIGNED_CHAR;
MPI_Address(&req.req_type, &displs[0]);
MPI_Address(&req.oid, &displs[1]);
MPI_Address(&req.addr, &displs[1]);
MPI_Address(&req.oid, &displs[2]);
displs[2] -= displs[1];
displs[1] -= displs[0];
displs[0] -= displs[0];
if (MPI_Type_struct(2, block_length, displs, old_types, &SAP_request_t) != MPI_SUCCESS)
if (MPI_Type_struct(3, block_length, displs, old_types,
&H5FP_request_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed");
if (MPI_Type_commit(&SAP_request_t) != MPI_SUCCESS)
if (MPI_Type_commit(&H5FP_request_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed");
/* Commit the SAP_reply_t datatype */
block_length[0] = 3;
/* Commit the H5FP_reply_t datatype */
block_length[0] = 4;
displs[0] = 0;
old_types[0] = MPI_INT;
if (MPI_Type_struct(1, block_length, displs, old_types, &SAP_reply_t) != MPI_SUCCESS)
if (MPI_Type_struct(1, block_length, displs, old_types,
&H5FP_reply_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed");
if (MPI_Type_commit(&SAP_reply_t) != MPI_SUCCESS)
if (MPI_Type_commit(&H5FP_reply_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed");
/* Commit the SAP_sync_t datatype */
block_length[0] = 9;
/* Commit the H5FP_read_t datatype */
block_length[0] = 6;
block_length[1] = 1;
block_length[2] = 1;
old_types[0] = MPI_INT;
old_types[1] = MPI_LONG_LONG;
MPI_Address(&sap_sync.req_id, &displs[0]);
MPI_Address(&sap_sync.size, &displs[1]);
old_types[1] = HADDR_AS_MPI_TYPE;
old_types[2] = MPI_LONG_LONG;
MPI_Address(&sap_read.req_id, &displs[0]);
MPI_Address(&sap_read.addr, &displs[1]);
MPI_Address(&sap_read.size, &displs[2]);
displs[2] -= displs[1];
displs[1] -= displs[0];
displs[0] -= displs[0];
if (MPI_Type_struct(1, block_length, displs, old_types, &SAP_sync_t) != MPI_SUCCESS)
if (MPI_Type_struct(3, block_length, displs, old_types,
&H5FP_read_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_struct failed");
if (MPI_Type_commit(&SAP_sync_t) != MPI_SUCCESS)
if (MPI_Type_commit(&H5FP_read_t) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Type_commit failed");
done:
@ -313,7 +340,7 @@ done:
static herr_t
H5FP_request_sap_stop(void)
{
struct SAP_request req;
H5FP_request req;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5FP_request_sap_stop, FAIL);
@ -323,7 +350,7 @@ H5FP_request_sap_stop(void)
req.req_id = 0;
req.proc_rank = H5FP_my_rank;
if (MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank,
if (MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Send failed");

View File

@ -16,6 +16,7 @@
#define H5G_PACKAGE /*suppress error about including H5Gpkg */
#include "H5private.h" /* Generic Functions */
#include "H5ACprivate.h" /* Metadata Cache */
#include "H5Dprivate.h" /* Dataset Functions */
#include "H5Eprivate.h" /* Error Handling */
#include "H5Gpkg.h" /* Group functions */
@ -38,43 +39,9 @@ static int interface_initialize_g = 0;
/* local functions */
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
@ -88,20 +55,16 @@ H5FP_fill_fphdf5_struct(H5O_fphdf5_t *fphdf5, uint8_t *oid, haddr_t header,
* 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.
*
* Return: Success: SUCCEED
* Failure: FAIL
* Programmer: Bill Wendling, 28. August, 2002
* Modifications:
*/
herr_t
H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type,
H5FP_request_open(const char *mdata, int md_size, H5FP_obj_t obj_type,
unsigned *file_id, unsigned *req_id)
{
struct SAP_request req;
H5FP_request req;
MPI_Status mpi_status;
int ret_value = SUCCEED, mrc;
@ -119,14 +82,14 @@ H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type,
req.req_type = H5FP_REQ_OPEN;
req.req_id = H5FP_gen_request_id();
req.proc_rank = H5FP_my_rank;
req.md_len = md_len;
req.md_size = md_size;
req.obj_type = obj_type;
if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc);
if (H5FP_send_metadata(mdata, md_len, (int)H5FP_sap_rank))
if (H5FP_send_metadata(mdata, md_size, (int)H5FP_sap_rank))
HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL,
"can't send metadata to server");
}
@ -155,11 +118,11 @@ done:
* Modifications:
*/
herr_t
H5FP_request_lock(unsigned int sap_file_id, unsigned char *obj_oid,
enum sap_lock_type rw_lock, int last, unsigned *req_id,
enum sap_status *status)
H5FP_request_lock(unsigned file_id, unsigned char *obj_oid,
H5FP_lock_t rw_lock, int last, unsigned *req_id,
H5FP_status_t *status)
{
struct SAP_request req;
H5FP_request req;
int ret_value = SUCCEED, mrc;
FUNC_ENTER_NOAPI(H5FP_request_lock, FAIL);
@ -172,13 +135,13 @@ H5FP_request_lock(unsigned int sap_file_id, unsigned char *obj_oid,
*status = H5FP_STATUS_OK;
req.req_type = last ? H5FP_REQ_LOCK_END : H5FP_REQ_LOCK;
req.req_id = H5FP_gen_request_id();
req.sap_file_id = sap_file_id;
req.file_id = file_id;
req.rw_lock = rw_lock;
req.md_len = 0;
req.md_size = 0;
req.proc_rank = H5FP_my_rank;
H5FP_COPY_OID(req.oid, obj_oid);
if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc);
@ -187,12 +150,12 @@ H5FP_request_lock(unsigned int sap_file_id, unsigned char *obj_oid,
* On the last lock in the lock-group to be acquired, we expect a
* reply from the SAP
*/
struct SAP_reply sap_reply;
H5FP_reply sap_reply;
MPI_Status mpi_status;
HDmemset(&mpi_status, 0, sizeof(mpi_status));
if ((mrc = MPI_Recv(&sap_reply, 1, SAP_reply_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Recv(&sap_reply, 1, H5FP_reply_t, (int)H5FP_sap_rank,
H5FP_TAG_REPLY, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc);
@ -220,33 +183,30 @@ done:
* Modifications:
*/
herr_t
H5FP_request_release_lock(unsigned int sap_file_id, unsigned char *obj_oid,
int last, unsigned *req_id, enum sap_status *status)
H5FP_request_release_lock(unsigned file_id, unsigned char *obj_oid,
int last, unsigned *req_id, H5FP_status_t *status)
{
struct SAP_request req;
H5FP_request req;
herr_t ret_value = SUCCEED;
int mrc;
FUNC_ENTER_NOAPI(H5FP_request_release_lock, FAIL);
assert(obj_oid);
assert(req_id);
assert(status);
HDmemset(&req, 0, sizeof(req));
*status = H5FP_STATUS_OK;
H5FP_COPY_OID(req.oid, obj_oid);
req.req_type = last ? H5FP_REQ_RELEASE_END : H5FP_REQ_RELEASE;
req.req_id = H5FP_gen_request_id();
req.sap_file_id = sap_file_id;
req.md_len = 0;
req.file_id = file_id;
req.md_size = 0;
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,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc);
@ -255,12 +215,12 @@ H5FP_request_release_lock(unsigned int sap_file_id, unsigned char *obj_oid,
* On the last lock released in this lock-group, we expect a
* reply from the SAP
*/
struct SAP_reply sap_reply;
H5FP_reply sap_reply;
MPI_Status mpi_status;
HDmemset(&mpi_status, 0, sizeof(mpi_status));
if ((mrc = MPI_Recv(&sap_reply, 1, SAP_reply_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Recv(&sap_reply, 1, H5FP_reply_t, (int)H5FP_sap_rank,
H5FP_TAG_REPLY, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc);
@ -276,151 +236,93 @@ done:
}
/*
* Function: H5FP_request_change
* Purpose: Tell the SAP that we want to change the structure of the file.
* Include the information the SAP will need to send to the
* other processes so that they can be synced with what you
* are doing. The request ID is returned in a pointer
* supplied by the user.
* Function: H5FP_request_write_metadata
* Purpose: Tell the SAP that we want to change a piece of metadata
* associated with the file. The request ID is returned in a
* pointer supplied by the user.
* Return: Success: SUCCEED
* Failure: FAIL
* Programmer: Bill Wendling, 02. August, 2002
* Modifications:
*/
herr_t
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)
H5FP_request_write_metadata(unsigned file_id, unsigned char *obj_oid,
H5FP_obj_t obj_type, H5AC_subid_t type_id,
haddr_t addr, int mdata_size, const char *mdata,
unsigned *req_id, H5FP_status_t *status)
{
struct SAP_reply sap_reply;
H5FP_reply sap_reply;
MPI_Status mpi_status;
struct SAP_request req;
H5FP_request req;
herr_t ret_value = SUCCEED;
int mrc;
FUNC_ENTER_NOAPI(H5FP_request_change, FAIL);
assert(mdata);
assert(obj_oid);
assert(req_id);
assert(status);
HDmemset(&req, 0, sizeof(req));
req.req_type = H5FP_REQ_CHANGE;
H5FP_COPY_OID(req.oid, obj_oid);
req.req_type = H5FP_REQ_WRITE;
req.req_id = H5FP_gen_request_id();
req.sap_file_id = sap_file_id;
req.obj_type = obj_type;
req.action = action;
req.md_len = mdata_len;
req.proc_rank = H5FP_my_rank;
req.file_id = file_id;
req.obj_type = obj_type;
req.type_id = type_id;
req.addr = addr;
req.md_size = mdata_size;
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,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
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, mdata_len, (int)H5FP_sap_rank) != SUCCEED)
if (H5FP_send_metadata(mdata, mdata_size, (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,
if ((mrc = MPI_Recv(&sap_reply, 1, H5FP_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");
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCHANGE, FAIL, "can't write metadata to server");
done:
*req_id = req.req_id;
FUNC_LEAVE_NOAPI(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_NOAPI(ret_value);
}
#endif
/*
* Function: H5FP_request_sync
* Purpose: Tell the SAP that we want all of the structural changes
* made on the file that we don't know about. The request ID
* is returned in a pointer supplied by the user. The status
* of the SAP is returned to the user in the supplied STATUS
* pointer.
* Function: H5FP_request_read_metadata
* Purpose: Read a piece of metadata from the SAP. That is, if the
* SAP has access to that metadata. If not, then we'll need
* to read it from disk.
* Return: Success: SUCCEED
* Failure: FAIL
* Programmer: Bill Wendling, 02. August, 2002
* Modifications:
*/
herr_t
H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id,
unsigned *req_id, enum sap_status *status)
H5FP_request_read_metadata(unsigned file_id, H5FP_obj_t obj_type,
H5AC_subid_t type_id, haddr_t addr, size_t size,
uint8_t **buf, unsigned *req_id,
H5FP_status_t *status)
{
struct SAP_request req;
H5FP_request req;
H5FP_read sap_read; /* metadata info read from the SAP's cache */
herr_t ret_value = SUCCEED;
MPI_Status mpi_status;
int mrc;
FUNC_ENTER_NOAPI(H5FP_request_sync, FAIL);
FUNC_ENTER_NOAPI(H5FP_request_read_metadata, FAIL);
assert(req_id);
assert(status);
@ -428,64 +330,45 @@ H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id,
HDmemset(&req, 0, sizeof(req));
*status = H5FP_STATUS_OK;
req.req_type = H5FP_REQ_SYNC;
req.req_type = H5FP_REQ_READ;
req.req_id = H5FP_gen_request_id();
req.sap_file_id = sap_file_id;
req.file_id = file_id;
req.proc_rank = H5FP_my_rank;
req.obj_type = obj_type;
req.type_id = type_id;
req.addr = addr;
if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc);
for (;;) {
MPI_Status mpi_status;
struct SAP_sync sap_sync;
HDmemset(&mpi_status, 0, sizeof(mpi_status));
if ((mrc = MPI_Recv(&sap_read, 1, H5FP_read_t, (int)H5FP_sap_rank, H5FP_TAG_READ,
H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc);
if (sap_read.status == H5FP_STATUS_OK) {
/* use the info in the H5FP_read_t structure to update the metadata */
memset(*buf, '\0', size);
HDmemset(&mpi_status, 0, sizeof(mpi_status));
if ((mrc = MPI_Recv(&sap_sync, 1, SAP_sync_t, (int)H5FP_sap_rank, H5FP_TAG_SYNC,
H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS)
if ((mrc = MPI_Recv(*buf, sap_read.md_size, MPI_BYTE, (int)H5FP_sap_rank,
H5FP_TAG_METADATA, H5FP_SAP_COMM,
&mpi_status)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc);
if (sap_sync.status != H5FP_STATUS_OK) {
*status = sap_sync.status;
HGOTO_DONE(FAIL);
}
} else {
/*
* use the info in the SAP_sync_t structure to update the
* metadata
* FIXME!!!
*
* The metadata wasn't in the SAP's cache. Should read from disk
* now.
*/
if (sap_sync.md_len) {
uint8_t *buf;
if ((buf = (uint8_t *)HDcalloc((size_t)sap_sync.md_len + 1, 1)) == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "out of memory");
HDmemset(&mpi_status, 0, sizeof(mpi_status));
if ((mrc = MPI_Recv(buf, sap_sync.md_len, MPI_BYTE, (int)H5FP_sap_rank,
H5FP_TAG_METADATA, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) {
HDfree(buf);
HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc);
}
/*
* FIXME: perform whatever metadata updates we can with the
* metadata returned from the SAP
*/
if (H5FP_update_file_cache(hdf_file_id, &sap_sync, buf) != SUCCEED)
HGOTO_DONE(FAIL);
HDfree(buf);
}
if (sap_sync.last_msg)
break;
}
done:
*req_id = req.req_id;
*status = sap_read.status;
FUNC_LEAVE_NOAPI(ret_value);
}
@ -501,20 +384,23 @@ done:
* Modifications:
*/
herr_t
H5FP_request_close(unsigned sap_file_id, unsigned *req_id)
H5FP_request_close(unsigned file_id, unsigned *req_id)
{
struct SAP_request req;
H5FP_request req;
int ret_value = SUCCEED, mrc;
FUNC_ENTER_NOAPI(H5FP_request_close, FAIL);
assert(req_id);
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.file_id = file_id;
req.proc_rank = H5FP_my_rank;
if ((mrc = MPI_Send(&req, 1, SAP_request_t, (int)H5FP_sap_rank,
if ((mrc = MPI_Send(&req, 1, H5FP_request_t, (int)H5FP_sap_rank,
H5FP_TAG_REQUEST, H5FP_SAP_COMM)) != MPI_SUCCESS)
HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc);
@ -524,7 +410,11 @@ done:
FUNC_LEAVE_NOAPI(ret_value);
}
/** Private Functions **/
/*
*===----------------------------------------------------------------------===
* Functions Private to Client Module
*===----------------------------------------------------------------------===
*/
/*
* Function: H5FP_gen_request_id
@ -543,113 +433,4 @@ H5FP_gen_request_id()
FUNC_LEAVE_NOAPI(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_file_cache(hid_t file_id, struct SAP_sync *sap_sync, uint8_t *msg)
{
herr_t ret_value = SUCCEED;
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_file_cache);
/* check args */
assert(sap_sync);
assert(msg);
if ((file = H5I_object(file_id)) == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier");
if ((fmeta = H5O_FPHDF5[0].decode(file, msg, NULL)) == NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "out of memory");
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) {
#ifdef OLD_WAY
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");
if ((space = H5S_create(H5S_SIMPLE)) == NULL)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL,
"can't create simple dataspace");
if (H5S_set_extent_simple(space, fmeta->sdim->rank,
fmeta->sdim->size, fmeta->sdim->max) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set dimensions");
if (H5D_update_entry_info(file, ent, H5G_entof(grp),
fmeta->dset->s, space,
fmeta->plist, fmeta->layout, fmeta->dtype,
FALSE, fmeta->header) == FAIL)
HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINIT, FAIL, "can't update metadata cache");
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_info(file, ent, &efl, fmeta->layout) == FAIL)
HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINIT, FAIL,
"can't update external file layout metadata cache");
}
break;
case H5FP_ACT_EXTEND:
if (sap_sync->obj_type == H5FP_OBJ_DATASET) {
if ((dset = H5D_open(H5G_entof(grp), fmeta->dset->s)) == NULL)
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open dataset");
if (H5D_extend(dset, fmeta->sdim->size) != SUCCEED)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to extend dataset");
}
break;
#endif /* OLD_WAY */
case H5FP_ACT_DELETE:
default:
break;
}
done:
/* cleanup */
if (fmeta)
H5O_FPHDF5[0].free(fmeta);
if (dset)
H5D_close(dset);
if (grp)
H5G_close(grp);
if (space)
H5S_close(space);
if (ret_value == FAIL)
H5MM_xfree(ent);
FUNC_LEAVE_NOAPI(ret_value);
}
#endif /* H5_HAVE_FPHDF5 */

View File

@ -11,86 +11,113 @@
* http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef H5FPPRIVATE_H__
#define H5FPPRIVATE_H__ 0
#include "H5ACpublic.h" /* Metadata Cache */
#include "H5FPpublic.h" /* Flexible Parallel HDF5 */
#include "H5Oprivate.h" /* Object Headers */
#include "H5Rprivate.h" /* References */
#define H5FP_BYTE_BITS 8
/* Different types of requests */
/*
/*===----------------------------------------------------------------------===
* Request Types
*===----------------------------------------------------------------------===
*
* The H5FP_REQ_LOCK_END and H5FP_REQ_RELEASE_END are used to lock and
* release a collection of objects at the same time. The last object you
* need to lock is sent with the H5FP_REQ_LOCK_END request type (this can
* also be a null message - where you're just sending a message that has
* H5FP_REQ_LOCK_END as the request type with no data associated with it.
* In that case, the md_len MUST be set to 0). The SAP will then try to
* lock all of the objects you've requested to lock at once. If it cannot
* do so, then it will fail and you have to try again at a later time.
* In that case, the md_size *MUST* be set to 0). The SAP will then try
* to lock all of the objects you've requested to lock at once. If it
* cannot do so, then it will fail and you have to try again at a later
* time.
*
* Releasing locks is done in the exact same way, except that the action
* will always release locks (i.e., not fail) if there is a vaild lock
* for that object.
*/
enum sap_request {
typedef enum {
H5FP_REQ_OPEN, /* Open a file (or eventually an object) */
H5FP_REQ_LOCK, /* Lock an object (in a sequence) */
H5FP_REQ_LOCK_END, /* Last lock request in lock sequence */
H5FP_REQ_RELEASE, /* Unlock an object (in a sequence) */
H5FP_REQ_RELEASE_END, /* Last unlock request in unlock sequence */
H5FP_REQ_CHANGE, /* Change an object */
H5FP_REQ_SYNC, /* Syncronize changes in file */
H5FP_REQ_WRITE, /* Writing a piece of metadata */
H5FP_REQ_READ, /* Reading a piece of metadata */
H5FP_REQ_CLOSE, /* Close a file (or eventually an object) */
H5FP_REQ_STOP /* Stop SAP */
};
} H5FP_req_t;
/* Actions to take when performing a change */
enum sap_action {
H5FP_ACT_CREATE,
H5FP_ACT_EXTEND,
H5FP_ACT_DELETE,
H5FP_ACT_UPDATE
};
/*===----------------------------------------------------------------------===
* Lock Types
*===----------------------------------------------------------------------===
*
* A ``read'' lock indicates that the process is busy reading the
* metadata of that object. It's non-exclusive, so any number of
* processes can have any number of locks on a given object. However, you
* cannot have a write and a read lock on an object.
*
* A ``write'' lock indicates that the process is busy writing to the
* metadata of that object. It's exclusive, so only one process can have
* a write lock on an object at any one time. However, that object can
* have any number of write locks on that object.
*
* It's up to the program to release all of the locks it has on a given
* object.
*/
typedef enum {
H5FP_LOCK_READ,
H5FP_LOCK_WRITE
} H5FP_lock_t;
/* Types of objects we can change */
enum sap_obj_type {
/*===----------------------------------------------------------------------===
* Object Types
*===----------------------------------------------------------------------===
*
* The various types of objects we're able to get a lock on or which we
* want to modify/read.
*/
typedef enum {
H5FP_OBJ_FILE,
H5FP_OBJ_GROUP,
H5FP_OBJ_DATASET,
H5FP_OBJ_DATATYPE,
H5FP_OBJ_ATTRIBUTE,
H5FP_OBJ_MEMORY
} H5FP_obj_t;
/*===----------------------------------------------------------------------===
* MPI Message Tags
*===----------------------------------------------------------------------===
*
* Special tag numbers for requests, replies, and string passing
* messages.
*
* Certain actions (Open, Change, and Close) require a pathname to the
* object. This pathname is sent in a separate message and the SAP will
* search for it after getting the appropriate request.
*/
enum {
H5FP_TAG_REQUEST,
H5FP_TAG_REPLY,
H5FP_TAG_READ,
H5FP_TAG_METADATA,
H5FP_TAG_FILE_ID
};
/* Types of locks we can get */
enum sap_lock_type {
H5FP_LOCK_READ,
H5FP_LOCK_WRITE
};
/* The structure sent to the SAP which holds all of the requested action */
struct SAP_request {
enum sap_request req_type; /* Request type */
unsigned int req_id; /* ID for request set by sending process */
unsigned int proc_rank; /* Rank of sending process */
unsigned int sap_file_id; /* SAP's file ID for the specific file */
enum sap_obj_type obj_type; /* Type of object */
enum sap_action action; /* Action to do to object (H5FP_REQ_CHANGE only) */
enum sap_lock_type rw_lock; /* Indicates read or write lock */
H5FD_mem_t mem_type; /* Type of memory updated, if req'd */
unsigned long size; /* Size of memory updated, if req'd */
int md_len; /* Length of the metadata sent in next msg */
unsigned char oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object referenced */
};
extern MPI_Datatype SAP_request_t; /* MPI datatype for the SAP_request obj */
/* The status of the SAP */
enum sap_status {
/*===----------------------------------------------------------------------===
* Status
*===----------------------------------------------------------------------===
*
* The status returned by the SAP. If the process receives an
* H5FP_STATUS_CATASTROPHIC status, then something *REALLY* bad happened
* on the set-aside process. The state of the program is then
* indeterminant and the only real course of action is for the program to
* abort operation.
*/
typedef enum sap_status {
H5FP_STATUS_OK,
/* For locking */
@ -106,6 +133,9 @@ enum sap_status {
H5FP_STATUS_FILE_CLOSING,
H5FP_STATUS_NO_LOCK,
/* For read requests */
H5FP_STATUS_MDATA_NOT_CACHED,
/* Out of memory error */
H5FP_STATUS_OOM,
@ -114,47 +144,53 @@ enum sap_status {
/* Reserved for completely disasterous failures which require an abort */
H5FP_STATUS_CATASTROPHIC
};
/* Reply from the SAP on an SAP_request send */
struct SAP_reply {
unsigned int req_id; /* Request ID copied from the SAP_request */
unsigned int sap_file_id; /* File ID assigned to an open file */
enum sap_status status; /* Status of the request */
};
extern MPI_Datatype SAP_reply_t; /* MPI datatype for the SAP_reply obj */
/* The sync message from the SAP on an SAP_request H5FP_REQ_SYNC send */
struct SAP_sync {
unsigned int req_id; /* Request ID copied from the SAP_request */
unsigned int sync_id; /* Sync ID to order the sync messages */
unsigned int sap_file_id; /* SAP's file ID for the specific file */
unsigned int last_msg; /* Indicates this is the last sync msg sent */
enum sap_obj_type obj_type; /* Type of object */
enum sap_action action; /* Action done on the object */
enum sap_status status; /* Status of the request */
int md_len; /* Length of the metadata sent in next msg */
H5FD_mem_t mem_type; /* Type of memory updated, if req'd */
hsize_t size; /* Size of memory updated, if req'd */
};
extern MPI_Datatype SAP_sync_t; /* MPI datatype for the SAP_sync obj */
} H5FP_status_t;
/*
* Special tag numbers for requests, replies, and string passing messages.
*
* Certain actions (Open, Change, and Close) require a pathname to the
* object. This pathname is sent in a separate message and the SAP will
* search for it after getting the appropriate request.
* The structure sent to the SAP which holds all of the requested action
*/
enum {
H5FP_TAG_REQUEST,
H5FP_TAG_REPLY,
H5FP_TAG_SYNC,
H5FP_TAG_METADATA,
H5FP_TAG_FILE_ID
};
typedef struct {
H5FP_req_t req_type; /* Request type */
unsigned req_id; /* ID for request set by sending process */
unsigned proc_rank; /* Rank of sending process */
unsigned file_id; /* SAP's file ID for the specific file */
H5FP_obj_t obj_type; /* Type of the object */
H5FP_lock_t rw_lock; /* Indicates read or write lock */
H5AC_subid_t type_id; /* Type of metadata */
int md_size; /* Size of the metadata sent in next msg */
haddr_t addr; /* Address of the metadata */
unsigned char oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object */
} H5FP_request;
extern MPI_Datatype H5FP_request_t; /* MPI datatype for the H5FP_request obj*/
/*
* Reply from the SAP on an H5FP_request send
*/
typedef struct {
unsigned req_id; /* Request ID copied from the SAP_request */
unsigned file_id; /* File ID assigned to an open file */
H5FP_status_t status; /* Status of the request */
unsigned md_size; /* Size of the metadata sent in next msg */
} H5FP_reply;
extern MPI_Datatype H5FP_reply_t; /* MPI datatype for the H5FP_reply obj */
/*
* The reply message from the SAP on an H5FP_request H5FP_REQ_READ send
*/
typedef struct {
unsigned req_id; /* Request ID copied from the SAP_request */
unsigned file_id; /* SAP's file ID for the specific file */
H5FP_status_t status; /* Status of the request */
H5FD_mem_t mem_type; /* Type of memory updated, if req'd */
H5AC_subid_t type_id; /* Type of metadata */
int md_size; /* Size of the metadata sent in next msg */
haddr_t addr; /* Address of the metadata */
hsize_t size; /* Size of memory updated, if req'd */
} H5FP_read;
extern MPI_Datatype H5FP_read_t; /* MPI datatype for the H5FP_read obj */
/* Handy #define for copying OIDs */
#define H5FP_COPY_OID(dst, src) HDmemcpy((dst), (src), H5R_OBJ_REF_BUF_SIZE)
@ -179,29 +215,24 @@ extern herr_t H5FP_send_metadata(const char *mdata, int len, int rank);
extern herr_t H5FP_sap_receive_loop(void);
/* Use these functions to communicate with the SAP */
extern herr_t H5FP_request_open(const char *mdata, int md_len, enum sap_obj_type obj_type,
extern herr_t H5FP_request_open(const char *mdata, int md_len, H5FP_obj_t obj_type,
unsigned *file_id, unsigned *req_id);
extern herr_t H5FP_request_lock(unsigned int sap_file_id, unsigned char *mdata,
enum sap_lock_type rw_lock, int last, unsigned *req_id,
enum sap_status *status);
extern herr_t H5FP_request_release_lock(unsigned int sap_file_id, unsigned char *mdata,
extern herr_t H5FP_request_lock(unsigned sap_file_id, unsigned char *mdata,
H5FP_lock_t rw_lock, int last, unsigned *req_id,
H5FP_status_t *status);
extern herr_t H5FP_request_release_lock(unsigned sap_file_id, unsigned char *mdata,
int last, unsigned *req_id,
enum sap_status *status);
extern herr_t 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);
extern herr_t H5FP_request_sync(unsigned int sap_file_id, hid_t hdf_file_id,
unsigned *req_id, enum sap_status *status);
H5FP_status_t *status);
extern herr_t H5FP_request_write_metadata(unsigned sap_file_id, unsigned char *obj_oid,
H5FP_obj_t obj_type, H5AC_subid_t type_id,
haddr_t addr, int mdata_len, const char *mdata,
unsigned *req_id, H5FP_status_t *status);
extern herr_t H5FP_request_read_metadata(unsigned sap_file_id, H5FP_obj_t obj_type,
H5AC_subid_t type_id, haddr_t addr,
size_t size, uint8_t **buf, unsigned *req_id,
H5FP_status_t *status);
extern herr_t H5FP_request_close(unsigned sap_file_id, unsigned *req_id);
/* Helper functions */
extern 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);
#ifdef __cplusplus
}
#endif /* __cplusplus */

File diff suppressed because it is too large Load Diff