[svn-r20529] Purpose: Add testing for bug 1864

Description:
Added internal tesitng routines to traverse a file and verify that symbol table
information is *always* cached, whenever possible.  Added this check to the end
of many tests to check all the test files, right before the call to h5_cleanup.

Tested: jam, amani, heiwa (h5committest)
This commit is contained in:
Neil Fortner 2011-04-15 17:05:23 -05:00
parent e1ed6bb771
commit 7610dd20af
31 changed files with 344 additions and 0 deletions

View File

@ -608,6 +608,7 @@ H5_DLL herr_t H5G_new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *c
H5_DLL herr_t H5G_lheap_size_test(hid_t gid, size_t *lheap_size);
H5_DLL herr_t H5G_user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsigned *user_path_hidden);
H5_DLL herr_t H5G_verify_cached_stab_test(H5O_loc_t *grp_oloc, H5G_entry_t *ent);
H5_DLL herr_t H5G_verify_cached_stabs_test(hid_t gid);
#endif /* H5G_TESTING */
#endif /* _H5Gpkg_H */

View File

@ -641,3 +641,167 @@ done:
FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
} /* end H5G_verify_cached_stab_test() */
/*-------------------------------------------------------------------------
* Function: H5G_verify_cached_stabs_test_cb
*
* Purpose: Verify that all entries in this node contain cached symbol
* table information if and only if the entry refers to a
* group with a symbol table, and that that information is
* correct.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* Apr 8, 2011
*
*-------------------------------------------------------------------------
*/
static int
H5G_verify_cached_stabs_test_cb(H5F_t *f, hid_t dxpl_id,
const void UNUSED *_lt_key, haddr_t addr, const void UNUSED *_rt_key,
void UNUSED *udata)
{
H5G_node_t *sn = NULL;
H5O_loc_t targ_oloc;
H5O_t *targ_oh = NULL;
htri_t stab_exists;
H5O_stab_t stab;
unsigned i;
int ret_value = H5_ITER_CONT;
FUNC_ENTER_NOAPI(H5G_verify_cached_stabs_test_cb, H5_ITER_ERROR)
/*
* Check arguments.
*/
HDassert(f);
HDassert(H5F_addr_defined(addr));
/* Load the node */
if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
/* Check each target object to see if its stab message (if present) matches
* the cached stab (if present). If one exists, both must exist. */
/* Initialize constant fields in target oloc */
targ_oloc.file = f;
targ_oloc.holding_file = FALSE;
/* Iterate over entries */
for(i=0; i<sn->nsyms; i++) {
/* Update oloc address */
targ_oloc.addr = sn->entry[i].header;
/* Load target object header */
if(NULL == (targ_oh = H5O_protect(&targ_oloc, dxpl_id, H5AC_READ)))
HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to protect target object header")
/* Check if a symbol table message exists */
if((stab_exists = H5O_msg_exists_oh(targ_oh, H5O_STAB_ID)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to check for STAB message")
if(stab_exists) {
/* Read symbol table message */
if(NULL == H5O_msg_read_oh(f, dxpl_id, targ_oh, H5O_STAB_ID, &stab))
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5_ITER_ERROR, "unable to read STAB message")
/* Check if the stab matches the cached stab info */
if(sn->entry[i].type != H5G_CACHED_STAB)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "STAB message is not cached in group node")
if((sn->entry[i].cache.stab.btree_addr != stab.btree_addr)
|| (sn->entry[i].cache.stab.heap_addr != stab.heap_addr))
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "cached symbol table information is incorrect")
} /* end if */
else if(sn->entry[i].type == H5G_CACHED_STAB)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, H5_ITER_ERROR, "nonexistent STAB message is cached")
/* Unprotect target object */
if(H5O_unprotect(&targ_oloc, dxpl_id, targ_oh, H5AC__NO_FLAGS_SET) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release object header");
targ_oh = NULL;
} /* end for */
done:
if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) < 0)
HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header")
if(targ_oh) {
HDassert(ret_value == H5_ITER_ERROR);
if(H5O_unprotect(&targ_oloc, dxpl_id, targ_oh, H5AC__NO_FLAGS_SET) < 0)
HDONE_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release object header");
} /* end if */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G_verify_cached_stabs_test_cb() */
/*-------------------------------------------------------------------------
* Function: H5G_verify_cached_stabs_test
*
* Purpose: If the provided group contains a symbol table, verifies
* that all links in the group contain cached symbol table
* information if and only if the link points to a group
* with a symbol table, and that that information is correct.
* If the provided group does not contain a symbol table,
* does nothing.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Neil Fortner
* nfortne2@hdfgroup.org
* April 6 2011
*
*-------------------------------------------------------------------------
*/
herr_t
H5G_verify_cached_stabs_test(hid_t gid)
{
H5G_t *grp = NULL; /* Group */
htri_t stab_exists;
H5O_stab_t stab; /* Symbol table message */
H5G_bt_common_t udata = {NULL, NULL}; /* Dummy udata so H5B_iterate doesn't freak out */
haddr_t prev_tag = HADDR_UNDEF; /* Previous metadata tag */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5G_verify_cached_stabs_test, FAIL)
/* check args */
HDassert(gid >= 0);
/* Check args */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set up metadata tagging */
if(H5AC_tag(H5AC_ind_dxpl_id, grp->oloc.addr, &prev_tag) < 0)
HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "unable to apply metadata tag")
/* Check for group having a symbol table message */
/* Check for the group having a group info message */
if((stab_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID,
H5AC_ind_dxpl_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
/* No need to check anything if the symbol table doesn't exist */
if(!stab_exists)
HGOTO_DONE(SUCCEED);
/* Read the stab */
if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, H5AC_ind_dxpl_id))
HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get symbol table info")
/* Iterate over the b-tree, checking validity of cached information */
if((ret_value = H5B_iterate(grp->oloc.file, H5AC_ind_dxpl_id, H5B_SNODE,
stab.btree_addr, H5G_verify_cached_stabs_test_cb, &udata)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "iteration operator failed");
/* Reset metadata tagging */
if(H5AC_tag(H5AC_ind_dxpl_id, prev_tag, NULL) < 0)
HDONE_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "unable to apply metadata tag")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G_verify_cached_stabs_test() */

