diff options
author | Bill Wendling <wendling@ncsa.uiuc.edu> | 2003-03-19 23:39:14 (GMT) |
---|---|---|
committer | Bill Wendling <wendling@ncsa.uiuc.edu> | 2003-03-19 23:39:14 (GMT) |
commit | 43eb81fb3c6997ded3a94593d543c413dfa2ce5a (patch) | |
tree | 6fd24a6afad6b69a30ea9677214d0ee2f6a4ea13 | |
parent | 0e83643f8f6505b9fb23989e1286f36572e34f72 (diff) | |
download | hdf5-43eb81fb3c6997ded3a94593d543c413dfa2ce5a.zip hdf5-43eb81fb3c6997ded3a94593d543c413dfa2ce5a.tar.gz hdf5-43eb81fb3c6997ded3a94593d543c413dfa2ce5a.tar.bz2 |
[svn-r6504] Purpose:
Why not?
Description:
Lots of changes. This is basically a "commit because there are a lot
of changes" commit.
The server now acts more like a metadata caching server. The dumping
mechanism finally works (I think). At least in the test I did it
seemed to write things back. There's a new MPI TAG to use
(H5FP_TAG_DUMP) when dumping things. Changed a lot of the functions
from passing a structure around to just passing a pointer to that
structure. I have no clue why I did it the previous way...
Um...And more synchronization stuff between the client and server.
The protocol between the two was being broke in a couple of places.
We're getting closer!
Platforms tested:
Linux (probably Modi4 too)
Misc. update:
-rw-r--r-- | src/H5FPclient.c | 78 | ||||
-rw-r--r-- | src/H5FPprivate.h | 18 | ||||
-rw-r--r-- | src/H5FPserver.c | 281 |
3 files changed, 201 insertions, 176 deletions
diff --git a/src/H5FPclient.c b/src/H5FPclient.c index 0ddaafe..0abbcb2 100644 --- a/src/H5FPclient.c +++ b/src/H5FPclient.c @@ -42,7 +42,7 @@ static int interface_initialize_g = 0; /* local functions */ static unsigned H5FP_gen_request_id(void); -static herr_t H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id, H5FP_read *sap_read); +static herr_t H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id); /* *===----------------------------------------------------------------------=== @@ -69,7 +69,7 @@ static herr_t H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id, H5FP_read *sap_read * Modifications: */ herr_t -H5FP_request_open(H5FP_obj_t obj_type, MPI_Offset maxaddr, +H5FP_request_open(H5FP_obj_t obj_type, haddr_t maxaddr, unsigned long feature_flags, hsize_t meta_block_size, hsize_t sdata_block_size, hsize_t threshold, hsize_t alignment, unsigned *file_id, unsigned *req_id) @@ -111,11 +111,12 @@ H5FP_request_open(H5FP_obj_t obj_type, MPI_Offset maxaddr, 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 ((mrc = MPI_Recv(file_id, 1, MPI_UNSIGNED, (int)H5FP_sap_rank, - H5FP_TAG_FILE_ID, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) - HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); + if ((mrc = MPI_Recv(file_id, 1, MPI_UNSIGNED, (int)H5FP_sap_rank, + H5FP_TAG_FILE_ID, H5FP_SAP_COMM, + &mpi_status)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); + } done: *req_id = req.req_id; @@ -288,7 +289,7 @@ H5FP_request_read_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, unsigned *req_id, H5FP_status_t *status) { H5FP_request req; - H5FP_read sap_read; /* metadata info read from the SAP's cache */ + H5FP_read sap_read; MPI_Status mpi_status; int mrc, my_rank; herr_t ret_value = SUCCEED; @@ -345,7 +346,7 @@ H5FP_request_read_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, * the file. We fall through because at this point the metadata * won't be cached on the server anymore. */ - if (H5FP_dump_to_file(file, dxpl_id, &sap_read) == FAIL) + if (H5FP_dump_to_file(file, dxpl_id) == FAIL) HGOTO_ERROR(H5E_FPHDF5, H5E_WRITEERROR, FAIL, "can't write metadata update to file"); /* FALLTHROUGH */ @@ -388,7 +389,6 @@ H5FP_request_write_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, unsigned *req_id, H5FP_status_t *status) { H5FP_reply sap_reply; - H5FP_read sap_read; /* metadata info read from the SAP's cache */ MPI_Status mpi_status; H5FP_request req; int mrc, my_rank; @@ -443,13 +443,7 @@ H5FP_request_write_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, * FIXME: This is probably too much of a hack and could be fixed * for read/write/closing instances... */ - if ((mrc = MPI_Recv(&sap_read, 1, H5FP_read_t, (int)H5FP_sap_rank, - H5FP_TAG_READ, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) { - *status = H5FP_STATUS_DUMPING_FAILED; - HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc); - } - - if (H5FP_dump_to_file(file, dxpl_id, &sap_read) == FAIL) { + if (H5FP_dump_to_file(file, dxpl_id) == FAIL) { *status = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_WRITEERROR, FAIL, "can't write metadata update to file"); @@ -488,7 +482,6 @@ H5FP_request_flush_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, unsigned *req_id, H5FP_status_t *status) { H5FP_reply sap_reply; - H5FP_read sap_read; /* metadata info read from the SAP's cache */ H5FP_request req; MPI_Status mpi_status; int mrc, my_rank; @@ -530,18 +523,9 @@ H5FP_request_flush_metadata(H5FD_t *file, unsigned file_id, hid_t dxpl_id, * Collect the metadata updates from the SAP and write them to * the file. The function which sends us the dumping data sends * it to us as an H5FP_read object instead of the H5FP_reply - * object we got above. So we need this "extra" read. - * - * FIXME: This is probably too much of a hack and could be fixed - * for read/write/closing instances... + * object we got above. */ - if ((mrc = MPI_Recv(&sap_read, 1, H5FP_read_t, (int)H5FP_sap_rank, - H5FP_TAG_READ, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) { - *status = H5FP_STATUS_DUMPING_FAILED; - HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc); - } - - if (H5FP_dump_to_file(file, dxpl_id, &sap_read) == FAIL) { + if (H5FP_dump_to_file(file, dxpl_id) == FAIL) { *status = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_WRITEERROR, FAIL, "can't write metadata update to file"); @@ -760,8 +744,9 @@ H5FP_gen_request_id() * Modifications: */ static herr_t -H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id, H5FP_read *sap_read) +H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id) { + H5FP_read sap_read; hid_t new_dxpl_id = FAIL; H5P_genplist_t *plist = NULL, *old_plist; unsigned dumping = 1; @@ -771,7 +756,6 @@ H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id, H5FP_read *sap_read) /* check args */ assert(file); - assert(sap_read); if ((old_plist = H5I_object(dxpl_id)) == NULL) HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist"); @@ -797,29 +781,41 @@ H5FP_dump_to_file(H5FD_t *file, hid_t dxpl_id, H5FP_read *sap_read) * dumping info to us. There's a metadata read waiting for us right * now... */ - do { + for (;;) { MPI_Status mpi_status; int mrc; char *mdata; - if (H5FP_read_metadata(&mdata, (int)sap_read->md_size, + HDmemset(&mpi_status, 0, sizeof(mpi_status)); + + if ((mrc = MPI_Recv(&sap_read, 1, H5FP_read_t, (int)H5FP_sap_rank, + H5FP_TAG_DUMP, H5FP_SAP_COMM, &mpi_status)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Recv failed", mrc); + + if (sap_read.status != H5FP_STATUS_DUMPING) { + if (sap_read.status == H5FP_STATUS_DUMPING_FINISHED) + break; + + /* FIXME: ERROR */ + } + + if (H5FP_read_metadata(&mdata, (int)sap_read.md_size, (int)H5FP_sap_rank) != FAIL) { - /* FIXME: Write to the file with this metadata */ + if (H5FD_fphdf5_write_real(file, dxpl_id, sap_read.addr, + (int)sap_read.md_size, mdata) == FAIL) { + HDfree(mdata); + HGOTO_ERROR(H5E_FPHDF5, H5E_WRITEERROR, FAIL, "can't write metadata to file"); + } + HDfree(mdata); } else { /* FIXME: Error */ } - - 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); - } while (sap_read->status != H5FP_STATUS_DUMPING_FINISHED); + } done: if (plist) - /* FIXME: What can I do if this fail?? */ + /* FIXME: What can I do if this fails?? */ H5P_close(plist); FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5FPprivate.h b/src/H5FPprivate.h index f34278f..c033182 100644 --- a/src/H5FPprivate.h +++ b/src/H5FPprivate.h @@ -111,6 +111,7 @@ enum { H5FP_TAG_READ, H5FP_TAG_METADATA, H5FP_TAG_ALLOC, + H5FP_TAG_DUMP, H5FP_TAG_FILE_ID }; @@ -173,12 +174,12 @@ typedef struct { H5FP_lock_t rw_lock; /* Indicates read or write lock */ H5FD_mem_t mem_type; /* Type of memory updated, if req'd */ unsigned md_size; /* Size of the metadata sent in next msg */ - MPI_Offset addr; /* Address of the metadata */ unsigned long feature_flags; /* Feature flags for the file driver */ hsize_t meta_block_size; /* Metadata block size */ hsize_t sdata_block_size; /* Small data block size */ hsize_t threshold; /* Alignment threshold */ hsize_t alignment; /* Alignment (really!) */ + haddr_t addr; /* Address of the metadata */ unsigned char oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object */ } H5FP_request; @@ -241,6 +242,7 @@ extern MPI_Comm H5FP_SAP_BARRIER_COMM; /* Comm if you want to do a barrier */ extern unsigned H5FP_sap_rank; /* The rank of the SAP: Supplied by user */ extern unsigned H5FP_capt_rank; /* The rank which tells SAP of opens */ +extern unsigned H5FP_capt_barrier_rank;/* Rank of captain in barrier comm */ #ifdef __cplusplus extern "C" { @@ -250,11 +252,15 @@ extern "C" { extern herr_t H5FP_sap_receive_loop(void); /* Use these functions to communicate with the SAP */ -extern herr_t H5FP_request_open(H5FP_obj_t obj_type, MPI_Offset maxaddr, - unsigned long feature_flags, hsize_t - meta_block_size, hsize_t sdata_block_size, - hsize_t threshold, hsize_t alignment, - unsigned *file_id, unsigned *req_id); +extern herr_t H5FP_request_open(H5FP_obj_t obj_type, + haddr_t maxaddr, + unsigned long feature_flags, + hsize_t meta_block_size, + hsize_t sdata_block_size, + hsize_t threshold, + hsize_t alignment, + unsigned *file_id, + unsigned *req_id); 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); diff --git a/src/H5FPserver.c b/src/H5FPserver.c index b1cf6af..3d3913f 100644 --- a/src/H5FPserver.c +++ b/src/H5FPserver.c @@ -82,15 +82,15 @@ typedef struct { *===----------------------------------------------------------------------=== * * This has all the information the SAP cares about for a given file: a - * copy of the H5FD_t structure for keeping track of metadata allocations - * in the file, the file ID assigned by the SAP, whether the file is in - * the process of being closed (and, therefore, can't accept anymore - * modifications), a count of the number of modifications not written to - * the file, a list of modifications (writes) made by clients to the - * metadata, and a list of current locks on objects in the file. + * copy of the H5FD_fphdf5_t structure for keeping track of metadata + * allocations in the file, the file ID assigned by the SAP, whether the + * file is in the process of being closed (and, therefore, can't accept + * anymore modifications), a count of the number of modifications not + * written to the file, a list of modifications (writes) made by clients + * to the metadata, and a list of current locks on objects in the file. */ typedef struct { - H5FD_t file; /* file driver structure */ + H5FD_fphdf5_t file; /* file driver structure */ unsigned file_id; /* the file id the SAP keeps per file */ int closing; /* we're closing the file - no more changes */ unsigned num_mods; /* number of mdata writes outstanding */ @@ -127,37 +127,40 @@ static herr_t H5FP_remove_object_lock_from_list(H5FP_file_info *info, H5FP_object_lock *ol); /* local file information handling functions */ -static herr_t H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr, - unsigned long feature_flags, - hsize_t meta_block_size, - hsize_t sdata_block_size, - hsize_t threshold, - hsize_t alignment); -static int H5FP_file_info_cmp(H5FP_file_info *k1, H5FP_file_info *k2, int cmparg); -static H5FP_file_info *H5FP_new_file_info_node(unsigned file_id); -static H5FP_file_info *H5FP_find_file_info(unsigned file_id); -static herr_t H5FP_remove_file_id_from_list(unsigned file_id); -static herr_t H5FP_free_file_info_node(H5FP_file_info *info); +static herr_t H5FP_add_new_file_info_to_list(unsigned file_id, + haddr_t maxaddr, + unsigned long feature_flags, + hsize_t meta_block_size, + hsize_t sdata_block_size, + hsize_t threshold, + hsize_t alignment); +static int H5FP_file_info_cmp(H5FP_file_info *k1, + H5FP_file_info *k2, + int cmparg); +static herr_t H5FP_remove_file_id_from_list(unsigned file_id); +static herr_t H5FP_free_file_info_node(H5FP_file_info *info); +static H5FP_file_info *H5FP_new_file_info_node(unsigned file_id); +static H5FP_file_info *H5FP_find_file_info(unsigned file_id); /* local file modification structure handling functions */ -static H5FP_mdata_mod *H5FP_new_file_mod_node(unsigned rank, +static H5FP_mdata_mod *H5FP_new_file_mod_node(unsigned rank, H5FD_mem_t mem_type, - MPI_Offset addr, + haddr_t addr, unsigned md_size, char *metadata); -static herr_t H5FP_free_mod_node(H5FP_mdata_mod *info); +static herr_t H5FP_free_mod_node(H5FP_mdata_mod *info); /* local request handling functions */ -static herr_t H5FP_sap_handle_open_request(H5FP_request req, unsigned md_size); -static herr_t H5FP_sap_handle_lock_request(H5FP_request req); -static herr_t H5FP_sap_handle_release_lock_request(H5FP_request req); -static herr_t H5FP_sap_handle_read_request(H5FP_request req); -static herr_t H5FP_sap_handle_write_request(H5FP_request req, - char *mdata, - unsigned md_size); -static herr_t H5FP_sap_handle_flush_request(H5FP_request req); -static herr_t H5FP_sap_handle_close_request(H5FP_request req); -static herr_t H5FP_sap_handle_alloc_request(H5FP_request req); +static herr_t H5FP_sap_handle_open_request(H5FP_request *req, unsigned md_size); +static herr_t H5FP_sap_handle_lock_request(H5FP_request *req); +static herr_t H5FP_sap_handle_release_lock_request(H5FP_request *req); +static herr_t H5FP_sap_handle_read_request(H5FP_request *req); +static herr_t H5FP_sap_handle_write_request(H5FP_request *req, + char *mdata, + unsigned md_size); +static herr_t H5FP_sap_handle_flush_request(H5FP_request *req); +static herr_t H5FP_sap_handle_close_request(H5FP_request *req); +static herr_t H5FP_sap_handle_alloc_request(H5FP_request *req); /* *===----------------------------------------------------------------------=== @@ -182,6 +185,7 @@ H5FP_sap_receive_loop(void) herr_t ret_value = SUCCEED; int comm_size; int stop = 0; + H5FP_request req; FUNC_ENTER_NOAPI(H5FP_sap_receive_loop, FAIL); @@ -195,7 +199,6 @@ H5FP_sap_receive_loop(void) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTMAKETREE, FAIL, "cannot make TBBT tree"); for (;;) { - H5FP_request req; char *buf = NULL; herr_t hrc; @@ -204,33 +207,34 @@ H5FP_sap_receive_loop(void) switch (req.req_type) { case H5FP_REQ_OPEN: - if ((hrc = H5FP_sap_handle_open_request(req, req.md_size)) != SUCCEED) + if ((hrc = H5FP_sap_handle_open_request(&req, req.md_size)) != SUCCEED) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTOPENOBJ, FAIL, "cannot open file"); break; case H5FP_REQ_LOCK: case H5FP_REQ_LOCK_END: - hrc = H5FP_sap_handle_lock_request(req); + hrc = H5FP_sap_handle_lock_request(&req); break; case H5FP_REQ_RELEASE: case H5FP_REQ_RELEASE_END: - hrc = H5FP_sap_handle_release_lock_request(req); - break; - case H5FP_REQ_WRITE: - hrc = H5FP_sap_handle_write_request(req, buf, req.md_size); + hrc = H5FP_sap_handle_release_lock_request(&req); break; case H5FP_REQ_READ: - hrc = H5FP_sap_handle_read_request(req); + hrc = H5FP_sap_handle_read_request(&req); + break; + case H5FP_REQ_WRITE: + hrc = H5FP_sap_handle_write_request(&req, buf, req.md_size); break; case H5FP_REQ_FLUSH: - hrc = H5FP_sap_handle_flush_request(req); + hrc = H5FP_sap_handle_flush_request(&req); break; case H5FP_REQ_CLOSE: - hrc = H5FP_sap_handle_close_request(req); + hrc = H5FP_sap_handle_close_request(&req); break; case H5FP_REQ_ALLOC: - hrc = H5FP_sap_handle_alloc_request(req); + hrc = H5FP_sap_handle_alloc_request(&req); break; case H5FP_REQ_STOP: + hrc = SUCCEED; if (++stop == comm_size - 1) goto done; break; @@ -241,8 +245,9 @@ H5FP_sap_receive_loop(void) /* * If the above calls didn't succeed, free the buffer */ - if (hrc != SUCCEED) + if (hrc != SUCCEED) { HDfree(buf); + } } done: @@ -463,7 +468,7 @@ H5FP_free_mod_node(H5FP_mdata_mod *info) */ static H5FP_mdata_mod * H5FP_new_file_mod_node(unsigned UNUSED rank, H5FD_mem_t mem_type, - MPI_Offset addr, unsigned md_size, char *metadata) + haddr_t addr, unsigned md_size, char *metadata) { H5FP_mdata_mod *ret_value = NULL; @@ -494,7 +499,7 @@ done: */ static herr_t H5FP_add_file_mod_to_list(H5FP_file_info *info, H5FD_mem_t mem_type, - MPI_Offset addr, unsigned rank, unsigned md_size, + haddr_t addr, unsigned rank, unsigned md_size, char *metadata) { H5FP_mdata_mod *fm, mod; @@ -503,6 +508,7 @@ H5FP_add_file_mod_to_list(H5FP_file_info *info, H5FD_mem_t mem_type, FUNC_ENTER_NOINIT(H5FP_add_file_mod_to_list); + /* check args */ assert(info); mod.addr = addr; /* This is the key field for the TBBT */ @@ -517,14 +523,16 @@ H5FP_add_file_mod_to_list(H5FP_file_info *info, H5FD_mem_t mem_type, HDfree(fm->metadata); fm->metadata = metadata; fm->md_size = md_size; - ret_value = SUCCEED; - } else if ((fm = H5FP_new_file_mod_node(rank, mem_type, addr, - md_size, metadata)) != NULL) { + HGOTO_DONE(SUCCEED); + } + + if ((fm = H5FP_new_file_mod_node(rank, mem_type, addr, md_size, metadata)) != NULL) { if (!H5TB_dins(info->mod_tree, (void *)fm, NULL)) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINSERT, FAIL, "can't insert modification into tree"); - ret_value = SUCCEED; + ++info->num_mods; + HGOTO_DONE(SUCCEED); } done: @@ -547,7 +555,7 @@ H5FP_free_file_info_node(H5FP_file_info *info) if (info) { H5TB_dfree(info->mod_tree, (void (*)(void*))H5FP_free_mod_node, NULL); H5TB_dfree(info->locks, (void (*)(void*))H5FP_free_object_lock, NULL); - H5FD_free_freelist(&info->file); + H5FD_free_freelist(&info->file.pub); HDfree(info); } @@ -646,7 +654,7 @@ H5FP_find_file_info(unsigned file_id) * Modifications: */ static herr_t -H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr, +H5FP_add_new_file_info_to_list(unsigned file_id, haddr_t maxaddr, unsigned long feature_flags, hsize_t meta_block_size, hsize_t sdata_block_size, @@ -659,6 +667,8 @@ H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr, FUNC_ENTER_NOINIT(H5FP_add_new_file_info_to_list); if ((info = H5FP_new_file_info_node(file_id)) != NULL) { + int mrc; + if (!H5TB_dins(file_info_tree, (void *)info, NULL)) { H5FP_free_file_info_node(info); HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINSERT, FAIL, @@ -669,15 +679,23 @@ H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr, * Initialize some of the information needed for metadata * allocation requests */ - HDmemset(info->file.fl, 0, sizeof(info->file.fl)); - info->file.cls = &H5FD_fphdf5_g; - info->file.maxaddr = maxaddr; - info->file.accum_loc = HADDR_UNDEF; - info->file.feature_flags = feature_flags; - info->file.def_meta_block_size = meta_block_size; - info->file.def_sdata_block_size = sdata_block_size; - info->file.threshold = threshold; - info->file.alignment = alignment; + HDmemset(&info->file, 0, sizeof(info->file)); + info->file.pub.driver_id = H5FD_FPHDF5; + info->file.pub.cls = &H5FD_fphdf5_g; + info->file.pub.maxaddr = maxaddr; + info->file.pub.accum_loc = HADDR_UNDEF; + info->file.pub.feature_flags = feature_flags; + info->file.pub.def_meta_block_size = meta_block_size; + info->file.pub.def_sdata_block_size = sdata_block_size; + info->file.pub.threshold = threshold; + info->file.pub.alignment = alignment; + + if ((mrc = MPI_Comm_rank(H5FP_SAP_COMM, &info->file.mpi_rank)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc); + + if ((mrc = MPI_Comm_size(H5FP_SAP_COMM, &info->file.mpi_size)) != MPI_SUCCESS) + HMPI_GOTO_ERROR(FAIL, "MPI_Comm_rank failed", mrc); + ret_value = SUCCEED; } @@ -791,7 +809,7 @@ H5FP_dump(H5FP_file_info *info, unsigned to, unsigned req_id, unsigned file_id) r.addr = m->addr; r.md_size = m->md_size; - if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)to, H5FP_TAG_REPLY, + if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)to, H5FP_TAG_DUMP, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); @@ -808,12 +826,17 @@ H5FP_dump(H5FP_file_info *info, unsigned to, unsigned req_id, unsigned file_id) r.md_size = 0; r.status = H5FP_STATUS_DUMPING_FINISHED; - if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)to, H5FP_TAG_REPLY, + if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)to, H5FP_TAG_DUMP, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); /* Free up the modification tree */ H5TB_dfree(info->mod_tree, (void (*)(void*))H5FP_free_mod_node, NULL); + + if ((info->mod_tree = H5TB_dmake((H5TB_cmp_t)H5FP_file_mod_cmp, + sizeof(H5FP_mdata_mod), FALSE)) == NULL) + HGOTO_ERROR(H5E_FPHDF5, H5E_CANTMAKETREE, NULL, "cannot make TBBT tree"); + info->mod_tree = NULL; info->num_mods = 0; @@ -852,25 +875,25 @@ H5FP_gen_sap_file_id() * Modifications: */ static herr_t -H5FP_sap_handle_open_request(H5FP_request req, unsigned UNUSED md_size) +H5FP_sap_handle_open_request(H5FP_request *req, unsigned UNUSED md_size) { herr_t ret_value = SUCCEED; int mrc; FUNC_ENTER_NOINIT(H5FP_sap_handle_open_request); - if (req.obj_type == H5FP_OBJ_FILE) { + if (req->obj_type == H5FP_OBJ_FILE) { unsigned new_file_id = H5FP_gen_sap_file_id(); - /* N.B. At this point, req.addr is equiv. to maxaddr in H5FD_open() */ - if (H5FP_add_new_file_info_to_list(new_file_id, req.addr, req.feature_flags, - req.meta_block_size, req.sdata_block_size, - req.threshold, req.alignment) != SUCCEED) + /* N.B. At this point, req->addr is equiv. to maxaddr in H5FD_open() */ + if (H5FP_add_new_file_info_to_list(new_file_id, req->addr, req->feature_flags, + req->meta_block_size, req->sdata_block_size, + req->threshold, req->alignment) != SUCCEED) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINSERT, FAIL, "can't insert new file structure to list"); /* file ID gets broadcast via the captain process */ - if ((mrc = MPI_Send(&new_file_id, 1, MPI_UNSIGNED, (int)H5FP_capt_rank, + if ((mrc = MPI_Send(&new_file_id, 1, MPI_UNSIGNED, (int)req->proc_rank, H5FP_TAG_FILE_ID, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); } @@ -895,10 +918,10 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_lock_request(H5FP_request req) +H5FP_sap_handle_lock_request(H5FP_request *req) { struct lock_group { - unsigned char oid[sizeof(req.oid)]; + unsigned char oid[sizeof(req->oid)]; unsigned file_id; unsigned locked; H5FP_lock_t rw_lock; @@ -923,7 +946,7 @@ H5FP_sap_handle_lock_request(H5FP_request req) * at one time. */ for (i = 0;; ++i) { - if (req.oid[0]) { + if (req->oid[0]) { if (i == list_size) { list_size <<= 1; /* equiv to list_size *= 2; */ oids = HDrealloc(oids, list_size * sizeof(struct lock_group)); @@ -934,17 +957,17 @@ H5FP_sap_handle_lock_request(H5FP_request req) } } - H5FP_COPY_OID(oids[i].oid, req.oid); - oids[i].file_id = req.file_id; - oids[i].rw_lock = req.rw_lock; + H5FP_COPY_OID(oids[i].oid, req->oid); + oids[i].file_id = req->file_id; + oids[i].rw_lock = req->rw_lock; oids[i].locked = FALSE; } - if (req.req_type == H5FP_REQ_LOCK_END) + if (req->req_type == H5FP_REQ_LOCK_END) /* this was the last lock request */ break; - if (H5FP_sap_receive(&req, (int)req.proc_rank, + if (H5FP_sap_receive(req, (int)req->proc_rank, H5FP_TAG_REQUEST, NULL) != SUCCEED) { exit_state = H5FP_STATUS_LOCK_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_CANTRECV, FAIL, "cannot receive messages"); @@ -980,7 +1003,7 @@ H5FP_sap_handle_lock_request(H5FP_request req) oids[j].lock->rw_lock == H5FP_LOCK_READ) || (oids[j].rw_lock == H5FP_LOCK_WRITE && oids[j].lock->rw_lock == H5FP_LOCK_WRITE && - oids[j].lock->owned_rank == req.proc_rank))) { + oids[j].lock->owned_rank == req->proc_rank))) { /* FAILURE */ exit_state = H5FP_STATUS_LOCK_FAILED; HGOTO_DONE(FAIL); @@ -1010,7 +1033,7 @@ H5FP_sap_handle_lock_request(H5FP_request req) oids[j].lock->rw_lock == H5FP_LOCK_READ) || (oids[j].rw_lock == H5FP_LOCK_WRITE && oids[j].lock->rw_lock == H5FP_LOCK_WRITE && - oids[j].lock->owned_rank == req.proc_rank)) { + oids[j].lock->owned_rank == req->proc_rank)) { /* * The requesting process may already have this lock. Might * be a request from some call-back function of some sort. @@ -1026,8 +1049,8 @@ H5FP_sap_handle_lock_request(H5FP_request req) goto rollback; } } else { - H5FP_object_lock *lock = H5FP_new_object_lock(oids[j].oid, req.proc_rank, - req.obj_type, req.rw_lock); + H5FP_object_lock *lock = H5FP_new_object_lock(oids[j].oid, req->proc_rank, + req->obj_type, req->rw_lock); if (lock) { if (!H5TB_dins(oids[j].info->locks, (void *)lock, NULL)) { @@ -1064,7 +1087,7 @@ rollback: for (j = 0; j <= i; ++j) { if (oids[j].locked) { if (oids[j].lock) { - if (oids[j].lock->owned_rank == req.proc_rank) { + if (oids[j].lock->owned_rank == req->proc_rank) { if (--oids[j].lock->ref_count == 0) { H5FP_remove_object_lock_from_list(oids[j].info, oids[j].lock); } @@ -1088,7 +1111,7 @@ HDfprintf(stderr, "%s: locking failure (%d)!!\n", FUNC, ret_value); } HDfree(oids); - H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state); + H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, exit_state); FUNC_LEAVE_NOAPI(ret_value); } @@ -1100,10 +1123,10 @@ HDfprintf(stderr, "%s: locking failure (%d)!!\n", FUNC, ret_value); * Modifications: */ static herr_t -H5FP_sap_handle_release_lock_request(H5FP_request req) +H5FP_sap_handle_release_lock_request(H5FP_request *req) { struct release_group { - unsigned char oid[sizeof(req.oid)]; + unsigned char oid[sizeof(req->oid)]; unsigned file_id; H5FP_file_info *info; H5FP_object_lock *lock; @@ -1126,7 +1149,7 @@ H5FP_sap_handle_release_lock_request(H5FP_request req) * release locks at one time. */ for (i = 0;; ++i) { - if (req.oid[0]) { + if (req->oid[0]) { if (i == list_size) { list_size <<= 1; /* equiv to list_size *= 2; */ oids = HDrealloc(oids, list_size * sizeof(struct release_group)); @@ -1137,15 +1160,15 @@ H5FP_sap_handle_release_lock_request(H5FP_request req) } } - H5FP_COPY_OID(oids[i].oid, req.oid); - oids[i].file_id = req.file_id; + H5FP_COPY_OID(oids[i].oid, req->oid); + oids[i].file_id = req->file_id; } - if (req.req_type == H5FP_REQ_RELEASE_END) + if (req->req_type == H5FP_REQ_RELEASE_END) /* this was the last lock request */ break; - if (H5FP_sap_receive(&req, (int)req.proc_rank, H5FP_TAG_REQUEST, NULL) != SUCCEED) { + if (H5FP_sap_receive(req, (int)req->proc_rank, H5FP_TAG_REQUEST, NULL) != SUCCEED) { exit_state = H5FP_STATUS_LOCK_RELEASE_FAILED; HGOTO_DONE(FAIL); } @@ -1163,7 +1186,7 @@ H5FP_sap_handle_release_lock_request(H5FP_request req) oids[j].lock = H5FP_find_object_lock(oids[j].info, oids[j].oid); - if (!oids[j].lock || oids[j].lock->owned_rank != req.proc_rank) { + if (!oids[j].lock || oids[j].lock->owned_rank != req->proc_rank) { exit_state = H5FP_STATUS_BAD_LOCK; HGOTO_DONE(FAIL); } @@ -1176,7 +1199,7 @@ H5FP_sap_handle_release_lock_request(H5FP_request req) */ for (j = 0; j <= i; ++j) { if (oids[j].lock) { - if (oids[j].lock->owned_rank == req.proc_rank) { + if (oids[j].lock->owned_rank == req->proc_rank) { if (--oids[j].lock->ref_count == 0) H5FP_remove_object_lock_from_list(oids[j].info, oids[j].lock); } else { @@ -1193,7 +1216,7 @@ H5FP_sap_handle_release_lock_request(H5FP_request req) done: HDfree(oids); - H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state); + H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, exit_state); FUNC_LEAVE_NOAPI(ret_value); } @@ -1209,7 +1232,7 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_read_request(H5FP_request req) +H5FP_sap_handle_read_request(H5FP_request *req) { H5FP_file_info *info; H5FP_read r; @@ -1219,18 +1242,18 @@ H5FP_sap_handle_read_request(H5FP_request req) FUNC_ENTER_NOINIT(H5FP_sap_handle_read_request); - r.req_id = req.req_id; - r.file_id = req.file_id; + r.req_id = req->req_id; + r.file_id = req->file_id; r.md_size = 0; r.addr = 0; r.status = H5FP_STATUS_MDATA_NOT_CACHED; - if ((info = H5FP_find_file_info(req.file_id)) != NULL) { + if ((info = H5FP_find_file_info(req->file_id)) != NULL) { H5FP_mdata_mod mod; /* Used to find the correct modification */ H5TB_NODE *node; if (info->num_mods >= H5FP_MDATA_CACHE_HIGHWATER_MARK) { - if (H5FP_dump(info, req.proc_rank, req.req_id, req.file_id) == FAIL) + if (H5FP_dump(info, req->proc_rank, req->req_id, req->file_id) == FAIL) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't dump metadata to client"); @@ -1241,7 +1264,7 @@ H5FP_sap_handle_read_request(H5FP_request req) HGOTO_DONE(SUCCEED); } - mod.addr = req.addr; /* This is the key field for the TBBT */ + mod.addr = req->addr; /* This is the key field for the TBBT */ if ((node = H5TB_dfind(info->mod_tree, (void *)&mod, NULL)) != NULL) { H5FP_mdata_mod *fm = (H5FP_mdata_mod *)node->data; @@ -1253,12 +1276,12 @@ H5FP_sap_handle_read_request(H5FP_request req) } } - if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)req.proc_rank, + if ((mrc = MPI_Send(&r, 1, H5FP_read_t, (int)req->proc_rank, H5FP_TAG_READ, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); if (r.md_size) - if (H5FP_send_metadata(metadata, (int)r.md_size, (int)req.proc_rank) != SUCCEED) + if (H5FP_send_metadata(metadata, (int)r.md_size, (int)req->proc_rank) != SUCCEED) HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't send metadata to client"); @@ -1281,7 +1304,7 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) +H5FP_sap_handle_write_request(H5FP_request *req, char *mdata, unsigned md_size) { H5FP_file_info *info; H5FP_status_t exit_state = H5FP_STATUS_OK; @@ -1289,7 +1312,7 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) FUNC_ENTER_NOINIT(H5FP_sap_handle_write_request); - if ((info = H5FP_find_file_info(req.file_id)) != NULL) { + if ((info = H5FP_find_file_info(req->file_id)) != NULL) { #if 0 H5FP_object_lock *lock; #endif /* 0 */ @@ -1299,14 +1322,14 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) * If there are any modifications not written out yet, dump * them to this process */ - if (H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, + if (H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, H5FP_STATUS_DUMPING) == FAIL) { exit_state = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't send message to client"); } - if (H5FP_dump(info, req.proc_rank, req.req_id, req.file_id) == FAIL) { + if (H5FP_dump(info, req->proc_rank, req->req_id, req->file_id) == FAIL) { exit_state = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "metadata dump failed"); @@ -1326,9 +1349,9 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) */ /* handle the change request */ - lock = H5FP_find_object_lock(info, req.oid); + lock = H5FP_find_object_lock(info, req->oid); - if (!lock || lock->owned_rank != req.proc_rank + if (!lock || lock->owned_rank != req->proc_rank || lock->rw_lock != H5FP_LOCK_WRITE) { /* * There isn't a write lock or we don't own the write @@ -1339,8 +1362,8 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) } #endif /* 0 */ - if (H5FP_add_file_mod_to_list(info, req.mem_type, req.addr, - req.proc_rank, md_size, mdata) != SUCCEED) { + if (H5FP_add_file_mod_to_list(info, req->mem_type, (haddr_t)req->addr, + req->proc_rank, md_size, mdata) != SUCCEED) { exit_state = H5FP_STATUS_OOM; HGOTO_DONE(FAIL); } @@ -1351,7 +1374,7 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size) } done: - H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state); + H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, exit_state); FUNC_LEAVE_NOAPI(ret_value); } @@ -1365,7 +1388,7 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_flush_request(H5FP_request req) +H5FP_sap_handle_flush_request(H5FP_request *req) { H5FP_file_info *info; H5FP_status_t exit_state = H5FP_STATUS_OK; @@ -1373,20 +1396,20 @@ H5FP_sap_handle_flush_request(H5FP_request req) FUNC_ENTER_NOINIT(H5FP_sap_handle_flush_request); - if ((info = H5FP_find_file_info(req.file_id)) != NULL) + if ((info = H5FP_find_file_info(req->file_id)) != NULL) if (info->num_mods) { /* * If there are any modifications not written out yet, dump * them to this process */ - if (H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, + if (H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, H5FP_STATUS_DUMPING) == FAIL) { exit_state = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't send message to client"); } - if (H5FP_dump(info, req.proc_rank, req.req_id, req.file_id) == FAIL) { + if (H5FP_dump(info, req->proc_rank, req->req_id, req->file_id) == FAIL) { exit_state = H5FP_STATUS_DUMPING_FAILED; HGOTO_ERROR(H5E_FPHDF5, H5E_CANTSENDMDATA, FAIL, "can't dump metadata to client"); @@ -1394,7 +1417,7 @@ H5FP_sap_handle_flush_request(H5FP_request req) } done: - H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state); + H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, exit_state); FUNC_LEAVE_NOAPI(ret_value); } @@ -1407,7 +1430,7 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_close_request(H5FP_request req) +H5FP_sap_handle_close_request(H5FP_request *req) { H5FP_file_info *info; H5FP_status_t exit_state = H5FP_STATUS_OK; @@ -1415,7 +1438,7 @@ H5FP_sap_handle_close_request(H5FP_request req) FUNC_ENTER_NOINIT(H5FP_sap_handle_close_request); - if ((info = H5FP_find_file_info(req.file_id)) != NULL) { + if ((info = H5FP_find_file_info(req->file_id)) != NULL) { int comm_size; /* Get the size of the SAP communicator */ @@ -1424,7 +1447,7 @@ H5FP_sap_handle_close_request(H5FP_request req) if (++info->closing == comm_size - 1) /* all processes have closed the file - remove it from list */ - if (H5FP_remove_file_id_from_list(req.file_id) != SUCCEED) { + if (H5FP_remove_file_id_from_list(req->file_id) != SUCCEED) { exit_state = H5FP_STATUS_BAD_FILE_ID; HGOTO_ERROR(H5E_FPHDF5, H5E_NOTFOUND, FAIL, "cannot remove file ID from list"); @@ -1432,7 +1455,7 @@ H5FP_sap_handle_close_request(H5FP_request req) } done: - H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state); + H5FP_send_reply(req->proc_rank, req->req_id, req->file_id, exit_state); FUNC_LEAVE_NOAPI(ret_value); } @@ -1445,20 +1468,20 @@ done: * Modifications: */ static herr_t -H5FP_sap_handle_alloc_request(H5FP_request req) +H5FP_sap_handle_alloc_request(H5FP_request *req) { - H5FP_alloc alloc; + H5FP_alloc sap_alloc; H5FP_file_info *info; int mrc; herr_t ret_value = SUCCEED; FUNC_ENTER_NOINIT(H5FP_sap_handle_alloc_request); - if ((info = H5FP_find_file_info(req.file_id)) != NULL) { - alloc.req_id = req.req_id; - alloc.file_id = info->file_id; - alloc.status = H5FP_STATUS_OK; - alloc.mem_type = req.mem_type; + if ((info = H5FP_find_file_info(req->file_id)) != NULL) { + sap_alloc.req_id = req->req_id; + sap_alloc.file_id = info->file_id; + sap_alloc.status = H5FP_STATUS_OK; + sap_alloc.mem_type = req->mem_type; /* * Try allocating from the free-list that is kept on the server @@ -1474,12 +1497,12 @@ H5FP_sap_handle_alloc_request(H5FP_request req) * * Whatta pain. */ - if ((alloc.addr = H5FD_alloc(&info->file, req.mem_type, - H5P_DEFAULT, req.meta_block_size)) == HADDR_UNDEF) + if ((sap_alloc.addr = H5FD_alloc((H5FD_t*)&info->file, req->mem_type, H5P_DEFAULT, + req->meta_block_size)) == HADDR_UNDEF) HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "SAP unable to allocate file memory"); - if ((mrc = MPI_Send(&alloc, 1, H5FP_alloc_t, (int)req.proc_rank, + if ((mrc = MPI_Send(&sap_alloc, 1, H5FP_alloc_t, (int)req->proc_rank, H5FP_TAG_ALLOC, H5FP_SAP_COMM)) != MPI_SUCCESS) HMPI_GOTO_ERROR(FAIL, "MPI_Send failed", mrc); } |