summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2014-02-25 19:46:43 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2014-02-25 19:46:43 (GMT)
commitc5170c77aab259b1060f713ea04dbda0386f90d4 (patch)
treebb77b0b67a3ef012f681e42114eedda35721d897
parentb9f277756bd66cd60dd2150e9800598fe3757135 (diff)
downloadhdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.zip
hdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.tar.gz
hdf5-c5170c77aab259b1060f713ea04dbda0386f90d4.tar.bz2
[svn-r24737] fix async execution for view operations.
-rw-r--r--examples/h5ff_client_view.c66
-rw-r--r--src/H5V.c26
-rw-r--r--src/H5VLiod.c15
-rw-r--r--src/H5VLiod_client.h14
4 files changed, 87 insertions, 34 deletions
diff --git a/examples/h5ff_client_view.c b/examples/h5ff_client_view.c
index 5b7cc78..c3620f6 100644
--- a/examples/h5ff_client_view.c
+++ b/examples/h5ff_client_view.c
@@ -14,9 +14,9 @@
static int my_rank = 0, my_size = 1;
static void
-write_dataset(const char *file_name, const char *dataset_name,
- hsize_t total, hsize_t ncomponents, hid_t datatype_id,
- hsize_t ntuples, hsize_t start, void *buf)
+test_view(const char *file_name, const char *dataset_name,
+ hsize_t total, hsize_t ncomponents, hid_t datatype_id,
+ hsize_t ntuples, hsize_t start, void *buf)
{
hid_t file_id, view_id;
hid_t did1, did2, did3, gid1;
@@ -34,13 +34,20 @@ write_dataset(const char *file_name, const char *dataset_name,
double lower_bound1 = 39.1, upper_bound1 = 42.1;
int lower_bound2 = 295, upper_bound2 = 298;
hid_t query_id1, query_id2, query_id3, query_id4, query_id5, query_id6;
- hid_t query_id;
+ hid_t query_id;
+ hid_t e_stack;
+ H5ES_status_t status;
+ size_t num_events = 0;
MPI_Request mpi_reqs[6];
/* Choose the IOD VOL plugin to use with this file. */
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_iod(fapl_id, MPI_COMM_WORLD, MPI_INFO_NULL);
+ /* create an event Queue for managing asynchronous requests. */
+ e_stack = H5EScreate();
+ assert(e_stack);
+
/* Open an existing file. */
file_id = H5Fcreate_ff(file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id,
H5_EVENT_STACK_NULL);
@@ -226,7 +233,7 @@ write_dataset(const char *file_name, const char *dataset_name,
assert(query_id);
/* create a view on D1 */
- view_id = H5Vcreate_ff(did1, query_id, H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL);
+ view_id = H5Vcreate_ff(did1, query_id, H5P_DEFAULT, rid2, e_stack);
assert(view_id > 0);
{
@@ -240,10 +247,7 @@ write_dataset(const char *file_name, const char *dataset_name,
ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL);
assert(0 == ret);
- ret = H5Vget_location_ff(view_id, &did1, H5_EVENT_STACK_NULL);
- assert(0 == ret);
-
- ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL);
+ ret = H5Vget_location_ff(view_id, &did1, e_stack);
assert(0 == ret);
ret = H5Vget_query(view_id, &query_id);
@@ -255,10 +259,23 @@ write_dataset(const char *file_name, const char *dataset_name,
assert(0 == obj_count);
assert(1 == reg_count);
+ H5ESget_count(e_stack, &num_events);
+ H5ESwait_all(e_stack, &status);
+ H5ESclear(e_stack);
+ printf("%d events in event stack. Completion status = %d\n", num_events, status);
+
+ ret = H5Dclose_ff(did1, H5_EVENT_STACK_NULL);
+ assert(0 == ret);
+
ret = H5Vget_elem_regions_ff(view_id, 0, 1, &did1,
- &region_space, H5_EVENT_STACK_NULL);
+ &region_space, e_stack);
assert(0 == ret);
+ H5ESget_count(e_stack, &num_events);
+ H5ESwait_all(e_stack, &status);
+ H5ESclear(e_stack);
+ printf("%d events in event stack. Completion status = %d\n", num_events, status);
+
r_ndims = H5Sget_simple_extent_dims(region_space, r_dims, NULL);
assert(2 == r_ndims);
@@ -277,11 +294,11 @@ write_dataset(const char *file_name, const char *dataset_name,
H5Vclose(view_id);
- gid1 = H5Gopen_ff(file_id, "G1", H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL);
+ gid1 = H5Gopen_ff(file_id, "G1", H5P_DEFAULT, rid2, e_stack);
assert(gid1 > 0);
/* create a view on all datasets under G1 */
- view_id = H5Vcreate_ff(gid1, query_id, H5P_DEFAULT, rid2, H5_EVENT_STACK_NULL);
+ view_id = H5Vcreate_ff(gid1, query_id, H5P_DEFAULT, rid2, e_stack);
assert(view_id > 0);
{
@@ -293,10 +310,10 @@ write_dataset(const char *file_name, const char *dataset_name,
hsize_t r_dims[2];
H5Qclose(query_id);
- ret = H5Gclose_ff(gid1, H5_EVENT_STACK_NULL);
+ ret = H5Gclose_ff(gid1, e_stack);
assert(0 == ret);
- ret = H5Vget_location_ff(view_id, &gid1, H5_EVENT_STACK_NULL);
+ ret = H5Vget_location_ff(view_id, &gid1, e_stack);
assert(0 == ret);
assert(gid1 > 0);
@@ -309,13 +326,18 @@ write_dataset(const char *file_name, const char *dataset_name,
assert(0 == obj_count);
assert(3 == reg_count);
- ret = H5Vget_elem_regions_ff(view_id, 0, reg_count, did, regions, H5_EVENT_STACK_NULL);
+ ret = H5Vget_elem_regions_ff(view_id, 0, reg_count, did, regions, e_stack);
assert(0 == ret);
+ H5ESget_count(e_stack, &num_events);
+ H5ESwait_all(e_stack, &status);
+ H5ESclear(e_stack);
+ printf("%d events in event stack. Completion status = %d\n", num_events, status);
+
for(i=0 ; i<reg_count ; i++) {
assert(did[i] > 0);
- ret = H5Dclose_ff(did[i], H5_EVENT_STACK_NULL);
+ ret = H5Dclose_ff(did[i], e_stack);
assert(0 == ret);
r_ndims = H5Sget_simple_extent_dims(regions[i], r_dims, NULL);
@@ -335,6 +357,11 @@ write_dataset(const char *file_name, const char *dataset_name,
}
}
+ H5ESget_count(e_stack, &num_events);
+ H5ESwait_all(e_stack, &status);
+ H5ESclear(e_stack);
+ printf("%d events in event stack. Completion status = %d\n", num_events, status);
+
H5Vclose(view_id);
H5Qclose(query_id);
@@ -368,6 +395,9 @@ write_dataset(const char *file_name, const char *dataset_name,
ret = H5TRclose(tid1);
assert(0 == ret);
+ ret = H5ESclose(e_stack);
+ assert(ret == 0);
+
MPI_Barrier(MPI_COMM_WORLD);
/* Close the file. */
@@ -414,8 +444,8 @@ main(int argc, char **argv)
MPI_Barrier(MPI_COMM_WORLD);
- write_dataset(file_name, dataset_name, total, ncomponents, H5T_NATIVE_INT,
- ntuples, start, data);
+ test_view(file_name, dataset_name, total, ncomponents, H5T_NATIVE_INT,
+ ntuples, start, data);
MPI_Barrier(MPI_COMM_WORLD);
diff --git a/src/H5V.c b/src/H5V.c
index 17f5281..370ab28 100644
--- a/src/H5V.c
+++ b/src/H5V.c
@@ -425,6 +425,13 @@ H5Vget_counts(hid_t view_id, hsize_t *attr_count, hsize_t *obj_count, hsize_t *e
if(NULL == (view = (H5VL_iod_view_t *)H5I_object_verify(view_id, H5I_VIEW)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an view ID");
+ if(view->common.request) {
+ if(H5VL_IOD_PENDING == view->common.request->state) {
+ if(H5VL_iod_request_wait(view->common.file, view->common.request) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't wait on operation");
+ }
+ }
+
if(NULL != attr_count)
*attr_count = view->attr_info.count;
if(NULL != obj_count)
@@ -487,8 +494,12 @@ H5Vget_location_ff(hid_t view_id, hid_t *loc_id, hid_t estack_id)
vol_plugin->nrefs ++;
}
- tr.file = view->file;
+ tr.file = view->common.file;
tr.trans_num = view->c_version;
+ tr.req_info.request = NULL;
+ tr.req_info.head = NULL;
+ tr.req_info.tail = NULL;
+ tr.req_info.num_req = 0;
if(NULL == (opened_obj = H5VL_iod_obj_open_token(view->loc_info.buf,
&tr, &opened_type, req)))
@@ -539,6 +550,13 @@ H5Vget_elem_regions_ff(hid_t view_id, hsize_t start, hsize_t count, hid_t datase
if(NULL == (view = (H5VL_iod_view_t *)H5I_object_verify(view_id, H5I_VIEW)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an view ID");
+ if(view->common.request) {
+ if(H5VL_IOD_PENDING == view->common.request->state) {
+ if(H5VL_iod_request_wait(view->common.file, view->common.request) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't wait on operation");
+ }
+ }
+
if(start >= view->region_info.count || start+count > view->region_info.count)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "start/count out of range")
@@ -564,8 +582,12 @@ H5Vget_elem_regions_ff(hid_t view_id, hsize_t start, hsize_t count, hid_t datase
vol_plugin->nrefs ++;
}
- tr.file = view->file;
+ tr.file = view->common.file;
tr.trans_num = view->c_version;
+ tr.req_info.request = NULL;
+ tr.req_info.head = NULL;
+ tr.req_info.tail = NULL;
+ tr.req_info.num_req = 0;
if(NULL == (opened_obj = H5VL_iod_obj_open_token(view->region_info.tokens[i].buf,
&tr, &opened_type, req)))
diff --git a/src/H5VLiod.c b/src/H5VLiod.c
index bd5be88..fa8f843 100644
--- a/src/H5VLiod.c
+++ b/src/H5VLiod.c
@@ -6161,7 +6161,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type,
if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN,
(H5VL_iod_object_t *)dset, 1, 0, NULL,
- (H5VL_iod_req_info_t *)tr, &input,
+ NULL, &input,
&dset->remote_dset.iod_oh, dset, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship dataset open_by_token");
@@ -6227,7 +6227,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type,
if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN,
(H5VL_iod_object_t *)dtype, 1, 0, NULL,
- (H5VL_iod_req_info_t *)tr, &input,
+ NULL, &input,
&dtype->remote_dtype.iod_oh, dtype, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship datatype open_by_token");
@@ -6277,7 +6277,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type,
if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN,
(H5VL_iod_object_t *)grp, 1, 0, NULL,
- (H5VL_iod_req_info_t *)tr, &input,
+ NULL, &input,
&grp->remote_group.iod_oh, grp, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship group open_by_token");
@@ -6358,7 +6358,7 @@ H5VL_iod_obj_open_token(const void *token, H5TR_t *tr, H5I_type_t *opened_type,
if(H5VL__iod_create_and_forward(H5VL_OBJECT_OPEN_BY_TOKEN_ID, HG_OBJECT_OPEN_BY_TOKEN,
(H5VL_iod_object_t *)map, 1, 0, NULL,
- (H5VL_iod_req_info_t *)tr, &input,
+ NULL, &input,
&map->remote_map, map, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship map open");
@@ -9995,7 +9995,7 @@ H5VL_iod_view_create(void *_obj, hid_t query_id, hid_t vcpl_id, hid_t rcxt_id, v
input.cs_scope = obj->file->md_integrity_scope;
/* initialize View object */
- view->file = obj->file;
+ view->common.file = obj->file;
view->c_version = rc->c_version;
/* store a token for the location object */
@@ -10032,8 +10032,9 @@ H5VL_iod_view_create(void *_obj, hid_t query_id, hid_t vcpl_id, hid_t rcxt_id, v
#endif
if(H5VL__iod_create_and_forward(H5VL_VIEW_CREATE_ID, HG_VIEW_CREATE,
- obj, 0, num_parents, parent_reqs,
- (H5VL_iod_req_info_t *)rc, &input, view, view, req) < 0)
+ (H5VL_iod_object_t *)view, 1, num_parents, parent_reqs,
+ (H5VL_iod_req_info_t *)rc, &input, &view->valid_view,
+ view, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "failed to create and ship view create");
ret_value = (void *)view;
diff --git a/src/H5VLiod_client.h b/src/H5VLiod_client.h
index 653f8f5..01ccaf8 100644
--- a/src/H5VLiod_client.h
+++ b/src/H5VLiod_client.h
@@ -275,14 +275,14 @@ typedef struct H5VL_iod_dtype_t {
/* struct that contains the information about a View object */
typedef struct H5VL_iod_view_t {
/* Do NOT change the order of the parameters */
- hbool_t valid_view;
- region_info_t region_info;
- obj_info_t obj_info;
- attr_info_t attr_info;
- loc_info_t loc_info;
- struct H5VL_iod_file_t *file;
+ H5VL_iod_object_t common; /* must be first */
+ hbool_t valid_view; /* indicates whether the view constructed is valid or not */
+ region_info_t region_info; /* struct containing dataset tokens and region dataspace IDs of view */
+ obj_info_t obj_info; /* struct containing object info from link queries in view */
+ attr_info_t attr_info; /* struct containing attr info from attribute queries in view */
+ loc_info_t loc_info; /* token for the location object where the view was constructed */
uint64_t c_version;
- hid_t query_id;
+ hid_t query_id;
hid_t vcpl_id;
} H5VL_iod_view_t;