View File

@ -7712,6 +7712,9 @@ main(void)
nerrors += test_modify(fapl, &cparam, &tparam);
} /* end for */
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;

View File

@ -2208,6 +2208,9 @@ main (int argc, char *argv[])
puts("Testing compound member ordering:");
nerrors += test_ooo_order(fname);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl_id) < 0 ? 1 : 0);
if (nerrors) {
printf("***** %u FAILURE%s! *****\n",
nerrors, 1==nerrors?"":"S");

View File

@ -8190,6 +8190,9 @@ main(void)
/* Close 2nd FAPL */
if(H5Pclose(fapl2) < 0) TEST_ERROR
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
printf("All dataset tests passed.\n");

View File

@ -2944,6 +2944,9 @@ main(void)
finish_tparam(&tparam);
} /* end for */
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All extensible array tests passed.");

View File

@ -3192,6 +3192,9 @@ main(void)
if(H5Pclose(fcpl_id) < 0)
TEST_ERROR
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl_id) < 0 ? 1 : 0);
if(nerrors)
goto error;

View File

@ -583,6 +583,9 @@ main(void)
H5Fclose(file);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors) goto error;
puts("All enum tests passed.");
h5_cleanup(FILENAME, fapl);

View File

@ -287,6 +287,9 @@ main (void)
if(H5Sclose(mem_space) < 0) TEST_ERROR;
if(H5Fclose(file) < 0) TEST_ERROR;
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors) {
printf("***** %d FAILURE%s! *****\n", nerrors, (1 == nerrors) ? "" : "S");
exit(1);

View File

@ -957,6 +957,10 @@ main (void)
nerrors += test_2(fapl);
nerrors += test_3(fapl);
nerrors += test_4(fapl);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors>0) goto error;
if (H5Fclose(file) < 0) goto error;

