diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2007-05-14 20:24:08 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2007-05-14 20:24:08 (GMT) |
commit | 31ff357f3190a869147378a9a136510be2caafd7 (patch) | |
tree | 5220b17a8e4b6c434b799108719a1dc15d6c0326 /test | |
parent | 1726061075e9adc99ac2286fb542438acc79c4ab (diff) | |
download | hdf5-31ff357f3190a869147378a9a136510be2caafd7.zip hdf5-31ff357f3190a869147378a9a136510be2caafd7.tar.gz hdf5-31ff357f3190a869147378a9a136510be2caafd7.tar.bz2 |
[svn-r13753] Description:
Check in "unique, but sharable" optimization to ISOHM code, which
allows object header messages that are only used in one object to remain in
the sole user's header, but migrates messages that are used in more than one
header into the ISOHM heap.
Tested on:
Mac OS X/32 10.4.9 (amazon)
FreeBSD/32 6.2 (duty)
Linux/32 2.6 (chicago)
Linux/64 2.6 (chicago2)
Diffstat (limited to 'test')
-rw-r--r-- | test/tsohm.c | 961 |
1 files changed, 682 insertions, 279 deletions
diff --git a/test/tsohm.c b/test/tsohm.c index 010311f..cae7a8f 100644 --- a/test/tsohm.c +++ b/test/tsohm.c @@ -131,6 +131,7 @@ const int ENUM_VAL[] = { typedef struct size2_helper_struct { h5_stat_size_t empty_size; h5_stat_size_t first_dset; + h5_stat_size_t second_dset; h5_stat_size_t dsets1; h5_stat_size_t dsets2; h5_stat_size_t interleaved; @@ -152,9 +153,9 @@ typedef struct size2_helper_struct { /* Helper function prototypes */ static hid_t make_dtype_1(void); static hid_t make_dtype_2(void); -static hid_t close_reopen_file(hid_t file, const char* filename); +static hid_t close_reopen_file(hid_t file, const char* filename, hid_t fapl_id); static void test_sohm_attrs(void); -static void size2_dump_struct(size2_helper_struct *sizes); +static void size2_dump_struct(const char *name, size2_helper_struct *sizes); static void size2_verify(void); static void test_sohm_delete(void); static void test_sohm_delete_revert(void); @@ -529,10 +530,10 @@ error: *------------------------------------------------------------------------- */ static hid_t -close_reopen_file(hid_t file, const char* filename) +close_reopen_file(hid_t file, const char* filename, hid_t fapl_id) { if(H5Fclose(file) < 0) goto error; - return H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + return H5Fopen(filename, H5F_ACC_RDWR, fapl_id); error: return -1; @@ -560,7 +561,7 @@ error: *------------------------------------------------------------------------- */ static hid_t -size1_helper(hid_t file, const char* filename, int test_file_closing) +size1_helper(hid_t file, const char* filename, hid_t fapl_id, int test_file_closing) { dtype1_struct wdata = {11, "string", 22, 33, 44, 55, 66, 77, 88, 0.0}; dtype1_struct rdata; @@ -603,7 +604,7 @@ size1_helper(hid_t file, const char* filename, int test_file_closing) /* Close and re-open the file if requested*/ if(test_file_closing) { - if((file = close_reopen_file(file, filename)) < 0) TEST_ERROR + if((file = close_reopen_file(file, filename, fapl_id)) < 0) TEST_ERROR } /* Create more datasets with the same datatype */ @@ -612,7 +613,7 @@ size1_helper(hid_t file, const char* filename, int test_file_closing) /* Close and re-open the file if requested*/ if(test_file_closing) { - if((file = close_reopen_file(file, filename)) < 0) TEST_ERROR + if((file = close_reopen_file(file, filename, fapl_id)) < 0) TEST_ERROR } if((dset_id = H5Dcreate(file,DSETNAME[2],dtype1_id,space_id,H5P_DEFAULT))<0) TEST_ERROR @@ -620,7 +621,7 @@ size1_helper(hid_t file, const char* filename, int test_file_closing) /* Close and re-open the file if requested*/ if(test_file_closing) { - if((file = close_reopen_file(file, filename)) < 0) TEST_ERROR + if((file = close_reopen_file(file, filename, fapl_id)) < 0) TEST_ERROR } if((dset_id = H5Dcreate(file,DSETNAME[3],dtype1_id,space_id,H5P_DEFAULT))<0) TEST_ERROR @@ -633,7 +634,7 @@ size1_helper(hid_t file, const char* filename, int test_file_closing) /* Close and re-open the file if requested*/ if(test_file_closing) { - if((file = close_reopen_file(file, filename)) < 0) TEST_ERROR + if((file = close_reopen_file(file, filename, fapl_id)) < 0) TEST_ERROR } /* Make sure the data has been written successfully */ @@ -671,7 +672,7 @@ size1_helper(hid_t file, const char* filename, int test_file_closing) if(H5Dclose(dset_id)<0) TEST_ERROR /* Close and re-open the file if requested*/ if(test_file_closing) { - if((file = close_reopen_file(file, filename)) < 0) TEST_ERROR + if((file = close_reopen_file(file, filename, fapl_id)) < 0) TEST_ERROR } } @@ -732,6 +733,7 @@ static void test_sohm_size1(void) { hid_t file = -1; hid_t fcpl_id = -1; + hid_t fapl_id = -1; hsize_t norm_oh_size; hsize_t sohm_oh_size; hsize_t sohm_btree_oh_size; @@ -755,6 +757,13 @@ static void test_sohm_size1(void) MESSAGE(5, ("Testing that shared datatypes save space\n")); + /* Create a FAPL with "semi" close degree, to detect dangling IDs */ + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + CHECK_I(fapl_id, "H5Pcreate"); + + ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI); + CHECK_I(ret, "H5Pset_fclose_degree"); + /* Create a file with SOHMs disabled and get its size */ fcpl_id = H5Pcreate(H5P_FILE_CREATE); CHECK_I(fcpl_id, "H5Pcreate"); @@ -762,7 +771,7 @@ static void test_sohm_size1(void) ret = H5Pset_shared_mesg_nindexes(fcpl_id, 0); CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Fclose(file); @@ -772,9 +781,10 @@ static void test_sohm_size1(void) norm_empty_filesize = h5_get_file_size(FILENAME); /* Add a bunch of large datatypes to the file */ - file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl_id); CHECK_I(file, "H5Fopen"); - file = size1_helper(file, FILENAME, 0); + file = size1_helper(file, FILENAME, fapl_id, 0); + CHECK_I(file, "size1_helper"); /* Get the size of a dataset object header */ ret = H5Gget_objinfo(file, DSETNAME[0], 0, &statbuf); @@ -787,14 +797,15 @@ static void test_sohm_size1(void) norm_final_filesize = h5_get_file_size(FILENAME); /* Use the same property list to create a new file. */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Pclose(fcpl_id); CHECK_I(ret, "H5Pclose"); /* Add the same large datatypes, but keep closing and re-opening the file */ - file = size1_helper(file, FILENAME, 1); + file = size1_helper(file, FILENAME, fapl_id, 1); + CHECK_I(file, "size1_helper"); ret = H5Fclose(file); CHECK_I(ret, "H5Fclose"); @@ -817,7 +828,7 @@ static void test_sohm_size1(void) CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); /* Create a file */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Fclose(file); @@ -826,9 +837,10 @@ static void test_sohm_size1(void) sohm_empty_filesize = h5_get_file_size(FILENAME); /* Add a bunch of datatypes to this file */ - file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl_id); CHECK_I(file, "H5Fopen"); - file = size1_helper(file, FILENAME, 0); + file = size1_helper(file, FILENAME, fapl_id, 0); + CHECK_I(file, "size1_helper"); /* Get the size of a dataset object header */ ret = H5Gget_objinfo(file, DSETNAME[0], 0, &statbuf); @@ -841,14 +853,15 @@ static void test_sohm_size1(void) sohm_final_filesize = h5_get_file_size(FILENAME); /* Use the same property list to create a new file. */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Pclose(fcpl_id); CHECK_I(ret, "H5Pclose"); /* Add the same large datatypes, but keep closing and re-opening the file */ - file = size1_helper(file, FILENAME, 1); + file = size1_helper(file, FILENAME, fapl_id, 1); + CHECK_I(file, "size1_helper"); ret = H5Fclose(file); CHECK_I(ret, "H5Fclose"); @@ -870,7 +883,7 @@ static void test_sohm_size1(void) CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); /* Create a file */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Fclose(file); @@ -879,9 +892,10 @@ static void test_sohm_size1(void) sohm_btree_empty_filesize = h5_get_file_size(FILENAME); /* Add a bunch of datatypes to this file */ - file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl_id); CHECK_I(file, "H5Fopen"); - file = size1_helper(file, FILENAME, 0); + file = size1_helper(file, FILENAME, fapl_id, 0); + CHECK_I(file, "size1_helper"); /* Get the size of a dataset object header */ ret = H5Gget_objinfo(file, DSETNAME[0], 0, &statbuf); @@ -894,14 +908,15 @@ static void test_sohm_size1(void) sohm_btree_final_filesize = h5_get_file_size(FILENAME); /* Use the same property list to create a new file. */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl_id); CHECK_I(file, "H5Fcreate"); ret = H5Pclose(fcpl_id); CHECK_I(ret, "H5Pclose"); /* Add the same large datatypes, but keep closing and re-opening the file */ - file = size1_helper(file, FILENAME, 1); + file = size1_helper(file, FILENAME, fapl_id, 1); + CHECK_I(file, "size1_helper"); ret = H5Fclose(file); CHECK_I(ret, "H5Fclose"); @@ -915,10 +930,15 @@ static void test_sohm_size1(void) * headers. How the SOHM messages are stored shouldn't affect the * size of the object header. */ + /* JAMES: this fails because while the headers are the same size, the + * SOHM header is broken up by the SOHM table, so has to have a + * continuation message and a NULL message. + if(sohm_oh_size >= norm_oh_size) - VERIFY(sohm_oh_size, 1, "H5Fclose"); + VERIFY(sohm_oh_size, 1, "H5Gget_objinfo"); + */ if(sohm_oh_size != sohm_btree_oh_size) - VERIFY(sohm_btree_oh_size, 1, "H5Fclose"); + VERIFY(sohm_btree_oh_size, 1, "H5Gget_objinfo"); /* Both sohm files should be bigger than a normal file when empty. * It's hard to say whether a B-tree with no nodes allocated should be @@ -927,25 +947,28 @@ static void test_sohm_size1(void) * error code triggers. */ if(sohm_empty_filesize <= norm_empty_filesize) - VERIFY(sohm_empty_filesize, 1, "H5Fclose"); + VERIFY(sohm_empty_filesize, 1, "h5_get_file_size"); if(sohm_btree_empty_filesize <= norm_empty_filesize) - VERIFY(sohm_btree_empty_filesize, 1, "H5Fclose"); + VERIFY(sohm_btree_empty_filesize, 1, "h5_get_file_size"); /* When full, the sohm btree file should be smaller than the normal file. * The sohm list file should be at least as small, since it doesn't need the * overhead of a B-tree. */ if(sohm_btree_final_filesize >= norm_final_filesize) - VERIFY(sohm_btree_final_filesize, 1, "H5Fclose"); + VERIFY(sohm_btree_final_filesize, 1, "h5_get_file_size"); if(sohm_final_filesize > sohm_btree_final_filesize) - VERIFY(sohm_final_filesize, 1, "H5Fclose"); + VERIFY(sohm_final_filesize, 1, "h5_get_file_size"); /* This shouldn't change even if we open and close the file */ if(sohm_btree_final_filesize2 >= norm_final_filesize2) - VERIFY(sohm_btree_final_filesize2, 1, "H5Fclose"); + VERIFY(sohm_btree_final_filesize2, 1, "h5_get_file_size"); if(sohm_final_filesize2 > sohm_btree_final_filesize2) - VERIFY(sohm_final_filesize2, 1, "H5Fclose"); + VERIFY(sohm_final_filesize2, 1, "h5_get_file_size"); + + ret = H5Pclose(fapl_id); + CHECK_I(ret, "H5Pclose"); } @@ -1308,15 +1331,17 @@ static void size2_verify_plist2(hid_t plist) *------------------------------------------------------------------------- */ static void -size2_dump_struct(size2_helper_struct *sizes) +size2_dump_struct(const char *name, size2_helper_struct *sizes) { - printf(" empty size: %llu\n", sizes->empty_size); - printf("first dataset: %llu \tdelta: %llu\n", sizes->first_dset, sizes->first_dset - sizes->empty_size); - printf(" dsets 1: %llu \tdelta: %llu\n", sizes->dsets1, sizes->dsets1 - sizes->first_dset); - printf(" dsets 2: %llu \tdelta: %llu\n", sizes->dsets2, sizes->dsets2 - sizes->dsets1); - printf(" interleaved: %llu \tdelta: %llu\n", sizes->interleaved, sizes->interleaved - sizes->dsets2); - printf(" attributes: %llu \tdelta: %llu\n", sizes->attrs1, sizes->attrs1 - sizes->interleaved); - printf(" attributes 2: %llu \tdelta: %llu\n", sizes->attrs2, sizes->attrs2 - sizes->attrs1); + puts(name); + printf(" empty size: %llu\n", sizes->empty_size); + printf(" first dataset: %llu \tdelta: %llu\n", sizes->first_dset, sizes->first_dset - sizes->empty_size); + printf("second dataset: %llu \tdelta: %llu\n", sizes->second_dset, sizes->second_dset - sizes->first_dset); + printf(" dsets 1: %llu \tdelta: %llu\n", sizes->dsets1, sizes->dsets1 - sizes->second_dset); + printf(" dsets 2: %llu \tdelta: %llu\n", sizes->dsets2, sizes->dsets2 - sizes->dsets1); + printf(" interleaved: %llu \tdelta: %llu\n", sizes->interleaved, sizes->interleaved - sizes->dsets2); + printf(" attributes: %llu \tdelta: %llu\n", sizes->attrs1, sizes->attrs1 - sizes->interleaved); + printf(" attributes 2: %llu \tdelta: %llu\n", sizes->attrs2, sizes->attrs2 - sizes->attrs1); } @@ -1342,27 +1367,26 @@ size2_dump_struct(size2_helper_struct *sizes) * *------------------------------------------------------------------------- */ -static size2_helper_struct -size2_helper(hid_t fcpl_id, int test_file_closing) +static int +size2_helper(hid_t fcpl_id, int test_file_closing, size2_helper_struct *ret_sizes) { - hid_t file_id = -1; - hid_t dtype1_id=-1; - hid_t dtype2_id=-1; - hid_t dspace1_id=-1; - hid_t dspace2_id=-1; - hid_t dcpl1_id=-1; - hid_t dcpl2_id=-1; - hid_t dset_id=-1; - hid_t attr_type_id=-1; - hid_t attr_space_id=-1; - hid_t attr_id=-1; - hid_t group_id=-1; - size2_helper_struct ret_val; /* We'll fill in this struct as we go */ + hid_t file_id = -1; + hid_t dtype1_id = -1; + hid_t dtype2_id = -1; + hid_t dspace1_id = -1; + hid_t dspace2_id = -1; + hid_t dcpl1_id = -1; + hid_t dcpl2_id = -1; + hid_t dset_id = -1; + hid_t attr_type_id = -1; + hid_t attr_space_id = -1; + hid_t attr_id = -1; + hid_t group_id = -1; char attr_string1[NAME_BUF_SIZE]; char attr_string2[NAME_BUF_SIZE]; char attr_name[NAME_BUF_SIZE]; int x; - herr_t ret; + herr_t ret; /* Constants used in this function */ const int rank1 = SIZE2_RANK1; @@ -1375,7 +1399,7 @@ size2_helper(hid_t fcpl_id, int test_file_closing) * local disks. Don't close and reopen if express testing is enabled. */ if(GetTestExpress() > 1) - test_file_closing = 0; + test_file_closing = 0; /* Create a file and get its size */ file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); @@ -1385,29 +1409,29 @@ size2_helper(hid_t fcpl_id, int test_file_closing) CHECK_I(ret, "H5Fclose"); /* Get the file size */ - ret_val.empty_size = h5_get_file_size(FILENAME); + ret_sizes->empty_size = h5_get_file_size(FILENAME); /* Re-open the file and set up messages to write */ file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); /* Create two large datatype messages */ - dtype1_id=make_dtype_1(); + dtype1_id = make_dtype_1(); CHECK_I(dtype1_id, "make_dtype_1"); - dtype2_id=make_dtype_2(); + dtype2_id = make_dtype_2(); CHECK_I(dtype2_id, "make_dtype_2"); /* Create some large dataspaces */ - dspace1_id=H5Screate_simple(rank1, dims, dims); + dspace1_id = H5Screate_simple(rank1, dims, dims); CHECK_I(dspace1_id, "H5Screate_simple"); - dspace2_id=H5Screate_simple(rank2, dims, dims); + dspace2_id = H5Screate_simple(rank2, dims, dims); CHECK_I(dspace2_id, "H5Screate_simple"); /* fill1 and fill2 are fill values for the two datatypes. * We'll set them in the DCPL. */ - memset(&fill1, '1', sizeof(dtype1_struct)); - memset(&fill2, '2', DTYPE2_SIZE); + HDmemset(&fill1, '1', sizeof(dtype1_struct)); + HDmemset(&fill2, '2', DTYPE2_SIZE); dcpl1_id = H5Pcreate(H5P_DATASET_CREATE); CHECK_I(dcpl1_id, "H5Pcreate"); @@ -1449,19 +1473,14 @@ size2_helper(hid_t fcpl_id, int test_file_closing) /* Make sure that this property list is what it should be */ size2_verify_plist2(dcpl2_id); - /* Create a dataset with a big datatype, dataspace, fill value, - * and filter pipeline. - */ - dset_id = H5Dcreate(file_id, DSETNAME[0], dtype1_id, dspace1_id, dcpl1_id); - CHECK_I(dset_id, "H5Dcreate"); - - memset(attr_string1, 0, NAME_BUF_SIZE); - memset(attr_string2, 0, NAME_BUF_SIZE); - strcpy(attr_string1, LONG_STRING); - strcpy(attr_string2, LONG_STRING); + /* Set up attribute data */ + HDmemset(attr_string1, 0, NAME_BUF_SIZE); + HDmemset(attr_string2, 0, NAME_BUF_SIZE); + HDstrcpy(attr_string1, LONG_STRING); + HDstrcpy(attr_string2, LONG_STRING); attr_string2[1] = '1'; /* The second string starts "01 index..." */ - /* Create an attribute on this dataset with a large string value */ + /* Set up attribute metadata */ attr_type_id = H5Tcopy(H5T_C_S1); CHECK_I(attr_type_id, "H5Tcopy"); ret = H5Tset_size(attr_type_id ,NAME_BUF_SIZE); @@ -1469,28 +1488,10 @@ size2_helper(hid_t fcpl_id, int test_file_closing) attr_space_id = H5Screate_simple(1, dims, dims); CHECK_I(attr_space_id, "H5Screate_simple"); - attr_id = H5Acreate(dset_id, "attr_name", attr_type_id, attr_space_id, H5P_DEFAULT); - CHECK_I(attr_id, "H5Acreate"); - ret = H5Awrite(attr_id, attr_type_id, attr_string1); - CHECK_I(attr_id, "H5Awrite"); - - /* Close the file and everything in it. */ - H5Aclose(attr_id); - CHECK_I(attr_id, "H5Aclose"); - H5Dclose(dset_id); - CHECK_I(dset_id, "H5Dclose"); - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - - /* Get the file's size now */ - ret_val.first_dset = h5_get_file_size(FILENAME); - - /* Re-open the file and create the same dataset several more times. */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK_I(file_id, "H5Fopen"); - - for(x=1; x<NUM_DATASETS; ++x) - { + /* Create datasets with a big datatype, dataspace, fill value, + * and filter pipeline. + */ + for(x = 0; x < NUM_DATASETS; ++x) { dset_id = H5Dcreate(file_id, DSETNAME[x], dtype1_id, dspace1_id, dcpl1_id); CHECK_I(dset_id, "H5Dcreate"); @@ -1499,21 +1500,36 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Awrite(attr_id, attr_type_id, attr_string1); CHECK_I(ret, "H5Awrite"); - ret = H5Dclose(dset_id); - CHECK_I(ret, "H5Dclose"); ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + ret = H5Dclose(dset_id); + CHECK_I(ret, "H5Dclose"); - if(test_file_closing) { - file_id = close_reopen_file(file_id, FILENAME); + /* Gather extra statistics on first two datasets in file */ + if(x < 2) { + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + /* Get the file's size now */ + if(x == 0) + ret_sizes->first_dset = h5_get_file_size(FILENAME); + else + ret_sizes->second_dset = h5_get_file_size(FILENAME); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); - } - } + } /* end if */ + /* Close & reopen file if requested */ + else if(test_file_closing) { + file_id = close_reopen_file(file_id, FILENAME, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + } /* end if */ + } /* end for */ /* Close file and get its size now */ - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - ret_val.dsets1 = h5_get_file_size(FILENAME); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + ret_sizes->dsets1 = h5_get_file_size(FILENAME); /* Now create a new group filled with datasets that use all different messages */ @@ -1538,10 +1554,11 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + /* Close everything & reopen file if requested */ if(test_file_closing) { ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - file_id = close_reopen_file(file_id, FILENAME); + file_id = close_reopen_file(file_id, FILENAME, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); group_id = H5Gopen(file_id, "group"); CHECK_I(group_id, "H5Gopen"); @@ -1551,9 +1568,9 @@ size2_helper(hid_t fcpl_id, int test_file_closing) /* Close file and get its size now */ ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - ret_val.dsets2 = h5_get_file_size(FILENAME); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + ret_sizes->dsets2 = h5_get_file_size(FILENAME); /* Create a new group and interleave writes of datasets types 1 and 2. */ @@ -1591,10 +1608,11 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + /* Close everything & reopen file if requested */ if(test_file_closing) { ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - file_id = close_reopen_file(file_id, FILENAME); + file_id = close_reopen_file(file_id, FILENAME, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); group_id = H5Gopen(file_id, "interleaved group"); CHECK_I(group_id, "H5Gopen"); @@ -1604,9 +1622,9 @@ size2_helper(hid_t fcpl_id, int test_file_closing) /* Close file and get its size now */ ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - ret_val.interleaved = h5_get_file_size(FILENAME); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + ret_sizes->interleaved = h5_get_file_size(FILENAME); /* Create lots of new attribute messages on the group * (using different strings for the attribute) @@ -1633,10 +1651,11 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + /* Close everything & reopen file if requested */ if(test_file_closing) { ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - file_id = close_reopen_file(file_id, FILENAME); + file_id = close_reopen_file(file_id, FILENAME, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); group_id = H5Gopen(file_id, "group"); CHECK_I(group_id, "H5Gopen"); @@ -1646,9 +1665,9 @@ size2_helper(hid_t fcpl_id, int test_file_closing) /* Close file and get its size now */ ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - ret_val.attrs1 = h5_get_file_size(FILENAME); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + ret_sizes->attrs1 = h5_get_file_size(FILENAME); /* Create all of the attributes again on the other group */ @@ -1672,10 +1691,11 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Aclose(attr_id); CHECK_I(ret, "H5Aclose"); + /* Close everything & reopen file if requested */ if(test_file_closing) { ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - file_id = close_reopen_file(file_id, FILENAME); + file_id = close_reopen_file(file_id, FILENAME, H5P_DEFAULT); CHECK_I(file_id, "H5Fopen"); group_id = H5Gopen(file_id, "interleaved group"); CHECK_I(group_id, "H5Gopen"); @@ -1684,9 +1704,9 @@ size2_helper(hid_t fcpl_id, int test_file_closing) /* Close file and get its size now */ ret = H5Gclose(group_id); CHECK_I(ret, "H5Gclose"); - H5Fclose(file_id); - CHECK_I(file_id, "H5Fclose"); - ret_val.attrs2 = h5_get_file_size(FILENAME); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + ret_sizes->attrs2 = h5_get_file_size(FILENAME); /* Close everything */ @@ -1707,7 +1727,7 @@ size2_helper(hid_t fcpl_id, int test_file_closing) ret = H5Pclose(dcpl2_id); CHECK_I(ret, "H5Pclose"); - return ret_val; + return 0; } @@ -1764,15 +1784,16 @@ static void size2_verify(void) ndims = H5Sget_simple_extent_dims(space_id, dims, NULL); CHECK_I(ndims, "H5Sget_simple_extent_dims"); VERIFY(ndims, SIZE2_RANK1, "H5Sget_simple_extent_dims"); - for(y=0; y<ndims; ++y) { + for(y=0; y<ndims; ++y) VERIFY(dims[y], correct_dims[y], "H5Sget_simple_extent_dims"); - } + ret = H5Sclose(space_id); CHECK_I(ret, "H5Sclose"); ret = H5Dclose(dset_id); CHECK_I(ret, "H5Dclose"); } + /* Get property lists from second batch of datasets */ group1_id = H5Gopen(file_id, "group"); CHECK_I(group1_id, "H5Gopen"); @@ -1791,9 +1812,9 @@ static void size2_verify(void) ndims = H5Sget_simple_extent_dims(space_id, dims, NULL); CHECK_I(ndims, "H5Sget_simple_extent_dims"); VERIFY(ndims, SIZE2_RANK2, "H5Sget_simple_extent_dims"); - for(y=0; y<ndims; ++y) { + for(y=0; y<ndims; ++y) VERIFY(dims[y], correct_dims[y], "H5Sget_simple_extent_dims"); - } + ret = H5Sclose(space_id); CHECK_I(ret, "H5Sclose"); @@ -1806,7 +1827,7 @@ static void size2_verify(void) /* Get property lists from interleaved group of datasets */ group1_id = H5Gopen(file_id, "interleaved group"); CHECK_I(group1_id, "H5Gopen"); - for(x=0; x<NUM_DATASETS; x += 2) { + for(x = 0; x < NUM_DATASETS; x += 2) { /* First "type 1" dataset */ dset_id = H5Dopen(group1_id, DSETNAME[x]); CHECK_I(dset_id, "H5Dopen"); @@ -1821,9 +1842,9 @@ static void size2_verify(void) ndims = H5Sget_simple_extent_dims(space_id, dims, NULL); CHECK_I(ndims, "H5Sget_simple_extent_dims"); VERIFY(ndims, SIZE2_RANK1, "H5Sget_simple_extent_dims"); - for(y=0; y<ndims; ++y) { + for(y=0; y<ndims; ++y) VERIFY(dims[y], correct_dims[y], "H5Sget_simple_extent_dims"); - } + ret = H5Sclose(space_id); CHECK_I(ret, "H5Sclose"); @@ -1844,9 +1865,9 @@ static void size2_verify(void) ndims = H5Sget_simple_extent_dims(space_id, dims, NULL); CHECK_I(ndims, "H5Sget_simple_extent_dims"); VERIFY(ndims, SIZE2_RANK2, "H5Sget_simple_extent_dims"); - for(y=0; y<ndims; ++y) { + for(y=0; y<ndims; ++y) VERIFY(dims[y], correct_dims[y], "H5Sget_simple_extent_dims"); - } + ret = H5Sclose(space_id); CHECK_I(ret, "H5Sclose"); @@ -1871,13 +1892,12 @@ static void size2_verify(void) group2_id = H5Gopen(file_id, "interleaved group"); CHECK_I(group2_id, "H5Gopen"); - memset(attr_string, 0, NAME_BUF_SIZE); - memset(attr_correct_string, 0, NAME_BUF_SIZE); - strcpy(attr_correct_string, LONG_STRING); - strcpy(attr_name, "00 index"); + HDmemset(attr_string, 0, NAME_BUF_SIZE); + HDmemset(attr_correct_string, 0, NAME_BUF_SIZE); + HDstrcpy(attr_correct_string, LONG_STRING); + HDstrcpy(attr_name, "00 index"); - for(x=0; x<NUM_ATTRIBUTES; ++x) - { + for(x = 0; x < NUM_ATTRIBUTES; ++x) { /* Create the name and correct value for each attribute */ attr_correct_string[0] = attr_name[0] = (x / 10) + '0'; attr_correct_string[1] = attr_name[1] = (x % 10) + '0'; @@ -1910,6 +1930,7 @@ static void size2_verify(void) ret = H5Fclose(file_id); CHECK_I(ret, "H5Fclose"); } + /*------------------------------------------------------------------------- * Function: test_sohm_size2 @@ -1931,8 +1952,6 @@ static void size2_verify(void) * Programmer: James Laird * Friday, November 17, 2006 * - * Modifications: - * *------------------------------------------------------------------------- */ static void test_sohm_size2(int close_reopen) @@ -1951,12 +1970,10 @@ static void test_sohm_size2(int close_reopen) size2_helper_struct share_some_toobig_index, share_tiny_index, type_space_index; herr_t ret; - if(close_reopen == 0) { - MESSAGE(5, ("Testing that shared object header messages save space\n")); - } - else { - MESSAGE(5, ("Testing that shared messages save space when file is closed and reopened\n")); - } + if(close_reopen == 0) + MESSAGE(5, ("Testing that shared object header messages save space\n")) + else + MESSAGE(5, ("Testing that shared messages save space when file is closed and reopened\n")) /* Create an fcpl with SOHMs disabled */ fcpl_id = H5Pcreate(H5P_FILE_CREATE); @@ -1965,9 +1982,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_nindexes(fcpl_id, 0); CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - /* Find out what size file this makes */ - norm_sizes = size2_helper(fcpl_id, close_reopen); - /* Check that the file was created correctly */ + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &norm_sizes); size2_verify(); ret = H5Pclose(fcpl_id); @@ -1987,9 +2003,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 30, 25); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - /* Find out what size file this makes */ - list_index_med = size2_helper(fcpl_id, close_reopen); - /* Check that the file was created correctly */ + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &list_index_med); size2_verify(); @@ -1997,9 +2012,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 1000, 900); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - /* Find out what size file this makes */ - list_index_big = size2_helper(fcpl_id, close_reopen); - /* Check that the file was created correctly */ + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &list_index_big); size2_verify(); @@ -2007,8 +2021,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - btree_index = size2_helper(fcpl_id, close_reopen); - /* Check that the file was created correctly */ + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &btree_index); size2_verify(); @@ -2016,8 +2030,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 10, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - list_index_small = size2_helper(fcpl_id, close_reopen); - /* Check that the file was created correctly */ + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &list_index_small); size2_verify(); ret = H5Pclose(fcpl_id); @@ -2043,7 +2057,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 30, 25); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - mult_index_med = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &mult_index_med); size2_verify(); @@ -2051,13 +2066,11 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - mult_index_btree = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &mult_index_btree); size2_verify(); - ret = H5Pset_shared_mesg_phase_change(fcpl_id, NUM_DATASETS, 0); - CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - /* Edit the same property list (this should work) and don't share all messages. */ ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_PLINE_FLAG, 20); @@ -2071,14 +2084,16 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 30, 25); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - share_some_med = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &share_some_med); size2_verify(); /* Use btrees. */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - share_some_btree = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &share_some_btree); size2_verify(); @@ -2088,7 +2103,8 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_index(fcpl_id, 1, H5O_MESG_DTYPE_FLAG | H5O_MESG_FILL_FLAG, 100000); CHECK_I(ret, "H5Pset_shared_mesg_index"); - share_some_toobig_index = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &share_some_toobig_index); size2_verify(); @@ -2102,14 +2118,16 @@ static void test_sohm_size2(int close_reopen) ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_DTYPE_FLAG | H5O_MESG_SDSPACE_FLAG, 1); ret = H5Pset_shared_mesg_phase_change(fcpl_id, 1000, 900); - share_tiny_index = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &share_tiny_index); size2_verify(); /* Create the same file but don't share the really tiny messages */ ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_DTYPE_FLAG | H5O_MESG_SDSPACE_FLAG, 100); ret = H5Pset_shared_mesg_phase_change(fcpl_id, 1000, 900); - type_space_index = size2_helper(fcpl_id, close_reopen); + /* Get the file size & verify its contents */ + size2_helper(fcpl_id, close_reopen, &type_space_index); size2_verify(); ret = H5Pclose(fcpl_id); @@ -2152,8 +2170,8 @@ static void test_sohm_size2(int close_reopen) VERIFY(norm_sizes.first_dset, 1, "h5_get_file_size"); if(list_index_small.first_dset >= btree_index.first_dset) VERIFY(list_index_small.first_dset, 1, "h5_get_file_size"); - if(list_index_med.first_dset >= btree_index.first_dset) - VERIFY(btree_index.first_dset, 1, "h5_get_file_size"); +/* JAMES: can't guarantee if(list_index_med.first_dset >= btree_index.first_dset) + VERIFY(btree_index.first_dset, 1, "h5_get_file_size"); */ if(btree_index.first_dset >= list_index_big.first_dset) VERIFY(list_index_med.first_dset, 1, "h5_get_file_size"); @@ -2166,8 +2184,8 @@ static void test_sohm_size2(int close_reopen) */ if(list_index_small.dsets1 >= list_index_med.dsets1) VERIFY(btree_index.dsets1, 1, "h5_get_file_size"); - if(list_index_med.dsets1 >= btree_index.dsets1) - VERIFY(list_index_med.dsets1, 1, "h5_get_file_size"); +/* JAMES if(list_index_med.dsets1 >= btree_index.dsets1) + VERIFY(list_index_med.dsets1, 1, "h5_get_file_size"); */ if(btree_index.dsets1 >= norm_sizes.dsets1) VERIFY(btree_index.dsets1, 1, "h5_get_file_size"); if(norm_sizes.dsets1 >= list_index_big.dsets1) @@ -2197,8 +2215,8 @@ static void test_sohm_size2(int close_reopen) * then the normal file. The largest list may or may not be bigger than * the normal file. */ - if(list_index_med.dsets2 >= btree_index.dsets2) - VERIFY(list_index_med.dsets2, 1, "h5_get_file_size"); +/*JAMES if(list_index_med.dsets2 >= btree_index.dsets2) + VERIFY(list_index_med.dsets2, 1, "h5_get_file_size"); */ if(btree_index.dsets2 > list_index_small.dsets2 * OVERHEAD_ALLOWED) VERIFY(btree_index.dsets2, list_index_small.dsets2, "h5_get_file_size"); if(list_index_small.dsets2 >= norm_sizes.dsets2) @@ -2230,8 +2248,8 @@ static void test_sohm_size2(int close_reopen) * shared. No new messages should be written to the indexes, so the * sohm files will only get a little bit bigger. */ - if(list_index_med.interleaved >= btree_index.interleaved) - VERIFY(0, 1, "h5_get_file_size"); +/* JAMES if(list_index_med.interleaved >= btree_index.interleaved) + VERIFY(0, 1, "h5_get_file_size"); */ if(btree_index.interleaved > list_index_small.interleaved * OVERHEAD_ALLOWED) VERIFY(btree_index.interleaved, list_index_small.interleaved, "h5_get_file_size"); if(list_index_small.interleaved >= norm_sizes.interleaved) @@ -2319,7 +2337,7 @@ static void test_sohm_size2(int close_reopen) (btree_index.attrs2 - btree_index.attrs1)) VERIFY(0, 1, "h5_get_file_size"); if((list_index_big.attrs2 - list_index_big.attrs1) > - (list_index_med.attrs2 - list_index_med.attrs1)) + (list_index_med.attrs2 - list_index_med.attrs1)) VERIFY(0, 1, "h5_get_file_size"); if((btree_index.attrs2 - btree_index.attrs1) >= (norm_sizes.attrs2 - norm_sizes.attrs1)) @@ -2344,11 +2362,37 @@ static void test_sohm_size2(int close_reopen) /* When the first dataset is written, they should grow quite a bit as * many different indexes must be created. */ - if(mult_index_med.first_dset - mult_index_med.empty_size <= - list_index_med.first_dset - list_index_med.empty_size) + if((mult_index_med.first_dset - mult_index_med.empty_size) <= + (list_index_med.first_dset - list_index_med.empty_size)) + VERIFY(0, 1, "h5_get_file_size"); + if((mult_index_btree.first_dset - mult_index_btree.empty_size) <= + (btree_index.first_dset - btree_index.empty_size)) + VERIFY(0, 1, "h5_get_file_size"); + + /* When the second dataset is written, they should grow less as + * some extra heap space is allocated, but no more indices. + */ + if((mult_index_med.second_dset - mult_index_med.first_dset) > + (mult_index_med.first_dset - mult_index_med.empty_size)) + VERIFY(0, 1, "h5_get_file_size"); + if((list_index_med.second_dset - list_index_med.first_dset) > + (list_index_med.first_dset - list_index_med.empty_size)) + VERIFY(0, 1, "h5_get_file_size"); + if((mult_index_btree.second_dset - mult_index_btree.first_dset) > + (mult_index_btree.first_dset - mult_index_btree.empty_size)) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.first_dset - mult_index_btree.empty_size <= - btree_index.first_dset - btree_index.empty_size) + if((btree_index.second_dset - btree_index.first_dset) > + (btree_index.first_dset - btree_index.empty_size)) + VERIFY(0, 1, "h5_get_file_size"); + + /* And the size delta for the second dataset is less in files with only + * one index. + */ + if((mult_index_med.second_dset - mult_index_med.first_dset) <= + (list_index_med.second_dset - list_index_med.first_dset)) + VERIFY(0, 1, "h5_get_file_size"); + if((mult_index_btree.first_dset - mult_index_btree.empty_size) <= + (btree_index.first_dset - btree_index.empty_size)) VERIFY(0, 1, "h5_get_file_size"); /* Once that initial overhead is out of the way and the lists/btrees @@ -2356,31 +2400,31 @@ static void test_sohm_size2(int close_reopen) * the same rate or slightly faster than files with just one index * and one heap. */ - if(mult_index_med.dsets1 - mult_index_med.first_dset != - list_index_med.dsets1 - list_index_med.first_dset) - VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.dsets1 - mult_index_btree.first_dset != - btree_index.dsets1 - btree_index.first_dset) - VERIFY(0, 1, "h5_get_file_size"); + if((mult_index_med.dsets1 - mult_index_med.second_dset) != + (list_index_med.dsets1 - list_index_med.second_dset)) + VERIFY((mult_index_med.dsets1 - mult_index_med.second_dset), (list_index_med.dsets1 - list_index_med.second_dset), "h5_get_file_size"); + if((mult_index_btree.dsets1 - mult_index_btree.second_dset) != + (btree_index.dsets1 - btree_index.second_dset)) + VERIFY((mult_index_btree.dsets1 - mult_index_btree.second_dset), (btree_index.dsets1 - btree_index.second_dset), "h5_get_file_size"); - if(mult_index_med.dsets2 - mult_index_med.dsets1 > - (list_index_med.dsets2 - list_index_med.dsets1) * OVERHEAD_ALLOWED) + if((mult_index_med.dsets2 - mult_index_med.dsets1) > + (list_index_med.dsets2 - list_index_med.dsets1) * OVERHEAD_ALLOWED) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_med.dsets2 - mult_index_med.dsets1 < - list_index_med.dsets2 - list_index_med.dsets1) + if((mult_index_med.dsets2 - mult_index_med.dsets1) < + (list_index_med.dsets2 - list_index_med.dsets1)) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.dsets2 - mult_index_btree.dsets1 > - (btree_index.dsets2 - btree_index.dsets1) * OVERHEAD_ALLOWED) + if((mult_index_btree.dsets2 - mult_index_btree.dsets1) > + (btree_index.dsets2 - btree_index.dsets1) * OVERHEAD_ALLOWED) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.dsets2 - mult_index_btree.dsets1 < - btree_index.dsets2 - btree_index.dsets1) + if((mult_index_btree.dsets2 - mult_index_btree.dsets1) < + (btree_index.dsets2 - btree_index.dsets1)) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_med.interleaved - mult_index_med.dsets2 > - (list_index_med.interleaved - list_index_med.dsets2) * OVERHEAD_ALLOWED) + if((mult_index_med.interleaved - mult_index_med.dsets2) > + (list_index_med.interleaved - list_index_med.dsets2) * OVERHEAD_ALLOWED) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.interleaved - mult_index_btree.dsets2 > - (btree_index.interleaved - btree_index.dsets2) * OVERHEAD_ALLOWED) + if((mult_index_btree.interleaved - mult_index_btree.dsets2) > + (btree_index.interleaved - btree_index.dsets2) * OVERHEAD_ALLOWED) VERIFY(0, 1, "h5_get_file_size"); /* When all the attributes are added, only the index holding attributes @@ -2388,11 +2432,11 @@ static void test_sohm_size2(int close_reopen) * this happens because it's hard to predict exactly how much space this * will take. */ - if(mult_index_med.attrs2 - mult_index_med.attrs1 != - list_index_med.attrs2 - list_index_med.attrs1) + if((mult_index_med.attrs2 - mult_index_med.attrs1) != + (list_index_med.attrs2 - list_index_med.attrs1)) VERIFY(0, 1, "h5_get_file_size"); - if(mult_index_btree.attrs2 - mult_index_btree.attrs1 != - btree_index.attrs2 - btree_index.attrs1) + if((mult_index_btree.attrs2 - mult_index_btree.attrs1) != + (btree_index.attrs2 - btree_index.attrs1)) VERIFY(0, 1, "h5_get_file_size"); /* The final file size for both of the multiple index files should be @@ -2429,17 +2473,17 @@ static void test_sohm_size2(int close_reopen) /* The files that share some should have a growth rate in between * files that share all messages and normal files */ - if(share_some_med.interleaved - share_some_med.first_dset <= - mult_index_med.interleaved - mult_index_med.first_dset) + if((share_some_med.interleaved - share_some_med.first_dset) <= + (mult_index_med.interleaved - mult_index_med.first_dset)) VERIFY(0, 1, "h5_get_file_size"); - if(share_some_med.interleaved - share_some_med.first_dset >= - norm_sizes.interleaved - norm_sizes.first_dset) + if((share_some_med.interleaved - share_some_med.first_dset) >= + (norm_sizes.interleaved - norm_sizes.first_dset)) VERIFY(0, 1, "h5_get_file_size"); - if(share_some_btree.interleaved - share_some_btree.first_dset <= - mult_index_btree.interleaved - mult_index_btree.first_dset) + if((share_some_btree.interleaved - share_some_btree.first_dset) <= + (mult_index_btree.interleaved - mult_index_btree.first_dset)) VERIFY(0, 1, "h5_get_file_size"); - if(share_some_btree.interleaved - share_some_btree.first_dset >= - norm_sizes.interleaved - norm_sizes.first_dset) + if((share_some_btree.interleaved - share_some_btree.first_dset) >= + (norm_sizes.interleaved - norm_sizes.first_dset)) VERIFY(0, 1, "h5_get_file_size"); @@ -2471,11 +2515,16 @@ static void test_sohm_size2(int close_reopen) * numbers may be off. */ if(share_tiny_index.empty_size != type_space_index.empty_size) - VERIFY(0, 1, "h5_get_file_size"); + VERIFY(share_tiny_index.empty_size, type_space_index.empty_size, "h5_get_file_size"); - if(share_tiny_index.first_dset >= type_space_index.first_dset) + if(share_tiny_index.first_dset >= type_space_index.first_dset * OVERHEAD_ALLOWED) + VERIFY(share_tiny_index.first_dset, type_space_index.first_dset, "h5_get_file_size"); + if(share_tiny_index.first_dset < type_space_index.first_dset) VERIFY(0, 1, "h5_get_file_size"); - if(share_tiny_index.first_dset * OVERHEAD_ALLOWED < type_space_index.first_dset) + + if(share_tiny_index.second_dset >= type_space_index.second_dset) + VERIFY(share_tiny_index.second_dset, type_space_index.second_dset, "h5_get_file_size"); + if(share_tiny_index.second_dset * OVERHEAD_ALLOWED < type_space_index.second_dset) VERIFY(0, 1, "h5_get_file_size"); if(share_tiny_index.dsets1 >= type_space_index.dsets1) @@ -2502,10 +2551,9 @@ static void test_sohm_size2(int close_reopen) VERIFY(0, 1, "h5_get_file_size"); if(share_tiny_index.attrs2 * OVERHEAD_ALLOWED < type_space_index.attrs2) VERIFY(0, 1, "h5_get_file_size"); -} +} /* end test_sohm_size2() */ - /*------------------------------------------------------------------------- * Function: delete_helper_write * @@ -2548,6 +2596,7 @@ static void delete_helper_write(hid_t file_id, hid_t *dspace_id, hid_t *dcpl_id, ret = H5Dclose(dset_id); CHECK_I(ret, "H5Dclose"); } + /*------------------------------------------------------------------------- * Function: delete_helper_read @@ -2595,8 +2644,8 @@ static void delete_helper_read(hid_t file_id, hid_t *dspace_id, int x) ret = H5Dclose(dset_id); CHECK_I(ret, "H5Dclose"); } - + /*------------------------------------------------------------------------- * Function: delete_helper * @@ -2826,10 +2875,9 @@ test_sohm_delete(void) ret = H5Pclose(dcpl_id[x]); CHECK_I(ret, "H5Pclose"); } -} +} /* end test_sohm_delete() */ - /*------------------------------------------------------------------------- * Function: test_sohm_delete_revert_helper * @@ -2846,15 +2894,20 @@ test_sohm_delete(void) * *------------------------------------------------------------------------- */ -static void test_sohm_delete_revert_helper(hid_t fcpl_id) +static int +test_sohm_delete_revert_helper(hid_t fcpl_id) { hid_t file_id; hid_t dspace_id; hid_t dset_id; hsize_t dims[1] = {1}; h5_stat_size_t initial_filesize, deleted_filesize; + int old_nerrs; /* Number of errors when entering this routine */ herr_t ret; + /* Retrieve the current # of reported errors */ + old_nerrs = GetTestNumErrs(); + /* Create a dataspace for later */ dspace_id = H5Screate_simple(1, dims, dims); CHECK_I(dspace_id, "H5Screate_simple"); @@ -2923,7 +2976,13 @@ static void test_sohm_delete_revert_helper(hid_t fcpl_id) /* Cleanup */ ret = H5Sclose(dspace_id); CHECK_I(ret, "H5Sclose"); -} + + /* Retrieve current # of errors */ + if(old_nerrs == GetTestNumErrs()) + return(0); + else + return(-1); +} /* test_sohm_delete_revert_helper() */ /*------------------------------------------------------------------------- @@ -2955,12 +3014,14 @@ test_sohm_delete_revert(void) CHECK_I(ret, "H5Pset_shared_mesg_index"); /* Call the helper function to test this FCPL. */ - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); /* Try using B-trees */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); /* Try sharing all messages */ @@ -2971,12 +3032,14 @@ test_sohm_delete_revert(void) ret = H5Pset_shared_mesg_phase_change(fcpl_id, 10, 5); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); /* Try using B-trees */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); /* There should be at least two messages in the test (datatype and * dataspace). Use an index that will transition from a list to @@ -2984,7 +3047,8 @@ test_sohm_delete_revert(void) */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 1, 2); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); /* Try with shared messages enabled, but when messages are too big @@ -2992,7 +3056,8 @@ test_sohm_delete_revert(void) */ ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_ALL_FLAG, 35); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_delete_revert_helper(fcpl_id); + ret = test_sohm_delete_revert_helper(fcpl_id); + CHECK_I(ret, "test_sohm_delete_revert_helper"); ret = H5Pclose(fcpl_id); CHECK_I(ret, "H5Pclose"); @@ -3065,7 +3130,6 @@ static void test_sohm_extlink_helper(hid_t src_fcpl_id, hid_t dst_fcpl_id) } - /*------------------------------------------------------------------------- * Function: test_sohm_extlink * @@ -3105,7 +3169,11 @@ test_sohm_extlink(void) /*------------------------------------------------------------------------- * Function: test_sohm_extend_dset_helper * - * Purpose: Tests extending a dataset's dataspace. + * Purpose: Tests extending a dataset's dataspace when sharing is + * enabled. + * + * If close_reopen is TRUE, closes and reopens the file to + * ensure that data is correctly written to disk. * * Programmer: James Laird * Wednesday, January 10, 2007 @@ -3114,21 +3182,26 @@ test_sohm_extlink(void) * *------------------------------------------------------------------------- */ -static void test_sohm_extend_dset_helper(hid_t fcpl_id) +static int +test_sohm_extend_dset_helper(hid_t fcpl_id, hbool_t close_reopen) { hid_t file_id = -1; hid_t orig_space_id = -1; - hid_t space1_id, space2_id; + hid_t space1_id, space2_id, space3_id; hid_t dcpl_id = -1; - hid_t dset1_id, dset2_id; + hid_t dset1_id, dset2_id, dset3_id; hsize_t dims1[] = {1, 2}; hsize_t max_dims[] = {H5S_UNLIMITED, 2}; hsize_t dims2[] = {5, 2}; hsize_t out_dims[2]; hsize_t out_maxdims[2]; int x; + int old_nerrs; /* Number of errors when entering this routine */ herr_t ret; + /* Retrieve the current # of reported errors */ + old_nerrs = GetTestNumErrs(); + /* Create file */ file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); CHECK_I(file_id, "H5Fcreate"); @@ -3145,24 +3218,162 @@ static void test_sohm_extend_dset_helper(hid_t fcpl_id) dset1_id = H5Dcreate(file_id, "dataset", H5T_NATIVE_LONG, orig_space_id, dcpl_id); CHECK_I(dset1_id, "H5Dcreate"); - /* Create another dataset with the same dataspace */ + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + } + + /* Create another dataset starting with the same dataspace */ dset2_id = H5Dcreate(file_id, "dataset2", H5T_NATIVE_LONG, orig_space_id, dcpl_id); CHECK_I(dset2_id, "H5Dcreate"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + } + + /* Create a third dataset with the same dataspace */ + dset3_id = H5Dcreate(file_id, "dataset3", H5T_NATIVE_LONG, orig_space_id, dcpl_id); + CHECK_I(dset3_id, "H5Dcreate"); + + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } + /* Extend the first dataset */ ret = H5Dextend(dset1_id, dims2); CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } /* Get the dataspaces from the datasets */ space1_id = H5Dget_space(dset1_id); CHECK_I(space1_id, "H5Dget_space"); space2_id = H5Dget_space(dset2_id); CHECK_I(space2_id, "H5Dget_space"); + space3_id = H5Dget_space(dset3_id); + CHECK_I(space3_id, "H5Dget_space"); /* Verify the dataspaces */ ret = H5Sget_simple_extent_dims(space1_id, out_dims, out_maxdims); CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + + ret = H5Sget_simple_extent_dims(space2_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims1[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + ret = H5Sget_simple_extent_dims(space3_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims1[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + + /* Close all three dataspaces */ + ret = H5Sclose(space1_id); + CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space2_id); + CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space3_id); + CHECK_I(ret, "H5Sclose"); + + /* Extend the second dataset */ + ret = H5Dextend(dset2_id, dims2); + CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } + + /* Get the dataspaces from the datasets */ + space1_id = H5Dget_space(dset1_id); + CHECK_I(space1_id, "H5Dget_space"); + space2_id = H5Dget_space(dset2_id); + CHECK_I(space2_id, "H5Dget_space"); + space3_id = H5Dget_space(dset3_id); + CHECK_I(space3_id, "H5Dget_space"); + + /* Verify the dataspaces */ + ret = H5Sget_simple_extent_dims(space1_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); for(x=0; x<EXTEND_NDIMS; ++x) { VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); @@ -3170,83 +3381,240 @@ static void test_sohm_extend_dset_helper(hid_t fcpl_id) ret = H5Sget_simple_extent_dims(space2_id, out_dims, out_maxdims); CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + ret = H5Sget_simple_extent_dims(space3_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); for(x=0; x<EXTEND_NDIMS; ++x) { VERIFY(out_dims[x], dims1[x], "H5Sget_simple_extent_dims"); VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); } - /* Close both dataspaces */ + /* Close all three dataspaces */ + ret = H5Sclose(space1_id); + CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space2_id); + CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space3_id); + CHECK_I(ret, "H5Sclose"); + + /* Extend the third dataset */ + ret = H5Dextend(dset3_id, dims2); + CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } + + /* Get the dataspaces from the datasets */ + space1_id = H5Dget_space(dset1_id); + CHECK_I(space1_id, "H5Dget_space"); + space2_id = H5Dget_space(dset2_id); + CHECK_I(space2_id, "H5Dget_space"); + space3_id = H5Dget_space(dset3_id); + CHECK_I(space3_id, "H5Dget_space"); + + /* Verify the dataspaces */ + ret = H5Sget_simple_extent_dims(space1_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + + ret = H5Sget_simple_extent_dims(space2_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + + ret = H5Sget_simple_extent_dims(space3_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + + /* Close all three dataspaces */ ret = H5Sclose(space1_id); CHECK_I(ret, "H5Sclose"); ret = H5Sclose(space2_id); CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space3_id); + CHECK_I(ret, "H5Sclose"); /* Close the datasets and file */ ret = H5Dclose(dset1_id); CHECK_I(ret, "H5Dclose"); ret = H5Dclose(dset2_id); CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); ret = H5Fclose(file_id); CHECK_I(ret, "H5Fclose"); - /* Create new datasets in a new file, but this time close them before - * extending to make sure that the old dataspaces are written to - * disk. + + /* Change the order in which datasets are extended to ensure that there + * are no problems if a dataspace goes from being shared to not being + * shared or vice versa. */ file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); CHECK_I(file_id, "H5Fcreate"); dset1_id = H5Dcreate(file_id, "dataset", H5T_NATIVE_LONG, orig_space_id, dcpl_id); CHECK_I(dset1_id, "H5Dcreate"); - dset2_id = H5Dcreate(file_id, "dataset2", H5T_NATIVE_LONG, orig_space_id, dcpl_id); - CHECK_I(dset2_id, "H5Dcreate"); - - /* Close and re-open file and datasets */ - ret = H5Dclose(dset1_id); - CHECK_I(ret, "H5Dclose"); - ret = H5Dclose(dset2_id); - CHECK_I(ret, "H5Dclose"); - ret = H5Fclose(file_id); - CHECK_I(ret, "H5Fclose"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK_I(file_id, "H5Fopen"); - dset1_id = H5Dopen(file_id, "dataset"); - CHECK_I(dset1_id, "H5Dopen"); - dset2_id = H5Dopen(file_id, "dataset2"); - CHECK_I(dset2_id, "H5Dopen"); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + } /* Extend the first dataset */ ret = H5Dextend(dset1_id, dims2); CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); - /* Close and re-open file and datasets */ - ret = H5Dclose(dset1_id); - CHECK_I(ret, "H5Dclose"); - ret = H5Dclose(dset2_id); - CHECK_I(ret, "H5Dclose"); - ret = H5Fclose(file_id); - CHECK_I(ret, "H5Fclose"); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + } - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK_I(file_id, "H5Fopen"); - dset1_id = H5Dopen(file_id, "dataset"); - CHECK_I(dset1_id, "H5Dopen"); - dset2_id = H5Dopen(file_id, "dataset2"); - CHECK_I(dset2_id, "H5Dopen"); + /* Create the second dataset. Its dataspace will be unshared and then + * become shared when extended. + */ + dset2_id = H5Dcreate(file_id, "dataset2", H5T_NATIVE_LONG, orig_space_id, dcpl_id); + CHECK_I(dset2_id, "H5Dcreate"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + } + + /* Extend the second dataset */ + ret = H5Dextend(dset2_id, dims2); + CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + } + + /* Create the third dataset. Its dataspace will be unshared and then + * become shared when extended. + */ + dset3_id = H5Dcreate(file_id, "dataset3", H5T_NATIVE_LONG, orig_space_id, dcpl_id); + CHECK_I(dset3_id, "H5Dcreate"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } + /* Extend the third dataset */ + ret = H5Dextend(dset3_id, dims2); + CHECK_I(ret, "H5Dextend"); + if(close_reopen) { + /* If requested, close all open IDs and reopen them */ + ret = H5Dclose(dset1_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset2_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); + ret = H5Fclose(file_id); + CHECK_I(ret, "H5Fclose"); + + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_I(file_id, "H5Fopen"); + dset1_id = H5Dopen(file_id, "dataset"); + CHECK_I(dset1_id, "H5Dopen"); + dset2_id = H5Dopen(file_id, "dataset2"); + CHECK_I(dset2_id, "H5Dopen"); + dset3_id = H5Dopen(file_id, "dataset3"); + CHECK_I(dset3_id, "H5Dopen"); + } /* Get the dataspaces from the datasets */ space1_id = H5Dget_space(dset1_id); CHECK_I(space1_id, "H5Dget_space"); space2_id = H5Dget_space(dset2_id); CHECK_I(space2_id, "H5Dget_space"); + space3_id = H5Dget_space(dset3_id); + CHECK_I(space3_id, "H5Dget_space"); /* Verify the dataspaces */ ret = H5Sget_simple_extent_dims(space1_id, out_dims, out_maxdims); CHECK_I(ret, "H5Sget_simple_extent_dims"); - for(x=0; x<EXTEND_NDIMS; ++x) { VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); @@ -3254,23 +3622,33 @@ static void test_sohm_extend_dset_helper(hid_t fcpl_id) ret = H5Sget_simple_extent_dims(space2_id, out_dims, out_maxdims); CHECK_I(ret, "H5Sget_simple_extent_dims"); + for(x=0; x<EXTEND_NDIMS; ++x) { + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); + VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); + } + ret = H5Sget_simple_extent_dims(space3_id, out_dims, out_maxdims); + CHECK_I(ret, "H5Sget_simple_extent_dims"); for(x=0; x<EXTEND_NDIMS; ++x) { - VERIFY(out_dims[x], dims1[x], "H5Sget_simple_extent_dims"); + VERIFY(out_dims[x], dims2[x], "H5Sget_simple_extent_dims"); VERIFY(out_maxdims[x], max_dims[x], "H5Sget_simple_extent_dims"); } - /* Close both dataspaces */ + /* Close all three dataspaces */ ret = H5Sclose(space1_id); CHECK_I(ret, "H5Sclose"); ret = H5Sclose(space2_id); CHECK_I(ret, "H5Sclose"); + ret = H5Sclose(space3_id); + CHECK_I(ret, "H5Sclose"); /* Close the datasets and file */ ret = H5Dclose(dset1_id); CHECK_I(ret, "H5Dclose"); ret = H5Dclose(dset2_id); CHECK_I(ret, "H5Dclose"); + ret = H5Dclose(dset3_id); + CHECK_I(ret, "H5Dclose"); ret = H5Fclose(file_id); CHECK_I(ret, "H5Fclose"); @@ -3279,7 +3657,13 @@ static void test_sohm_extend_dset_helper(hid_t fcpl_id) CHECK_I(ret, "H5Sclose"); ret = H5Pclose(dcpl_id); CHECK_I(ret, "H5Pclose"); -} + + /* Retrieve current # of errors */ + if(old_nerrs == GetTestNumErrs()) + return(0); + else + return(-1); +} /* end test_sohm_extend_dset_helper() */ /*------------------------------------------------------------------------- @@ -3311,14 +3695,20 @@ test_sohm_extend_dset(void) CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); /* No shared messages */ - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); /* Only dataspaces */ ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_SDSPACE_FLAG, 16); CHECK_I(ret, "H5Pset_shared_mesg_index"); - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); /* All messages */ ret = H5Pset_shared_mesg_nindexes(fcpl_id, 1); @@ -3326,32 +3716,43 @@ test_sohm_extend_dset(void) ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_MESG_ALL_FLAG, 16); CHECK_I(ret, "H5Pset_shared_mesg_index"); - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); /* All messages in lists */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 100, 50); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); /* All messages in lists converted to B-trees */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 1, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); /* All messages in B-trees */ ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); - test_sohm_extend_dset_helper(fcpl_id); + ret = test_sohm_extend_dset_helper(fcpl_id, FALSE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); + ret = test_sohm_extend_dset_helper(fcpl_id, TRUE); + CHECK_I(ret, "test_sohm_extend_dset_helper"); } - /**************************************************************** ** ** test_sohm(): Main Shared Object Header Message testing routine. @@ -3362,6 +3763,7 @@ test_sohm(void) { /* Output message about test being performed */ MESSAGE(5, ("Testing Shared Object Header Messages\n")); + test_sohm_fcpl(); /* Test SOHMs and file creation plists */ test_sohm_size1(); /* Tests the sizes of files with one SOHM */ test_sohm_attrs(); /* Tests shared messages in attributes */ @@ -3404,3 +3806,4 @@ cleanup_sohm(void) remove(FILENAME_SRC); remove(FILENAME_DST); } + |