Merge pull request #178 in HDFFV/hdf5 from ~DEROBINS/hdf5_der:expanded_eoc_test to develop

Updated the evict-on-close test to better exercise groups.

* commit '30bd7247d80f08aee4fc7038df86c43258344de8':
  Updated the evict-on-close test to create a large number of subgroups in a containing group. This will ensure that many cache entries will be used, making a better test of EoC functionality.
This commit is contained in:
Dana Robinson 2016-11-29 13:36:08 -06:00
commit 28fdd9e963

View File

@ -49,10 +49,8 @@ const char *FILENAMES[] = {
#define FILENAME_BUF_SIZE 1024
/* Group names */
#define GROUP_OLD_STYLE_1_NAME "old1"
#define GROUP_OLD_STYLE_2_NAME "old2"
#define GROUP_NEW_STYLE_1_NAME "new1"
#define GROUP_NEW_STYLE_2_NAME "new2"
#define GROUP_OLD_STYLE_NAME "old_style_groups"
#define GROUP_NEW_STYLE_NAME "new_style_groups"
/* Dataset names */
#define DSET_COMPACT_NAME "compact"
@ -63,14 +61,21 @@ const char *FILENAMES[] = {
#define DSET_FARRAY_NAME "farray"
#define DSET_SINGLE_NAME "single"
/* All datasets store 1000 elements */
/* Number of data elements in a dataset */
#define NELEMENTS 1024
/* Number of subgroups in each style of group */
#define NSUBGROUPS 128
/* Max size of subgroup name, not including NULL */
#define SUBGROUP_NAME_SIZE 16
/* Prototypes */
static hbool_t verify_tag_not_in_cache(H5F_t *f, haddr_t tag);
static herr_t check_evict_on_close_api(void);
static hid_t generate_eoc_test_file(hid_t fapl_id);
static herr_t check_dset_scheme(hid_t fid, const char *dset_name);
static herr_t check_group_layout(hid_t fid, const char *group_name, const char *subgroup_name);
static herr_t check_group_layout(hid_t fid, const char *group_name);
/*-------------------------------------------------------------------------
@ -142,6 +147,7 @@ generate_eoc_test_file(hid_t fapl_id)
H5D_layout_t layout_type; /* dataset layout type */
int *data = NULL; /* buffer for fake data */
int n; /* # of data elements */
int i; /* iterator (# subgroups) */
TESTING("generating evict-on-close test file");
@ -175,14 +181,31 @@ generate_eoc_test_file(hid_t fapl_id)
/* Old-style (version 1 B-tree + local heap) */
/*********************************************/
if((gid1 = H5Gcreate2(fid, GROUP_OLD_STYLE_1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if((gid2 = H5Gcreate2(gid1, GROUP_OLD_STYLE_2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
/* A single group is created in the root group, followed
* by a large number of groups in the new group. This will
* ensure that the file data structures for groups include
* multiple cache entries.
*/
if((gid1 = H5Gcreate2(fid, GROUP_OLD_STYLE_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Create sub-groups */
for(i = 0; i < NSUBGROUPS; i++) {
char subgroup_name[SUBGROUP_NAME_SIZE];
/* Create the group name */
HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
TEST_ERROR
if((gid2 = H5Gcreate2(gid1, subgroup_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
} /* end for */
if(H5Gclose(gid1) < 0)
TEST_ERROR;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
/********************************************************************/
/* Generate datasets and ensure that the chunking scheme is correct */
@ -254,17 +277,36 @@ generate_eoc_test_file(hid_t fapl_id)
/* New-style (version 2 B-tree + fractal heap) */
/***********************************************/
if((gid1 = H5Gcreate2(fid, GROUP_NEW_STYLE_1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if((gid2 = H5Gcreate2(gid1, GROUP_NEW_STYLE_2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
/* A single group is created in the root group, followed
* by a large number of groups in the new group. This will
* ensure that the file data structures for groups include
* multiple cache entries.
*/
if((gid1 = H5Gcreate2(fid, GROUP_NEW_STYLE_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Create sub-groups */
for(i = 0; i < NSUBGROUPS; i++) {
char subgroup_name[SUBGROUP_NAME_SIZE];
/* Create the group name */
HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
TEST_ERROR
/* DER - Restore when EoC new-style group bug is resolved.
if((gid2 = H5Gcreate2(gid1, subgroup_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
*/
} /* end for */
if(H5Gclose(gid1) < 0)
TEST_ERROR;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
/********************************************************************/
/* Generate datasets and ensure that the scheme is chunking correct */
/* Generate datasets and ensure that the chunking scheme is correct */
/********************************************************************/
/********************/
@ -523,6 +565,8 @@ generate_eoc_test_file(hid_t fapl_id)
error:
H5E_BEGIN_TRY {
H5Gclose(gid1);
H5Gclose(gid2);
H5Fclose(fid);
H5Dclose(did);
H5Sclose(sid);
@ -542,7 +586,7 @@ error:
* Function: check_group_layout()
*
* Purpose: Verify that the evict-on-close feature works for a given
* group layout.
* group layout (new-style vs. old-style).
*
* Return: SUCCEED/FAIL
*
@ -552,14 +596,14 @@ error:
*-------------------------------------------------------------------------
*/
static herr_t
check_group_layout(hid_t fid, const char *group_name, const char *subgroup_name)
check_group_layout(hid_t fid, const char *group_name)
{
H5F_t *file_ptr = NULL; /* ptr to internal file struct */
hid_t gid1 = -1, gid2 = -1; /* group IDs */
H5G_t *grp_ptr = NULL; /* ptr to internal group struct */
haddr_t tag1, tag2; /* MD cache tags for groups */
int32_t before, during, after; /* cache sizes */
int i; /* iterator */
/* NOTE: The TESTING() macro is called in main() */
@ -577,36 +621,51 @@ check_group_layout(hid_t fid, const char *group_name, const char *subgroup_name)
HDprintf("NUMBER OF CACHE ENTRIES: %d\n", before);
#endif
/* Open groups and get tags */
/* Open the main group and get its tag */
if((gid1 = H5Gopen2(fid, group_name, H5P_DEFAULT)) < 0)
TEST_ERROR;
if((gid2 = H5Gopen2(gid1, subgroup_name, H5P_DEFAULT)) < 0)
TEST_ERROR;
if(NULL == (grp_ptr = (H5G_t *)H5I_object_verify(gid1, H5I_GROUP)))
TEST_ERROR;
tag1 = grp_ptr->oloc.addr;
if(NULL == (grp_ptr = (H5G_t *)H5I_object_verify(gid2, H5I_GROUP)))
TEST_ERROR;
tag2 = grp_ptr->oloc.addr;
/* Open and close all sub-groups */
for(i = 0; i < NSUBGROUPS; i++) {
char subgroup_name[SUBGROUP_NAME_SIZE];
/* Create the group name */
HDmemset(subgroup_name, '\0', SUBGROUP_NAME_SIZE);
if(HDsnprintf(subgroup_name, (size_t)(SUBGROUP_NAME_SIZE - 1), "%d", i) < 0)
TEST_ERROR
if((gid2 = H5Gopen2(gid1, subgroup_name, H5P_DEFAULT)) < 0)
TEST_ERROR;
if(NULL == (grp_ptr = (H5G_t *)H5I_object_verify(gid2, H5I_GROUP)))
TEST_ERROR;
tag2 = grp_ptr->oloc.addr;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
if(TRUE == verify_tag_not_in_cache(file_ptr, tag2))
TEST_ERROR;
} /* end for */
/* Record the number of cache entries */
during = file_ptr->shared->cache->index_len;
during = file_ptr->shared->cache->index_len;
#ifdef EOC_MANUAL_INSPECTION
HDprintf("\nCACHE AFTER OPENING GROUPS (WHILE OPEN):\n");
if(H5AC_dump_cache(file_ptr) < 0)
TEST_ERROR;
HDprintf("TAGS: group: %#X, subgroup: %#X\n", tag1, tag2);
HDprintf("MAIN GROUP TAG: %#X\n", tag1);
HDprintf("NUMBER OF CACHE ENTRIES: %d\n", during);
#endif
/* Close the groups */
/* Close the main group */
if(H5Gclose(gid1) < 0)
TEST_ERROR;
if(H5Gclose(gid2) < 0)
TEST_ERROR;
/* Record the number of cache entries */
after = file_ptr->shared->cache->index_len;
@ -618,12 +677,9 @@ check_group_layout(hid_t fid, const char *group_name, const char *subgroup_name)
HDprintf("NUMBER OF CACHE ENTRIES: %d\n", after);
#endif
/* Ensure that the cache does not contain entries with the tags */
/* Ensure that the cache does not contain entries with the tag */
if(TRUE == verify_tag_not_in_cache(file_ptr, tag1))
TEST_ERROR;
if(TRUE == verify_tag_not_in_cache(file_ptr, tag2))
TEST_ERROR;
/* Compare the number of cache entries */
if(before != after || before == during)
TEST_ERROR;
@ -870,24 +926,12 @@ main(void)
PUTS_ERROR("Unable to set evict-on-close property\n");
} /* end if */
/*************************/
/* Test EoC for datasets */
/*************************/
/* Generate the test file */
if((fid = generate_eoc_test_file(fapl_id)) < 0) {
nerrors++;
PUTS_ERROR("Unable to generate test file\n");
} /* end if */
/* Run tests with old- and new-style groups
* PASSED() and H5_FAILED() are handled in check_configuration()
*/
TESTING("evict on close with old-style groups");
nerrors += check_group_layout(fid, GROUP_OLD_STYLE_1_NAME, GROUP_OLD_STYLE_2_NAME) < 0 ? 1 : 0;
TESTING("evict on close with new-style groups");
nerrors += check_group_layout(fid, GROUP_NEW_STYLE_1_NAME, GROUP_NEW_STYLE_2_NAME) < 0 ? 1 : 0;
/* Run tests with a variety of dataset configurations
* PASSED() and H5_FAILED() are handled in check_configuration()
*/
@ -906,6 +950,16 @@ main(void)
TESTING("evict on close with compact layout");
nerrors += check_dset_scheme(fid, DSET_COMPACT_NAME) < 0 ? 1 : 0;
/* Run tests with old- and new-style groups
* PASSED() and H5_FAILED() are handled in check_configuration()
*/
TESTING("evict on close with old-style groups");
nerrors += check_group_layout(fid, GROUP_OLD_STYLE_NAME) < 0 ? 1 : 0;
/* DER - Enable when EoC new-style groups bug is fixed
TESTING("evict on close with new-style groups");
nerrors += check_group_layout(fid, GROUP_NEW_STYLE_NAME) < 0 ? 1 : 0;
*/
/* Close the test file */
if(H5Fclose(fid) < 0) {
nerrors++;