View File

@ -1648,6 +1648,9 @@ main(void)
nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(tparam.nelmts - 1), FALSE, "skipping to last element");
} /* end for */
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All fixed array tests passed.");

View File

@ -16691,6 +16691,9 @@ HDfprintf(stderr, "Uncomment tests!\n");
HDfprintf(stderr, "Uncomment tests!\n");
#endif /* QAK */
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All fractal heap tests passed.");

View File

@ -2177,6 +2177,9 @@ main(int argc, char *argv[])
/* Close 2nd FAPL */
H5Pclose(fapl2);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All fill value tests passed.");

View File

@ -391,6 +391,9 @@ int main(void)
nerrors += (test_filter_write(filename, fapl, FALSE) < 0 ? 1 : 0);
nerrors += (test_filter_read(filename, fapl) < 0 ? 1 : 0);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
h5_cleanup(FILENAME, fapl);
/* Make sure we can close the library */

View File

@ -2854,6 +2854,9 @@ main(void)
nerrors += test_fs_sect_extend(fapl);
nerrors += test_fs_sect_iterate(fapl);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All free-space tests passed.");

View File

@ -2934,6 +2934,9 @@ main(void)
/* Close file */
H5Fclose(file_id);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
puts("All getname tests passed.");

View File

@ -545,6 +545,10 @@ main (void)
nerrors += test_3(fapl);
nerrors += test_4(fapl);
nerrors += test_ooo_indices(fapl);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors) goto error;
puts("All global heap tests passed.");

View File

@ -27,6 +27,11 @@
#include "h5test.h"
#include "H5srcdir.h"
/* Necessary for h5_verify_cached_stabs() */
#define H5G_PACKAGE
#define H5G_TESTING
#include "H5Gpkg.h"
#ifdef H5_HAVE_WINSOCK_H
#include <process.h>
#include <direct.h>
@ -1147,3 +1152,92 @@ h5_make_local_copy(char *origfilename, char *local_copy_name)
return 0;
}
/*-------------------------------------------------------------------------
* Function: h5_verify_cached_stabs_cb
*
* Purpose: Callback function for h5_verify_cached_stabs.
*
* Return: Success: 0
*
* Failure: -1
*
* Programmer: Neil Fortner
* Tuesday, April 12, 2011
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
h5_verify_cached_stabs_cb(hid_t oid, const char UNUSED *name,
const H5O_info_t *oinfo, void UNUSED *udata)
{
if(oinfo->type == H5O_TYPE_GROUP)
return(H5G_verify_cached_stabs_test(oid));
else
return(0);
} /* end h5_verify_cached_stabs_cb() */
/*-------------------------------------------------------------------------
* Function: h5_verify_cached_stabs
*
* Purpose: Verify that all groups in every file in base_name have
* their symbol table information cached (if present, and if
* the parent group also uses a symbol table). Does not
* check that the root group's symbol table information is
* cached in the superblock.
*
* Return: Success: 0
*
* Failure: -1
*
* Programmer: Neil Fortner
* Tuesday, April 12, 2011
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
h5_verify_cached_stabs(const char *base_name[], hid_t fapl)
{
hid_t file = -1;
char filename[1024];
int i = 0;
while(base_name[i]) {
if (h5_fixname(base_name[i], fapl, filename, sizeof(filename)) == NULL)
continue;
H5E_BEGIN_TRY {
file = H5Fopen(filename, H5F_ACC_RDONLY, fapl);
} H5E_END_TRY
if(file < 0) {
i++;
continue;
} /* end if */
if(H5Ovisit(file, H5_INDEX_NAME, H5_ITER_NATIVE,
h5_verify_cached_stabs_cb, NULL) < 0)
goto error;
if(H5Fclose(file) < 0)
goto error;
file = -1;
i++;
} /* end while */
return 0;
error:
H5E_BEGIN_TRY {
H5Fclose(file);
} H5E_END_TRY;
return -1;
}

