summaryrefslogtreecommitdiffstats
path: root/src/H5FPserver.c
diff options
context:
space:
mode:
authorBill Wendling <wendling@ncsa.uiuc.edu>2003-02-12 21:30:20 (GMT)
committerBill Wendling <wendling@ncsa.uiuc.edu>2003-02-12 21:30:20 (GMT)
commit645b7e8c378d3f4abd1b3159198fb5cdb14b34a8 (patch)
tree01c48c6cf670cbd61eaa8d685f7745639b8b56d1 /src/H5FPserver.c
parentd2bfd727ca0e9f298598b723d20faef3edf7b582 (diff)
downloadhdf5-645b7e8c378d3f4abd1b3159198fb5cdb14b34a8.zip
hdf5-645b7e8c378d3f4abd1b3159198fb5cdb14b34a8.tar.gz
hdf5-645b7e8c378d3f4abd1b3159198fb5cdb14b34a8.tar.bz2
[svn-r6401] Purpose:
Update Description: Added a "metadata flush" function which allows the clients to force a dump of the metadata from the SAP. This should be done before closing the file. Modified the information stored on an "open" of the file. The filename is unnecessary, so I got rid of it. More integration with the File Driver code: Passing in a data xfer property list. Platforms tested: Linux
Diffstat (limited to 'src/H5FPserver.c')
-rw-r--r--src/H5FPserver.c110
1 files changed, 86 insertions, 24 deletions
diff --git a/src/H5FPserver.c b/src/H5FPserver.c
index ef99cb8..1144976 100644
--- a/src/H5FPserver.c
+++ b/src/H5FPserver.c
@@ -44,6 +44,13 @@ static int interface_initialize_g = 0;
/* Internal SAP structures */
+/*===----------------------------------------------------------------------===
+ * H5FP_object_lock
+ *===----------------------------------------------------------------------===
+ *
+ * A lock on a given object. A list of current locks is kept in the
+ * appropriate H5FP_file_info structure.
+ */
typedef struct {
uint8_t oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object */
unsigned owned_rank; /* rank which has the lock */
@@ -52,6 +59,14 @@ typedef struct {
H5FP_lock_t rw_lock; /* indicates if it's a read or write lock */
} H5FP_object_lock;
+/*===----------------------------------------------------------------------===
+ * H5FP_mdata_mod
+ *===----------------------------------------------------------------------===
+ *
+ * A given modification (write) of metadata in the file. A list of
+ * current modifications is kept in the appropriate H5FP_file_info
+ * structure.
+ */
typedef struct {
H5FD_mem_t mem_type; /* type of memory updated */
H5FP_obj_t obj_type; /* type of object modified */
@@ -60,10 +75,21 @@ typedef struct {
char *metadata; /* encoded metadata about the object */
} H5FP_mdata_mod;
+/*===----------------------------------------------------------------------===
+ * H5FP_file_info
+ *===----------------------------------------------------------------------===
+ *
+ * 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.
+ */
typedef struct {
H5FD_t file; /* file driver structure */
unsigned file_id; /* the file id the SAP keeps per file */
- char *filename; /* the filename - of dubious use */
int closing; /* we're closing the file - no more changes */
unsigned num_mods; /* number of mdata writes outstanding */
H5TB_TREE *mod_tree; /* a tree of metadata updates done */
@@ -99,10 +125,9 @@ 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, char *filename,
- MPI_Offset maxaddr);
+static herr_t H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr);
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, char *filename);
+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);
@@ -116,15 +141,14 @@ static H5FP_mdata_mod *H5FP_new_file_mod_node(unsigned rank,
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,
- char *mdata,
- unsigned md_size);
+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_read_request(H5FP_request req);
+static herr_t H5FP_sap_handle_flush_request(H5FP_request req);
static herr_t H5FP_sap_handle_close_request(H5FP_request req);
/*
@@ -172,7 +196,7 @@ H5FP_sap_receive_loop(void)
switch (req.req_type) {
case H5FP_REQ_OPEN:
- if ((hrc = H5FP_sap_handle_open_request(req, buf, 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:
@@ -189,6 +213,9 @@ H5FP_sap_receive_loop(void)
case H5FP_REQ_READ:
hrc = H5FP_sap_handle_read_request(req);
break;
+ case H5FP_REQ_FLUSH:
+ hrc = H5FP_sap_handle_flush_request(req);
+ break;
case H5FP_REQ_CLOSE:
hrc = H5FP_sap_handle_close_request(req);
break;
@@ -509,7 +536,6 @@ 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);
- HDfree(info->filename);
HDfree(info);
}
@@ -541,7 +567,7 @@ H5FP_file_info_cmp(H5FP_file_info *k1, H5FP_file_info *k2, int UNUSED cmparg)
* Modifications:
*/
static H5FP_file_info *
-H5FP_new_file_info_node(unsigned file_id, char *filename)
+H5FP_new_file_info_node(unsigned file_id)
{
H5FP_file_info *ret_value;
@@ -551,7 +577,6 @@ H5FP_new_file_info_node(unsigned file_id, char *filename)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "out of memory");
ret_value->file_id = file_id;
- ret_value->filename = filename;
ret_value->closing = FALSE;
ret_value->num_mods = 0;
@@ -609,14 +634,14 @@ H5FP_find_file_info(unsigned file_id)
* Modifications:
*/
static herr_t
-H5FP_add_new_file_info_to_list(unsigned file_id, char *filename, MPI_Offset maxaddr)
+H5FP_add_new_file_info_to_list(unsigned file_id, MPI_Offset maxaddr)
{
H5FP_file_info *info;
herr_t ret_value = FAIL;
FUNC_ENTER_NOINIT(H5FP_add_new_file_info_to_list);
- if ((info = H5FP_new_file_info_node(file_id, filename)) != NULL) {
+ if ((info = H5FP_new_file_info_node(file_id)) != NULL) {
if (!H5TB_dins(file_info_tree, (void *)info, NULL)) {
H5FP_free_file_info_node(info);
HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINSERT, FAIL,
@@ -723,6 +748,7 @@ H5FP_dump(H5FP_file_info *info, unsigned to, unsigned req_id, unsigned file_id)
FUNC_ENTER_NOINIT(H5FP_dump);
+ /* check args */
assert(info);
if (!info->mod_tree)
@@ -803,7 +829,7 @@ H5FP_gen_sap_file_id()
* Modifications:
*/
static herr_t
-H5FP_sap_handle_open_request(H5FP_request req, char *mdata, unsigned UNUSED md_size)
+H5FP_sap_handle_open_request(H5FP_request req, unsigned UNUSED md_size)
{
herr_t ret_value = SUCCEED;
int mrc;
@@ -814,7 +840,7 @@ H5FP_sap_handle_open_request(H5FP_request req, char *mdata, unsigned UNUSED md_s
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, mdata, req.addr) != SUCCEED)
+ if (H5FP_add_new_file_info_to_list(new_file_id, req.addr) != SUCCEED)
HGOTO_ERROR(H5E_FPHDF5, H5E_CANTINSERT, FAIL,
"can't insert new file structure to list");
@@ -1219,6 +1245,11 @@ done:
* Function: H5FP_sap_handle_write_request
* Purpose: Handle a request to write a piece of metadata in the
* file.
+ *
+ * N.B: We assume that the client has the lock on the
+ * requesting object before getting here. Why? Because it's
+ * hard to pass the OID for that object down to the
+ * low-level I/O routines...*sigh*
* Return: Success: SUCCEED
* Failure: FAIL
* Programmer: Bill Wendling, 06. August, 2002
@@ -1261,6 +1292,12 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size)
HGOTO_DONE(FAIL);
}
+#if 0
+ /*
+ * We're assuming that the client has the correct lock at this
+ * point...
+ */
+
/* handle the change request */
lock = H5FP_find_object_lock(info, req.oid);
@@ -1273,6 +1310,7 @@ H5FP_sap_handle_write_request(H5FP_request req, char *mdata, unsigned md_size)
exit_state = H5FP_STATUS_NO_LOCK;
HGOTO_DONE(FAIL);
}
+#endif /* 0 */
if (H5FP_add_file_mod_to_list(info, req.mem_type, req.addr,
req.proc_rank, md_size, mdata) != SUCCEED) {
@@ -1291,25 +1329,24 @@ done:
}
/*
- * Function: H5FP_sap_handle_close_request
- * Purpose: Handle a request to close a file.
+ * Function: H5FP_sap_handle_flush_request
+ * Purpose: Handle a request to flush the metadata to a file.
* Return: Success: SUCCEED
* Failure: FAIL
- * Programmer: Bill Wendling, 06. August, 2002
+ * Programmer: Bill Wendling
+ * 12. February 2003
* Modifications:
*/
static herr_t
-H5FP_sap_handle_close_request(H5FP_request req)
+H5FP_sap_handle_flush_request(H5FP_request req)
{
H5FP_file_info *info;
H5FP_status_t exit_state = H5FP_STATUS_OK;
herr_t ret_value = SUCCEED;
- FUNC_ENTER_NOINIT(H5FP_sap_handle_close_request);
-
- if ((info = H5FP_find_file_info(req.file_id)) != NULL) {
- int comm_size;
+ FUNC_ENTER_NOINIT(H5FP_sap_handle_flush_request);
+ if ((info = H5FP_find_file_info(req.file_id)) != NULL)
if (info->num_mods) {
/*
* If there are any modifications not written out yet, dump
@@ -1329,6 +1366,31 @@ H5FP_sap_handle_close_request(H5FP_request req)
}
}
+done:
+ H5FP_send_reply(req.proc_rank, req.req_id, req.file_id, exit_state);
+ FUNC_LEAVE_NOAPI(ret_value);
+}
+
+/*
+ * Function: H5FP_sap_handle_close_request
+ * Purpose: Handle a request to close a file.
+ * Return: Success: SUCCEED
+ * Failure: FAIL
+ * Programmer: Bill Wendling, 06. August, 2002
+ * Modifications:
+ */
+static herr_t
+H5FP_sap_handle_close_request(H5FP_request req)
+{
+ H5FP_file_info *info;
+ H5FP_status_t exit_state = H5FP_STATUS_OK;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOINIT(H5FP_sap_handle_close_request);
+
+ if ((info = H5FP_find_file_info(req.file_id)) != NULL) {
+ int comm_size;
+
/* Get the size of the SAP communicator */
if (MPI_Comm_size(H5FP_SAP_COMM, &comm_size) != MPI_SUCCESS)
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_Comm_size failed");