View File

@ -151,6 +151,7 @@ H5TEST_DLL void h5_show_hostname(void);
H5TEST_DLL h5_stat_size_t h5_get_file_size(const char *filename, hid_t fapl);
H5TEST_DLL int print_func(const char *format, ...);
H5TEST_DLL int h5_make_local_copy(char *origfilename, char *local_copy_name);
H5TEST_DLL herr_t h5_verify_cached_stabs(const char *base_name[], hid_t fapl);
/* Routines for operating on the list of tests (for the "all in one" tests) */
H5TEST_DLL void TestUsage(void);

View File

@ -665,6 +665,9 @@ main(int argc, char *argv[])
H5Pclose(fcpl);
H5Fclose(file);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors) {
printf("***** %d I-STORE TEST%s FAILED! *****\n",
nerrors, 1 == nerrors ? "" : "S");

View File

@ -199,6 +199,9 @@ main(void)
}
PASSED();
/* Verify symbol table messages are cached */
if(h5_verify_cached_stabs(FILENAME, fapl) < 0) TEST_ERROR
puts("All local heap tests passed.");
h5_cleanup(FILENAME, fapl);

View File

@ -14460,6 +14460,9 @@ main(void)
/* Close 2nd FAPL */
H5Pclose(fapl2);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
h5_cleanup(FILENAME, fapl);
/* Test that external links can be used after a library reset. MUST be

View File

@ -171,6 +171,9 @@ main(void)
nerrors += external_link_env(fapl, TRUE) < 0 ? 1 : 0;
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
h5_cleanup(FILENAME, fapl);
/* Results */

View File

@ -4383,6 +4383,9 @@ main(void)
nerrors += test_sharedclose(fapl);
nerrors += test_multisharedclose(fapl);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors) goto error;
puts("All mount tests passed.");

View File

@ -184,6 +184,9 @@ main(void)
}
PASSED();
/* Verify symbol table messages are cached */
if(h5_verify_cached_stabs(FILENAME, fapl) < 0) TEST_ERROR
/* All looks good */
puts("All modification time tests passed.");
h5_cleanup(FILENAME, fapl);

View File

@ -2892,6 +2892,10 @@ main(void)
if(H5Fclose(file) < 0)
goto error;
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;

View File

@ -8431,6 +8431,9 @@ main(void)
/* Reset file address checking info */
addr_reset();
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
/* Results */
if(nerrors) {
printf("***** %d OBJECT COPY TEST%s FAILED! *****\n",

View File

@ -795,6 +795,9 @@ main(void)
TEST_ERROR
} /* end for */
/* Verify symbol table messages are cached */
if(h5_verify_cached_stabs(FILENAME, fapl) < 0) TEST_ERROR
puts("All object header tests passed.");
h5_cleanup(FILENAME, fapl);
return(0);

View File

@ -185,6 +185,9 @@ int main( void )
/* Close 2nd FAPL */
if(H5Pclose(fapl2) < 0) TEST_ERROR
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
h5_cleanup(FILENAME, fapl);
HDremove(EXT_FILE_NAME1);

View File

@ -1198,6 +1198,9 @@ main(void)
/* Close 2nd FAPL */
H5Pclose(fapl2);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
/* Check for test errors */
if(nerrors)
goto error;

View File

@ -2549,6 +2549,9 @@ main(void)
/* Close 2nd FAPL */
H5Pclose(fapl2);
/* Verify symbol table messages are cached */
nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if (nerrors) {
printf("***** %d FAILURE%s! *****\n", nerrors, 1==nerrors?"":"S");
exit(1);