Files
hdf5/test/cache_tagging.c
Dana Robinson a00ad2b657 VFD SWMR: Normalization with develop (#765)
* Brings CMake updates from develop

* Brings reduction in pedantic casts from develop

* Purges UFAIL from the library (#637)

* Committing clang-format changes

* Purges UFAIL from the library

* H5HL_insert change requested in PR

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Removes gratuitous (double)x.yF casts (#632)

* Committing clang-format changes

* Removes gratuitous (double)x.yF casts

* Committing clang-format changes

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Committing clang-format changes

* Cleans up a const warning left over from previous constification (#633)

* Committing clang-format changes

* Adds consts to a few global variables

* Cleans up a const warning left over from previous constification

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Formatted source

* Bring over some VOL registration changes

* VOL cleanup

* H5VL_request_status_t substitutions

* H5F.c cleanup

* Minor API tweaks from develop

* Moves H5G package init/teardown to H5Gint.c

* H5G cleanup

* H5M cleanup

* H5SM cleanup

* H5T cleanup

* H5R cleanup

* H5Lpublic.h cleanup

* H5L cleanup

* H5O cleanup

* H5A, H5CS, and H5AC cleanup

* Moved H5A init/teardown code to H5Aint.c

* Moves H5D I/O functions to H5D.c

* H5D cleanup

* Misc minor cleanup

* H5P close cleanup

* H5Tpublic.h cleanup

* Fixes err_compat test

* H5PLpublic.h cleanup

* Updates H5Ppublic.h

* H5Fpublic.h updates

* H5A.c cleanup

* Brings over H5Aexists and related changes

* Brings CMake shell testing changes from develop

* Close callback changes

* H5R and H5Tcommit normalization

* err_compat test works now

* H5O tweaks

* Updates VOL registration code

* Brings over H5VL_create_object

* H5Tconv.c reformatting

* H5T.c tweaks

* Brings datatype and reference updates from develop

* Brings VOL plugin loading changes from develop

* Brings event sets from develop

* Brings async functions over

* Tools changes

* Brings over many tools changes from develop

* Brings VOL flags from develop

* Fixes h5dump double/float tests

* Updates h5repack tests

* Brings h5diff test changes from develop

* Last h5dump changes

* Brings test changes from develop

* Committing clang-format changes

* Tidied h5_testing()

* Brings chunk iteration code + misc from develop

* Updates vds test

* Enables external link parallel test

* Brings updated property lists from develop

* H5G changes from develop

* H5MF cleanup

* Brings vfd_swmr test back into CMake

* Updates threadsafe test

* Updates plist test

* Brings recent changes from develop

* Require a C++11 compiler to build the C++ wrappers (#693)

* Committing clang-format changes

* Requires a C++11 compiler to build the C++ wrappers

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Fix H5FD_mpio_Debug="rw" can report MPI_count instead of bytes (#699)

* Removes pre-C99 build and header cruft (#700)

* Assumes ANSI C headers exist
* Assumes stdbool.h, stdint.h, and inttypes.h are present
* Assumes the C++ compiler can handle stdint.h
* Removes all work-arounds for missing functionality, especially stdbool.h

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Updates release documents

* Brings parallel changes from develop

* Adds a VFD/parallel check program for the VFD SWMR shell test

* Updates MANIFEST

* Disable building VFD SWMR acceptance tests on CMake

* Removes err.h from genall5.c

* Partial cleanup of H5Cpkg.h

* Fixes printf specifiers in H5Cdbg.c

* Java and fortran cmake changes (#694)

* OESS-98 convert plugin option to FetchContent, add tests

* Fixes for pkcfg files because of plugin option

* OESS-98 fix tools test for plugins

* Keep doxygen comments under 100 chars long - format hint

* Whitespace

* HDFFV-11144 - Reclassify CMake messages

* HDFFV-11099/11100 added help text

* Reworked switch statement to compare string instead

* Fix typo

* Update CDash mode

* Correct name of threadsafe

* Correct option name

* Undo accidental commit

* Note LLVM 10 to 11 format default changes

* Update format plugin

* Undo clang-format version 11 changes

* One more correction

* Update supported platforms

* Revert whitespace changes

* Correct whitespace

* Changes from PR#3

* HDFFV-11213 added option to control gcc10 warnings diagnostics

* HDFFV-11212 Use the new references correctly in JNI utility and tests

* format source

* Fix typo

* Add new test file

* HDFFV-11212 - update test and remove unused arg

* Minor non-space formatting changes

* Use H5I_INVALID_ID instead of "-1"

* source formatting

* add missing testfile, update jni function

* Undo commit of debug code

* remove mislocated file

* Fix h5repack test for handling of fapls and id close

* Update h5diff test files usage text

* HDFFV-11212 add new ref tests for JNI export dataset

* src format update

* Remove blank line typo

* src format typo

* long double requires %Lg

* Another long double foramt specifer S.B. %Lg

* issue with t128bit test

* Windows issue with h5dump and type.

* Fix review issues

* refactor function nesting and fix error checks

* format fixes

* Remove untested functions and javadoc quiet comments

* Restore TRY block.

* Change string append errors to memory exception

* revert to H5_JNI_FATAL_ERROR - support functions need work

* Add assertion error for h5util functions

* remove duplicate function

* format fix

* Revert HD function error handling

* Update copyright comments

* GH #386 java folder copyright corrections

* Whitespace

* GH #359 implement and fix tools 1.6 API usage

* remove excessive comments

* Flip inits to correct ifdef section

* rework ifdef to be simpler

* format issue

* Reformat ifdef inits

* remove static attribute

* format compliance

* Update names

* Revert because logic relies on float not being int

* Changes noticed from creating merge of #412

* Double underscore change

* Correct compiler version variable used

* Remove header guard underscores

* Whitespace cleanup

* Split format source and commit changes on repo push

* remove pre-split setting

* Change windows TS to use older VS.

* correct window os name

* HDFFV-11212 JNI export util and Javadoc

* Suggested review changes

* Another change found

* Committing clang-format changes

* HDFFV-11113 long double in tools

* HDFFV-11113 add note

* Disable long double tests for now

* HDFFV-11228 remove arbitrary CMake warning groups.

* Make each flag a string

* Some Javadoc warning fixes

* Updated javadoc fixes

* # WARNING: head commit changed in the meantime

HDFFV-11229 Fix long double usage in tools and java

Changed h5dump and h5ls to just print 128-bit for long double type.
Added test and file for dataset and attributes with all three float
types.

* Committing clang-format changes

* HDFFV-11229 Add release note

* HDFFV-11229 windows testfile needed

* fix typo

* Remove non supported message text

* HDFFV-11229 - change ldouble test to check both native and general

* HDFFV-11229 add second file compare

* HDFFV-11229 fix reference file

* HDFFV-11229 autotools check two refs

* HDFFV-11229 revert back to removal of NATIVE_LDOUBLE in tools output

* Committing clang-format changes

* Update release note

* Update attribute type of ref file

* Change source of ninja for macs

* try port instead of brew

* Recommended is to use brew.

* Undo non long double changes

* remove unneeded file

* Fix perl and doxygen CMake code

* Add "option" command for clang options

* Rework CMake add_custom to use the BYPRODUCTS argument

* Add stamp files to BYPRODUCTS

* Only one copy of file exists

* Fix custom cmmand depends targets

* Fix fortran custom command DEPENDS

* Add LD_LIBRARY_PATH to tests

* Add custom target for DEPENDS

* Add h5detect conditionaly to generated target DEPENDS

* Correct DEPENDS targets

* Parallel builds need the mpi compiler for pkgconfig scripts.

* install only if MPI build

* Fortran target depends

* Remove incorrect source attribute

* doxygen adjustments

* doxygen build updates

* Correct version

* Correct function version - function has been merged to 1.12

* Correct version string for map functions

* Cleanup warnings for tools debug builds

* TRILAB-227 - fix indexing for h5diff selections

* Correct location of pos to index function call

* TRILAB-227 Enable test

* Quote subset args

* Use MATCHES because of AppleClang

* if blocks needed for build modes

* Update list of DT platforms

* VS2019 correctly displays float values

* revert VS2019 change

* Issue #669 remove version from pkgcfg filename

* remove version from h5cc script

* Java reference functions updated

enabled fortran in cmake gcc action yaml file
java reference test changed to correctly test refs
jni reference functions that create ids changed to use jni id logging

* Correct BYPRODUCTS argument

* Correct more genereated files BYPRODUCTS

* BYPRODUCTS must have unique locations

* Fix typo

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Removes alternative function enter/leave macro scheme (#678)

* Committing clang-format changes

* Converted BEGIN_FUNC, etc. macros to FUNC_ENTER

* Rips out the BEGIN_FUNC, etc. macros

* Removes 'end if', etc. comments from H5HL package

* Committing clang-format changes

* Fixes an H5EA iterate issue

* Fixes an issue in the H5FA iterator code

* Further cleanup in bin/trace after macro removal

* Iterator changes in H5EA and H5FA

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Split H5L.c internal code to H5Lint.c (#691)

* Committing clang-format changes

* Splits internal parts of H5L.c to H5Lint.c

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Clean up type size checks in configure.ac (#702)

* Committing clang-format changes

* C++ warning and build fixes (#707)

* Committing clang-format changes

* C++ build and warning updates

* Fixes all warnings on C++ (with gcc 9.3)
* Updates CMake and Autotools C++ builds

* Undo warning clobber

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Removes some DEC Alpha cruft from H5detect and H5private.h (#708)

* Cleans up hsize_t and haddr_t size guessing (#709)

* Cleans up definitions of haddr_t and hsize_t + cruft removal

* Formatted source

* Updates PGI C/C++ configurations (#715)

* Updates PGI C/C++ configurations

Tweaks some settings and configures pgc++ to use C++11

* Updated copyright information

* Adds an Intel C++ configuration file (#716)

* Adds an Intel C++ configuration file

* Committing clang-format changes

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Updates bin/trace script to correctly wrap H5TRACE macros near clang-format column limit (#719)

* Removes clang-format comments from H5O.c call

* Fixes bin/trace to correctly wrap lines near the clang-format limit

* Removed unused variable from bin/trace

* Fixes issue with ccmake that prevents building Fortran (#723)

ccmake runs iteratively, and the check_fortran_source_runs
macros were clobbering a single output file that did not
get updated on further configure iterations

* Updates CMake size_t and ssize_t checks for MacOS

* Moved a little boilerplate over from develop

* Fixes some warnings

* Committing clang-format changes

* Moves gcc warning macros from H5public.h to H5private.h (#724)

* Moves gcc warning suppression macros out of H5public.h

* Update RELEASE.txt

* Formatted source

* Adds __STDC_FORMAT_MACROS before including inttypes.h w/ C++ (#726)

* Adds __STDC_FORMAT_MACROS before including inttypes.h w/ C++

Allows C++ library to be built on older versions of gcc.

* Committing clang-format changes

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>

* Moves H5PacketTable default ctor inside source file (#731)

* Brings (most) H5Xdevelop.h headers from develop

* Trivial H5F and H5O changes during normalization

* Renames buf_ptr back to page_buf to better align with develop

* Removed H5HGtrap.c

* Brings changes from develop

* Normalization (mainly cache) with develop

* Fix Direct VFD Testing in CMake (#742)

* Fixes C++ warnings when passing hsize_t values to printf in test code (#745)

* Organize and align compiler flags (#741)

* OESS-98 convert plugin option to FetchContent, add tests

* Fixes for pkcfg files because of plugin option

* OESS-98 fix tools test for plugins

* Keep doxygen comments under 100 chars long - format hint

* Whitespace

* HDFFV-11144 - Reclassify CMake messages

* HDFFV-11099/11100 added help text

* Reworked switch statement to compare string instead

* Fix typo

* Update CDash mode

* Correct name of threadsafe

* Correct option name

* Undo accidental commit

* Note LLVM 10 to 11 format default changes

* Update format plugin

* Undo clang-format version 11 changes

* One more correction

* Update supported platforms

* Revert whitespace changes

* Correct whitespace

* Changes from PR#3

* HDFFV-11213 added option to control gcc10 warnings diagnostics

* HDFFV-11212 Use the new references correctly in JNI utility and tests

* format source

* Fix typo

* Add new test file

* HDFFV-11212 - update test and remove unused arg

* Minor non-space formatting changes

* Use H5I_INVALID_ID instead of "-1"

* source formatting

* add missing testfile, update jni function

* Undo commit of debug code

* remove mislocated file

* Fix h5repack test for handling of fapls and id close

* Update h5diff test files usage text

* HDFFV-11212 add new ref tests for JNI export dataset

* src format update

* Remove blank line typo

* src format typo

* long double requires %Lg

* Another long double foramt specifer S.B. %Lg

* issue with t128bit test

* Windows issue with h5dump and type.

* Fix review issues

* refactor function nesting and fix error checks

* format fixes

* Remove untested functions and javadoc quiet comments

* Restore TRY block.

* Change string append errors to memory exception

* revert to H5_JNI_FATAL_ERROR - support functions need work

* Add assertion error for h5util functions

* remove duplicate function

* format fix

* Revert HD function error handling

* Update copyright comments

* GH #386 java folder copyright corrections

* Whitespace

* GH #359 implement and fix tools 1.6 API usage

* remove excessive comments

* Flip inits to correct ifdef section

* rework ifdef to be simpler

* format issue

* Reformat ifdef inits

* remove static attribute

* format compliance

* Update names

* Revert because logic relies on float not being int

* Changes noticed from creating merge of #412

* Double underscore change

* Correct compiler version variable used

* Remove header guard underscores

* Whitespace cleanup

* Split format source and commit changes on repo push

* remove pre-split setting

* Change windows TS to use older VS.

* correct window os name

* HDFFV-11212 JNI export util and Javadoc

* Suggested review changes

* Another change found

* Committing clang-format changes

* HDFFV-11113 long double in tools

* HDFFV-11113 add note

* Disable long double tests for now

* HDFFV-11228 remove arbitrary CMake warning groups.

* Make each flag a string

* Some Javadoc warning fixes

* Updated javadoc fixes

* # WARNING: head commit changed in the meantime

HDFFV-11229 Fix long double usage in tools and java

Changed h5dump and h5ls to just print 128-bit for long double type.
Added test and file for dataset and attributes with all three float
types.

* Committing clang-format changes

* HDFFV-11229 Add release note

* HDFFV-11229 windows testfile needed

* fix typo

* Remove non supported message text

* HDFFV-11229 - change ldouble test to check both native and general

* HDFFV-11229 add second file compare

* HDFFV-11229 fix reference file

* HDFFV-11229 autotools check two refs

* HDFFV-11229 revert back to removal of NATIVE_LDOUBLE in tools output

* Committing clang-format changes

* Update release note

* Update attribute type of ref file

* Change source of ninja for macs

* try port instead of brew

* Recommended is to use brew.

* Undo non long double changes

* remove unneeded file

* Fix perl and doxygen CMake code

* Add "option" command for clang options

* Rework CMake add_custom to use the BYPRODUCTS argument

* Add stamp files to BYPRODUCTS

* Only one copy of file exists

* Fix custom cmmand depends targets

* Fix fortran custom command DEPENDS

* Add LD_LIBRARY_PATH to tests

* Add custom target for DEPENDS

* Add h5detect conditionaly to generated target DEPENDS

* Correct DEPENDS targets

* Parallel builds need the mpi compiler for pkgconfig scripts.

* install only if MPI build

* Fortran target depends

* Remove incorrect source attribute

* doxygen adjustments

* doxygen build updates

* Correct version

* Correct function version - function has been merged to 1.12

* Correct version string for map functions

* Cleanup warnings for tools debug builds

* TRILAB-227 - fix indexing for h5diff selections

* Correct location of pos to index function call

* TRILAB-227 Enable test

* Quote subset args

* Use MATCHES because of AppleClang

* if blocks needed for build modes

* Update list of DT platforms

* VS2019 correctly displays float values

* revert VS2019 change

* Issue #669 remove version from pkgcfg filename

* remove version from h5cc script

* Java reference functions updated

enabled fortran in cmake gcc action yaml file
java reference test changed to correctly test refs
jni reference functions that create ids changed to use jni id logging

* Correct BYPRODUCTS argument

* Correct more genereated files BYPRODUCTS

* BYPRODUCTS must have unique locations

* Fix typo

* Fix fortran configure checks

* Rework H5_PAC_C_MAX_REAL_PRECISION setting logic

* Add note about fortran configure change

* Adds a quick for for some egregious chunk_info badness (#722)

* Fixes issue with ccmake that prevents building Fortran (#723)

ccmake runs iteratively, and the check_fortran_source_runs
macros were clobbering a single output file that did not
get updated on further configure iterations

* Fix conflicts with merge

* Move MAX_PRECISION back to HDF5UseFortran.cmake

* Use STREQUAL to test macro argument

* Move C language test to ConfigureChecks from HDF5UseFortran

* MAX_PRECISION defines must be defined

* Organize flags and align autotools and cmake

* Fix comment in no-error-general warnings files.

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dana Robinson <43805+derobins@users.noreply.github.com>

* Committing clang-format changes

* Cache code tidying

* Constification of cache code

* Renaming of static calls in cache

* Fixes H5C mess made by git during merge

* Committing clang-format changes

* Fixes a printf format issue w/ parallel

* Revert "Committing clang-format changes"

This reverts commit 1265fe87fe.

* Turns off clang formatter in H5C while syncing with develop

* Adds a lot of HD prefixes and cleans up err.h usage

* Committing clang-format changes

* Brings cache skip list optimization from develop

* Brings recent changes from develop

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2021-06-17 14:19:24 -07:00

4685 lines
138 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Programmer: Mike McGreevy
* January 25, 2010
*
* This file contains tests for metadata tagging.
*/
#define H5F_FRIEND /*suppress error about including H5Fpkg */
#define H5F_TESTING
#include "H5Fpkg.h"
#include "testhdf5.h"
#include "cache_common.h"
#include "H5CXprivate.h" /* API Contexts */
#include "H5HLprivate.h"
#include "H5VLnative_private.h" /* Native VOL connector */
/* ============ */
/* Test Defines */
/* ============ */
#define FILENAME "tagging_test.h5"
#define FILENAME2 "tagging_ext_test.h5"
#define GROUPNAME "Group"
#define GROUPNAMEPATH "/Group"
#define GROUPNAMECOPY "GroupCopy"
#define ATTRNAME "Attribute 1"
#define ATTRNAME3 "Attribute 3"
#define DATASETNAME "Dataset"
#define DATASETNAME2 "Dataset2"
#define LINKNAME "Link"
#define RANK 2
#define DIMS 32
#define MULTIGROUPS 10
#define TEST_DEFAULT 0
#define TEST_SHMESG 1
#define NUM_TEST_TYPES 2
/* ===================== */
/* Function Declarations */
/* ===================== */
/* Helper Functions */
#ifndef NDEBUG
static int dump_cache(hid_t fid);
#endif /* NDEBUG */ /* end debugging functions */
static int verify_no_unknown_tags(hid_t fid);
static int mark_all_entries_investigated(hid_t fid);
static int reset_all_entries_investigated(hid_t fid);
static int verify_tag(hid_t fid, int id, haddr_t tag);
static int get_object_header_tag(hid_t loc_id, haddr_t *tag);
static int get_sbe_tag(hid_t fid, haddr_t *tag);
/* Tests */
static unsigned check_file_creation_tags(hid_t fcpl_id, int type);
static unsigned check_file_open_tags(hid_t fcpl, int type);
static unsigned check_attribute_creation_tags(hid_t fcpl, int type);
static unsigned check_attribute_open_tags(hid_t fcpl, int type);
static unsigned check_attribute_write_tags(hid_t fcpl, int type);
static unsigned check_attribute_delete_tags(hid_t fcpl, int type);
static unsigned check_attribute_rename_tags(hid_t fcpl, int type);
static unsigned check_dataset_creation_tags(hid_t fcpl, int type);
static unsigned check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type);
static unsigned check_link_removal_tags(hid_t fcpl, int type);
static unsigned check_group_creation_tags(void);
static unsigned check_multi_group_creation_tags(void);
static unsigned check_group_open_tags(void);
static unsigned check_dataset_open_tags(void);
static unsigned check_dataset_write_tags(void);
static unsigned check_dataset_read_tags(void);
static unsigned check_dataset_size_retrieval(void);
static unsigned check_dataset_extend_tags(void);
static unsigned check_object_info_tags(void);
static unsigned check_object_copy_tags(void);
static unsigned check_link_getname_tags(void);
static unsigned check_external_link_creation_tags(void);
static unsigned check_external_link_open_tags(void);
static unsigned check_dense_attribute_tags(void);
static unsigned check_link_iteration_tags(void);
static unsigned check_invalid_tag_application(void);
/* ================ */
/* Helper Functions */
/* ================ */
#ifndef NDEBUG
/*-------------------------------------------------------------------------
* Function: dump_cache()
*
* Purpose: DEBUG CODE (for when verbose is set).
*
* Prints cache index to screen, including address of entries,
* tag values of entries, and entry types.
*
* Return: void
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static int
dump_cache(hid_t fid)
{
H5F_t *f; /* File Pointer */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
/* Dump the cache */
if (H5AC_dump_cache(f) < 0)
TEST_ERROR;
return 0;
error:
return -1;
} /* dump_cache */
#endif /* NDEBUG */ /* end debugging functions */
/*-------------------------------------------------------------------------
* Function: verify_no_unknown_tags()
*
* Purpose: Verifies that all tags in the provided cache have the
* 'dirtied' flag set. Other verification functions in this
* test file set this flag after checking them, so
* this is handy to verify that tests have checked all entries
* in the cache.
*
* Return: 0 on Success, -1 on Failure
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static int
verify_no_unknown_tags(hid_t fid)
{
H5F_t *f; /* File Pointer */
H5C_t *cache_ptr; /* Cache Pointer */
int i; /* Iterator */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
cache_ptr = f->shared->cache;
for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
H5C_cache_entry_t *entry_ptr; /* entry pointer */
entry_ptr = cache_ptr->index[i];
while (entry_ptr != NULL) {
if (!entry_ptr->dirtied)
TEST_ERROR;
entry_ptr = entry_ptr->ht_next;
} /* end if */
} /* end for */
return 0;
error:
return -1;
} /* verify_no_unknown_tags */
/*-------------------------------------------------------------------------
* Function: mark_all_entries_investigated()
*
* Purpose: Marks all entries in the cache with the 'dirtied' flag,
* which is a convention in this test file that indicates that
* a tag has been checked and is valid. This may come in handy
* for tests that have a lot of setup that has been checked
* for correctness elsewhere, so should save time in not having
* to check the same sort of tag application in many places.
*
* Return: 0 on Success, -1 on Failure
*
* Programmer: Mike McGreevy
* February 3, 2010
*
*-------------------------------------------------------------------------
*/
static int
mark_all_entries_investigated(hid_t fid)
{
H5F_t *f; /* File Pointer */
H5C_t *cache_ptr; /* Cache Pointer */
int i; /* Iterator */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
cache_ptr = f->shared->cache;
for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
H5C_cache_entry_t *entry_ptr; /* entry pointer */
entry_ptr = cache_ptr->index[i];
while (entry_ptr != NULL) {
if (!entry_ptr->dirtied)
entry_ptr->dirtied = TRUE;
entry_ptr = entry_ptr->ht_next;
} /* end if */
} /* end for */
return 0;
error:
return -1;
} /* mark_all_entries_investigated */
/*-------------------------------------------------------------------------
* Function: reset_all_entries_investigated()
*
* Purpose: Resets all entries in the cache with the 'dirtied' flag,
* which is a convention in this test file that indicates that
* a tag has been checked and is valid. This resets the cache back
* to the same state as just after a flush call.
*
* Return: 0 on Success, -1 on Failure
*
* Programmer: Quincey Koziol
* July 13, 2016
*
*-------------------------------------------------------------------------
*/
static int
reset_all_entries_investigated(hid_t fid)
{
H5F_t *f; /* File Pointer */
H5C_t *cache_ptr; /* Cache Pointer */
int i; /* Iterator */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
cache_ptr = f->shared->cache;
for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
H5C_cache_entry_t *entry_ptr; /* entry pointer */
entry_ptr = cache_ptr->index[i];
while (entry_ptr != NULL) {
if (entry_ptr->dirtied)
entry_ptr->dirtied = FALSE;
entry_ptr = entry_ptr->ht_next;
} /* end if */
} /* end for */
return 0;
error:
return -1;
} /* reset_all_entries_investigated */
/*-------------------------------------------------------------------------
* Function: verify_tag()
*
* Purpose: Asserts that there is an entry in the specified cache with
* the provided entry id and provided tag. The function will
* fail if this is not the case. If found, this function will
* set the entry's flush_marker flag, so future verification
* attempts can skip over this entry, knowing it has already been
* checked.
*
* Return: 0 on Success, -1 on Failure
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static int
verify_tag(hid_t fid, int id, haddr_t tag)
{
H5F_t *f; /* File Pointer */
H5C_t *cache_ptr; /* Cache Pointer */
int i; /* Iterator */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
cache_ptr = f->shared->cache;
for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
H5C_cache_entry_t *entry_ptr; /* entry pointer */
entry_ptr = cache_ptr->index[i];
while (entry_ptr != NULL) {
if (entry_ptr->type->id == id && !entry_ptr->dirtied) {
if (entry_ptr->tag_info->tag != tag)
TEST_ERROR;
/* Mark the entry/tag pair as found */
entry_ptr->dirtied = TRUE;
/* leave now that we've found the entry */
goto done;
} /* end if */
entry_ptr = entry_ptr->ht_next;
} /* end if */
} /* end for */
/* Didn't find the tagged entry, throw an error */
TEST_ERROR;
done:
return 0;
error:
return -1;
} /* verify_tag */
static int
evict_entries(hid_t fid)
{
H5F_t *f; /* File Pointer */
/* Get Internal File / Cache Pointers */
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
/* Mark all entries investigated */
mark_all_entries_investigated(fid);
/* setup the skip list prior to calling H5C_flush_cache() */
if (H5C_set_slist_enabled(f->shared->cache, TRUE, FALSE) < 0)
TEST_ERROR;
/* Evict all we can from the cache to examine full tag creation tree */
/* This function will likely return failure since the root group
* is still protected. Thus, don't check its return value.
*/
H5C_flush_cache(f, H5C__FLUSH_INVALIDATE_FLAG);
/* shutdown the slist -- allow it to be non-empty */
if (H5C_set_slist_enabled(f->shared->cache, FALSE, TRUE) < 0)
TEST_ERROR;
return 0;
error:
return -1;
} /* evict entries */
/*-------------------------------------------------------------------------
* Function: get_object_header_tag()
*
* Purpose: This function retrieves the tag associated with an object.
*
* Return: 0 on Success; 1 on Failure
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static int
get_object_header_tag(hid_t loc_id, haddr_t *tag)
{
H5O_info2_t oinfo; /* Object info */
/* Retrieve the info for the object */
if (H5Oget_info3(loc_id, &oinfo, H5O_INFO_BASIC) < 0)
TEST_ERROR;
/* Set the tag to return */
if (H5VLnative_token_to_addr(loc_id, oinfo.token, tag) < 0)
TEST_ERROR;
return 0;
error:
return -1;
} /* get_object_header_tag */
/*-------------------------------------------------------------------------
* Function: get_sbe_tag()
*
* Purpose: This function retrieves the tag associated with the superblock
* extension (the object header address stored in the superblock)
*
* Return: 0 on Success; 1 on Failure
*
* Programmer: Quincey Koziol
* July 10, 2016
*
*-------------------------------------------------------------------------
*/
static int
get_sbe_tag(hid_t fid, haddr_t *tag)
{
/* Retrieve the superblock extension's object header address for the file */
if (H5F__get_sbe_addr_test(fid, tag) < 0)
TEST_ERROR;
return 0;
error:
return -1;
} /* get_sbe_tag */
/* ============== */
/* Test Functions */
/* ============== */
/*-------------------------------------------------------------------------
* Function: check_file_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during file creation.
*
* Return: 0 on Success; 1 on Failure
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_file_creation_tags(hid_t fcpl_id, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose test outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t sbe_tag = 0;
/* Testing Macro */
TESTING("tag application during file creation");
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
#ifndef NDEBUG
/* if verbose, print cache index to screen before verification . */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify there is a superblock entry with superblock tag */
if (verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* determine tag value of superblock extension object header */
if (get_sbe_tag(fid, &sbe_tag) < 0)
TEST_ERROR;
/* verify object header belonging to superblock extension */
if (verify_tag(fid, H5AC_OHDR_ID, sbe_tag) < 0)
TEST_ERROR;
/* verify sohm master table with sohm tag */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify object header chunk belonging to superblock extension */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, sbe_tag) < 0)
TEST_ERROR;
} /* end if */
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* verify object header belonging to superblock extension */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
/* verify local heap prefix belonging to root group */
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
/* verify b-tree node belonging to root group */
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* verify no other cache entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* Close the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
return 1;
} /* check_file_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_file_open_tags
*
* Purpose: This function verifies the correct application of tags
* during file open.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* January 25, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_file_open_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag; /* Root Group Tag */
haddr_t sbe_tag; /* Sblock Extension Tag */
/* Testing Macro */
TESTING("tag application during file open");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Retrieve various tags */
if (type == TEST_SHMESG) {
/* determine tag value of superblock extension object header */
if (get_sbe_tag(fid, &sbe_tag) < 0)
TEST_ERROR;
} /* end if */
/* Close the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* =================== */
/* TEST: Open The File */
/* =================== */
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen before verification . */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify there is a superblock entry with superblock tag. */
if (verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0)
TEST_ERROR;
/* Verify test-type-dependent tags */
if (type == TEST_DEFAULT) {
/* verify there is an object header belonging to the root group. */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
}
else if (type == TEST_SHMESG) {
/* verify there is a superblock extension object header. */
if (verify_tag(fid, H5AC_OHDR_ID, sbe_tag) < 0)
TEST_ERROR;
/* verify sohm master table with sohm tag */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify object header chunk belonging to superblock extension */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, sbe_tag) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* ========== */
/* Close file */
/* ========== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_file_open_tags */
/*-------------------------------------------------------------------------
* Function: check_group_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during group creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* January 27, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_group_creation_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = HADDR_UNDEF; /* Root Group Tag */
haddr_t g_tag; /* Group Tag */
/* Testing Macro */
TESTING("tag application during group creation");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ==================== */
/* TEST: Create a Group */
/* ==================== */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Verify new group's tagged metadata */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0)
TEST_ERROR;
/* verify no other cache entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_group_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_multi_group_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during multiple group creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 2, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_multi_group_creation_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
char gname[16]; /* group name buffer */
int i = 0; /* iterator */
hid_t fapl = -1; /* File access prop list */
haddr_t g_tag = 0; /* Group tag value */
haddr_t root_tag = 0; /* Root group tag value */
/* Testing Macro */
TESTING("tag application during multiple group creation");
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Set latest version of library */
if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
TEST_ERROR;
/* =========== */
/* Create File */
/* =========== */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Clear Metadata Tags (don't care about them for this test) */
mark_all_entries_investigated(fid);
/* ============= */
/* Create Groups */
/* ============= */
for (i = 0; i < MULTIGROUPS; i++) {
HDsprintf(gname, "%d", i);
if ((gid = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
} /* end for */
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify there is an object header for each group */
for (i = 0; i < MULTIGROUPS; i++) {
/* Re-open the group */
HDsprintf(gname, "%d", i);
if ((gid = H5Gopen2(fid, gname, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Verify object header for root group */
/* ('dirtied' flag on entry gets cleared with each open operation) */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
/* Retrieve the object address for the group */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Verify object header for group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* Close the group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
} /* end for */
/* Verify free space header and section info */
if (verify_tag(fid, H5AC_FSPACE_SINFO_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, root_tag) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to root group */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, root_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to root group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, root_tag) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to root group */
if (verify_tag(fid, H5AC_BT2_HDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, root_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Pclose(fapl) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_multi_group_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_link_iteration_tags
*
* Purpose: This function verifies the correct application of tags
* during iteration over links in a group.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 2, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_link_iteration_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t sid = -1; /* Group Identifier */
hid_t did = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
int i = 0; /* iterator */
haddr_t root_tag = 0; /* Root Group Tag Value */
char dsetname[500]; /* Name of dataset */
H5G_info_t ginfo; /* Group Info Struct */
hid_t fapl = -1; /* File access prop list */
hid_t root_group = -1; /* Root Group Identifier */
/* Testing Macro */
TESTING("tag application during iteration over links in a group");
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* =========== */
/* Create File */
/* =========== */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* Get root group tag */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create dataspace */
if ((sid = H5Screate(H5S_SCALAR)) < 0)
TEST_ERROR;
/* Create many datasets in root group */
for (i = 0; i < 500; i++) {
HDsprintf(dsetname, "Dset %d", i);
if ((did = H5Dcreate2(fid, dsetname, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) <
0)
TEST_ERROR;
if (H5Dclose(did) < 0)
TEST_ERROR;
}
/* Close and Reopen the file (to clear cache) */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* clear remaining metadata tags */
mark_all_entries_investigated(fid);
/* ================================ */
/* Iterate over links in root group */
/* ================================ */
/* Open root group */
if ((root_group = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Get root group info (will iterate over all links in group) */
if (H5Gget_info(root_group, &ginfo) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
/* Verify 112 symbol table nodes belonging to the root group */
for (i = 0; i < 112; i++)
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
/* Verify 9 b-tree nodes belonging to the root group */
for (i = 0; i < 9; i++)
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Sclose(sid) < 0)
TEST_ERROR;
if (H5Gclose(root_group) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_link_iteration_tags */
/*-------------------------------------------------------------------------
* Function: check_dense_attribute_tags
*
* Purpose: This function verifies the correct application of tags
* during various dense attribute manipulations.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 2, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dense_attribute_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t aid = -1; /* File Identifier */
hid_t sid = -1; /* Group Identifier */
hid_t did = -1; /* Group Identifier */
hid_t dcpl = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
int i = 0; /* iterator */
hid_t fapl = -1; /* File access property list */
haddr_t d_tag = 0; /* Dataset tag value */
haddr_t root_tag = 0; /* Root group tag value */
char attrname[500]; /* Name of attribute */
/* Testing Macro */
TESTING("tag application during dense attribute manipulation");
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
TEST_ERROR;
/* Create Dcpl */
if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
TEST_ERROR;
/* =========== */
/* Create File */
/* =========== */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create dataspace */
if ((sid = H5Screate(H5S_SCALAR)) < 0)
TEST_ERROR;
/* Create dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* get dataset object header */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* Clear Metadata Tags (don't care about them for this test */
mark_all_entries_investigated(fid);
/* ================================================ */
/* Create Many attributes, triggering dense storage */
/* ================================================ */
for (i = 0; i < 50; i++) {
HDsprintf(attrname, "attr %d", i);
if ((aid = H5Acreate2(did, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Awrite(aid, H5T_NATIVE_UINT, &i) < 0)
TEST_ERROR;
if (H5Aclose(aid) < 0)
TEST_ERROR;
} /* end for */
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify free space header and section info */
if (verify_tag(fid, H5AC_FSPACE_SINFO_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify object header belonging to dataset */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to dataset */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to root group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to dataset */
if (verify_tag(fid, H5AC_BT2_HDR_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_INT_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ======================= */
/* Reopen file and dataset */
/* ======================= */
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Clear Metadata Tags (don't care about them for this test */
mark_all_entries_investigated(fid);
/* ======================= */
/* Open attribute by index */
/* ======================= */
if ((aid = H5Aopen_by_idx(did, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT)) <
0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify object header belonging to dataset */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to dataset */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to root group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FHEAP_IBLOCK_ID, d_tag) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to dataset */
if (verify_tag(fid, H5AC_BT2_HDR_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_INT_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Aclose(aid) < 0)
TEST_ERROR;
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_dense_attribute_tags */
/*-------------------------------------------------------------------------
* Function: check_group_open_tags
*
* Purpose: This function verifies the correct application of tags
* during group open.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* January 27, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_group_open_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file output */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = HADDR_UNDEF;
haddr_t g_tag;
/* Testing Macro */
TESTING("tag application during group open");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close Group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ================ */
/* TEST: Open Group */
/* ================ */
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Verify opened group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_group_open_tags */
/*-------------------------------------------------------------------------
* Function: check_attribute_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during attribute creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_attribute_creation_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t aid = -1; /* Attribute Identifier */
hid_t gid = -1; /* Group Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0; /* Root group tag */
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
/* Testing Macro */
TESTING("tag application during attribute creation");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file and group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================= */
/* Create Attribute on Group */
/* ========================= */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
if ((aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify object header belonging to group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify (another) object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
/* verify shared message index tagged with sohm */
if (verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to group */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* Verify free space header and free space section */
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to group */
if (verify_tag(fid, H5AC_BT2_HDR_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Aclose(aid) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_attribute_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_attribute_open_tags
*
* Purpose: This function verifies the correct application of tags
* during attribute open.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_attribute_open_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t aid = -1; /* Attribute Identifier */
hid_t gid = -1; /* Group Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
/* Testing Macro */
TESTING("tag application during attribute open");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Create attribute dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create attribute on group */
if ((aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Close attribute */
if (H5Aclose(aid) < 0)
TEST_ERROR;
/* Close and Reopen the file and group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================= */
/* Open Attribute of Group */
/* ========================= */
if ((aid = H5Aopen(gid, ATTRNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify object header belonging to group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify (another) object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to group */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to group */
if (verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Aclose(aid) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_attribute_open_tags */
/*-------------------------------------------------------------------------
* Function: check_attribute_rename_tags
*
* Purpose: This function verifies the correct application of tags
* during attribute renaming.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 3, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_attribute_rename_tags(hid_t fcpl, int type)
{
/* Variable declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
hid_t aid = -1; /* Attribute Identifier */
hid_t sid = -1; /* Dataset Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
int * data = NULL; /* data buffer */
int i, j, k = 0; /* iterators */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
hbool_t persistent_fsms = FALSE;
/* Testing Macro */
TESTING("tag application during attribute renaming");
/* ===== */
/* Setup */
/* ===== */
/* check to see if the FCPL specified persistent free space managers */
if (H5Pget_file_space_strategy(fcpl, NULL, &persistent_fsms, NULL) < 0)
TEST_ERROR;
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Set up attribute dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create attribute */
if ((aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to attribute */
if (H5Awrite(aid, H5T_NATIVE_INT, data) < 0)
TEST_ERROR;
/* Close Attribute */
if (H5Aclose(aid) < 0)
TEST_ERROR;
/* Close and Reopen the file and group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================= */
/* Rename Attribute of Group */
/* ========================= */
if (H5Arename_by_name(fid, GROUPNAME, ATTRNAME, ATTRNAME3, H5P_DEFAULT) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* verify object header belonging to group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify (another) object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to group */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0)
TEST_ERROR;
/* verify shared header message stored as a list */
if (verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/*
* one freespace header tag for H5FD_MEM_DRAW manager,
* one freespace header tag for H5FD_MEM_SUPER manager
*/
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to group */
if (verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_attribute_rename_tags */
/*-------------------------------------------------------------------------
* Function: check_attribute_delete_tags
*
* Purpose: This function verifies the correct application of tags
* during attribute deletion.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 3, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_attribute_delete_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
hid_t aid = -1; /* Attribute Identifier */
hid_t sid = -1; /* Dataset Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
int * data = NULL; /* data buffer */
int i, j, k = 0; /* iterators */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
hbool_t persistent_fsms = FALSE;
/* Testing Macro */
TESTING("tag application during attribute delete");
/* ===== */
/* Setup */
/* ===== */
/* check to see if the FCPL specified persistent free space managers */
if (H5Pget_file_space_strategy(fcpl, NULL, &persistent_fsms, NULL) < 0)
TEST_ERROR;
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Set up attribute dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create attribute */
if ((aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to attribute */
if ((H5Awrite(aid, H5T_NATIVE_INT, data)) < 0)
TEST_ERROR;
/* Close Attribute */
if (H5Aclose(aid) < 0)
TEST_ERROR;
/* Close and Reopen the file and group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================= */
/* Delete Attribute of Group */
/* ========================= */
if ((H5Adelete(gid, ATTRNAME)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify object header belonging to group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/*
* 2 calls to verify_tag() for verifying free space:
* one freespace header tag for free-space header raw data
* one freespace header tag for free-space section info raw data
* one freespace header tag for free-space header metadata
*/
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__FREESPACE_TAG) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0)
TEST_ERROR;
#if 0
/* If the free space managers are persistent, the
* H5MF_tidy_self_referential_fsm_hack() must have been run.
* Since this function floats all self referential free space
* managers, the H5FD_MEM_SUPER FSM will not be in the metadata
* cache.
*/
if ( ( ! persistent_fsms ) &&
( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) )
TEST_ERROR;
#endif
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_attribute_delete_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 10, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_creation_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
/* Testing Macro */
TESTING("tag application during dataset creation");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ============================ */
/* Create Dataset in Root Group */
/* ============================ */
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Get dataset's object header address */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* Verify object header for group */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* Verify dataset's tagged metadata */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* Verify shared object header message tags */
if (verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_dataset_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_creation_earlyalloc_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 1, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i = 0; /* iterator */
/* Testing Macro */
TESTING("tag application during dataset creation with early allocation");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ============================ */
/* Create Dataset in Root Group */
/* ============================ */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set early allocation time */
if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
if ((did = H5Dcreate2(fid, DATASETNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Get dataset's object header address */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* Verify object header for group */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* Verify dataset's tagged metadata */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* Verify shared object header message tags */
if (verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
} /* end if */
/* Verify 19 b-tree nodes belonging to dataset */
for (i = 0; i < 19; i++)
if (verify_tag(fid, H5AC_BT_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_dataset_creation_earlyalloc_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_open_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset open.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 10, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_open_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
/* Testing Macro */
TESTING("tag application during dataset open");
/* ========= */
/* Open File */
/* ========= */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* Close Dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================== */
/* Open Dataset in Root Group */
/* ========================== */
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Verify dataset's object header */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_dataset_open_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_write_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset write.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 10, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_write_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
/* Testing Macro */
TESTING("tag application during dataset write");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ============================== */
/* Write to Dataset in Root Group */
/* ============================== */
/* fill out data buffer */
for (i = 0; i < DIMS; i++) {
for (j = 0; j < DIMS; j++) {
data[(DIMS * i) + j] = k++;
} /* end for */
} /* end for */
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify 10 b-tree nodes belonging to dataset */
for (i = 0; i < 10; i++)
if (verify_tag(fid, H5AC_BT_ID, d_tag) < 0)
TEST_ERROR;
/* Verify object header for dataset */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_dataset_write_tags */
/*-------------------------------------------------------------------------
* Function: check_attribute_write_tags
*
* Purpose: This function verifies the correct application of tags
* during attribute write.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 3, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_attribute_write_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
hid_t aid = -1; /* Attribute Identifier */
hid_t sid = -1; /* Dataset Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
int * data = NULL; /* data buffer */
int i, j, k = 0; /* iterators */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
/* Testing Macro */
TESTING("tag application during attribute write");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file with provided fcpl_t */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Create attribute dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create attribute on group */
if ((aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Close and Reopen the file, group, and attribute */
if (H5Aclose(aid) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((aid = H5Aopen(gid, ATTRNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Write to Attribute in Group */
/* =========================== */
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write attribute */
if ((H5Awrite(aid, H5T_NATIVE_INT, data)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify object header of group */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify (another) object header chunk belonging to group */
if (verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0)
TEST_ERROR;
/* verify shared header message master table and list */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify fractal heap header belonging to group */
if (verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0)
TEST_ERROR;
/* verify fractal heap direct block belonging to group */
if (verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0)
TEST_ERROR;
/* Verify SOHM list */
if (verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
/* verify btree header and leaf node belonging to group */
if (verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Aclose(aid) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_attribute_write_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_read_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset read.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 10, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_read_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
/* Testing Macro */
TESTING("tag application during dataset read");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ===================================== */
/* TEST: Read from Dataset in Root Group */
/* ===================================== */
if ((H5Dread(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify 19 b-tree nodes belonging to dataset */
for (i = 0; i < 19; i++)
if (verify_tag(fid, H5AC_BT_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_dataset_read_tags */
/*-------------------------------------------------------------------------
* Function: check_dataset_size_retrieval
*
* Purpose: This function verifies the correct application of tags
* during dataset size retrieval.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_size_retrieval(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
hsize_t dsize = 0;
/* Testing Macro */
TESTING("tag application during dataset storage size retrieval");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ========================================= */
/* Get storage size of dataset in Root Group */
/* ========================================= */
if ((dsize = H5Dget_storage_size(did)) == 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify 19 b-tree nodes belonging to dataset */
for (i = 0; i < 19; i++)
if (verify_tag(fid, H5AC_BT_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_dataset_size_retrieval */
/*-------------------------------------------------------------------------
* Function: check_dataset_extend_tags
*
* Purpose: This function verifies the correct application of tags
* during dataset extension.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_dataset_extend_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
hsize_t newdims[2] = {DIMS * 2, DIMS}; /* dimensions */
/* Testing Macro */
TESTING("tag application during dataset extend");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ================== */
/* Set Dataset extent */
/* ================== */
if (H5Dset_extent(did, newdims) < 0)
TEST_ERROR;
if (H5Dclose(did) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_dataset_extend_tags */
/*-------------------------------------------------------------------------
* Function: check_object_info_tags
*
* Purpose: This function verifies the correct application of tags
* during object information retrieval.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 1, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_object_info_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file output */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = HADDR_UNDEF;
haddr_t g_tag;
H5O_native_info_t ninfo; /* Native object info struct */
/* Testing Macro */
TESTING("tag application during object info retrieval");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close Group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ===================================== */
/* Get information on an object by name */
/* ===================================== */
/* Even though we do nothing with this, touching the internal
* data structures is needed for the test to pass.
*/
if (H5Oget_native_info_by_name(fid, GROUPNAME, &ninfo, H5O_NATIVE_INFO_ALL, H5P_DEFAULT) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Verify dataset's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_object_info_tags */
/*-------------------------------------------------------------------------
* Function: check_object_copy_tags
*
* Purpose: This function verifies the correct application of tags
* during object copy.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 3, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_object_copy_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t gid = -1; /* Group Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file output */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = HADDR_UNDEF;
haddr_t g_tag;
haddr_t copy_tag;
/* Testing Macro */
TESTING("tag application during object copy");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close Group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* =========== */
/* Copy Group */
/* =========== */
if (H5Ocopy(fid, GROUPNAME, fid, GROUPNAMECOPY, H5P_DEFAULT, H5P_DEFAULT) < 0)
TEST_ERROR;
/* Get tag for copied group */
if ((gid = H5Gopen2(fid, GROUPNAMECOPY, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (get_object_header_tag(gid, &copy_tag) < 0)
TEST_ERROR;
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* Verify group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, g_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0)
TEST_ERROR;
/* Verify copied group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, copy_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, copy_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, copy_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_object_copy_tags */
/*-------------------------------------------------------------------------
* Function: check_link_removal_tags
*
* Purpose: This function verifies the correct application of tags
* during link removal.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 1, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_link_removal_tags(hid_t fcpl, int type)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
hid_t gid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
/* Testing Macro */
TESTING("tag application during link removal");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close Group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* Close Dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ================================ */
/* Remove link to group and dataset */
/* ================================ */
if ((H5Ldelete(fid, GROUPNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((H5Ldelete(fid, DATASETNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
if (type == TEST_SHMESG) {
/* verify shared header message master table */
if (verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0)
TEST_ERROR;
} /* end if */
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_link_removal_tags */
/*-------------------------------------------------------------------------
* Function: check_link_getname_tags
*
* Purpose: This function verifies the correct application of tags
* during link name retrieval.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* March 2, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_link_getname_tags(void)
{
/* Variable Declarations */
char name[500];
hid_t fid = -1; /* File Identifier */
hid_t did = -1; /* Dataset Identifier */
hid_t sid = -1; /* Dataspace Identifier */
hid_t gid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t dcpl = -1; /* dataset creation pl */
hsize_t cdims[2] = {1, 1}; /* chunk dimensions */
int fillval = 0;
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t d_tag = 0;
haddr_t g_tag = 0;
hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
int i, j, k = 0; /* iterators */
int * data = NULL; /* data buffer */
/* Testing Macro */
TESTING("tag application during link name retrieval");
/* ===== */
/* Setup */
/* ===== */
/* Allocate array */
if ((NULL == (data = (int *)HDcalloc(DIMS * DIMS, sizeof(int)))))
TEST_ERROR;
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create group */
if ((gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Retrieve group tag */
if (get_object_header_tag(gid, &g_tag) < 0)
TEST_ERROR;
/* Close Group */
if (H5Gclose(gid) < 0)
TEST_ERROR;
/* Set up creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
/* Enable chunking */
if (H5Pset_chunk(dcpl, RANK, cdims) < 0)
TEST_ERROR;
/* Set up a fill value */
if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
TEST_ERROR;
/* Set up dataset dataspace */
if ((sid = H5Screate_simple(2, dims1, maxdims)) < 0)
TEST_ERROR;
/* Create Dataset */
if ((did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
TEST_ERROR;
if (H5Pclose(dcpl) < 0)
TEST_ERROR;
/* Retrieve tag associated with this dataset */
if (get_object_header_tag(did, &d_tag) < 0)
TEST_ERROR;
/* fill out data buffer */
for (i = 0; i < DIMS; i++)
for (j = 0; j < DIMS; j++)
data[(DIMS * i) + j] = k++;
/* Write to dataset */
if ((H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0)
TEST_ERROR;
/* Close Dataset */
if (H5Dclose(did) < 0)
TEST_ERROR;
/* Close and Reopen the file and dataset */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Get name by index location. */
/* =========================== */
H5Lget_name_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)1, name, (size_t)500, H5P_DEFAULT);
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group's tagged metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
HDfree(data);
PASSED();
return 0;
error:
if (data)
HDfree(data);
return 1;
} /* check_link_getname_tags */
/*-------------------------------------------------------------------------
* Function: check_external_link_creation_tags
*
* Purpose: This function verifies the correct application of tags
* during external link creation.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_external_link_creation_tags(void)
{
/* Variable Declarations */
hid_t fid = -1; /* File Identifier */
hid_t fid2 = -1; /* File Identifier */
hid_t gid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
/* Testing Macro */
TESTING("tag application during external link creation");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl)) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* Create a second file */
if ((fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* Create group in second file */
if ((gid = H5Gcreate2(fid2, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Close out second file */
if ((H5Gclose(gid)) < 0)
TEST_ERROR;
if ((H5Fclose(fid2)) < 0)
TEST_ERROR;
/* ==================== */
/* Create External Link */
/* ==================== */
if (H5Lcreate_external(FILENAME2, GROUPNAMEPATH, fid, LINKNAME, H5P_DEFAULT, H5P_DEFAULT) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* Verify root group metadata */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_OHDR_CHK_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_BT_ID, root_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_external_link_creation_tags */
/*-------------------------------------------------------------------------
* Function: check_external_link_open_tags
*
* Purpose: This function verifies the correct application of tags
* during external link open.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* February 24, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_external_link_open_tags(void)
{
/* Variable Declarations */
haddr_t link_tag = 0; /* link tag */
hid_t fid = -1; /* File Identifier */
hid_t fid2 = -1; /* File Identifier */
hid_t gid = -1; /* Dataspace Identifier */
hid_t xid = -1; /* Dataspace Identifier */
#ifndef NDEBUG
int verbose = FALSE; /* verbose file outout */
#endif /* NDEBUG */
H5O_native_info_t ninfo; /* Native object info struct */
hid_t fapl = -1; /* File access prop list */
haddr_t root_tag = 0;
haddr_t root2_tag = 0;
/* Testing Macro */
TESTING("tag application during external link open");
/* ===== */
/* Setup */
/* ===== */
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid, &root_tag) < 0)
TEST_ERROR;
/* Create a second file */
if ((fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
/* determine tag value of root group's object header */
if (get_object_header_tag(fid2, &root2_tag) < 0)
TEST_ERROR;
/* Create group in second file */
if ((gid = H5Gcreate2(fid2, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
TEST_ERROR;
/* Close out second file */
if ((H5Gclose(gid)) < 0)
TEST_ERROR;
if ((H5Fclose(fid2)) < 0)
TEST_ERROR;
/* Create external link to second file */
if (H5Lcreate_external(FILENAME2, GROUPNAMEPATH, fid, LINKNAME, H5P_DEFAULT, H5P_DEFAULT) < 0)
TEST_ERROR;
/* Close and Reopen the file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
if ((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* Evict as much as we can from the cache so we can track full tag path */
if (evict_entries(fid) < 0)
TEST_ERROR;
/* ================== */
/* Open External Link */
/* ================== */
if ((xid = H5Gopen2(fid, LINKNAME, H5P_DEFAULT)) < 0)
TEST_ERROR;
if ((fid2 = H5Iget_file_id(xid)) < 0)
TEST_ERROR;
if (get_object_header_tag(xid, &link_tag) < 0)
TEST_ERROR;
/* Even though we do nothing with this, touching the internal
* data structures is needed for the test to pass.
*/
if (H5Oget_native_info(xid, &ninfo, H5O_NATIVE_INFO_ALL) < 0)
TEST_ERROR;
/* =================================== */
/* Verification of Metadata Tag Values */
/* =================================== */
#ifndef NDEBUG
/* if verbose, print cache index to screen for visual verification */
if (verbose)
dump_cache(fid);
#endif /* NDEBUG */ /* end debugging functions */
/* verify tag value of first file's root group */
if (verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0)
TEST_ERROR;
if (verify_tag(fid, H5AC_OHDR_CHK_ID, root_tag) < 0)
TEST_ERROR;
/* verify there is a superblock entry with superblock tag. */
if (verify_tag(fid2, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0)
TEST_ERROR;
/* verify tag value of linked file's root group */
if (verify_tag(fid2, H5AC_OHDR_ID, root2_tag) < 0)
TEST_ERROR;
if (verify_tag(fid2, H5AC_LHEAP_PRFX_ID, root2_tag) < 0)
TEST_ERROR;
if (verify_tag(fid2, H5AC_BT_ID, root2_tag) < 0)
TEST_ERROR;
if (verify_tag(fid2, H5AC_SNODE_ID, root2_tag) < 0)
TEST_ERROR;
/* verify tag value of linked group's object header */
if (verify_tag(fid2, H5AC_OHDR_ID, link_tag) < 0)
TEST_ERROR;
if (verify_tag(fid2, H5AC_LHEAP_PRFX_ID, link_tag) < 0)
TEST_ERROR;
if (verify_tag(fid2, H5AC_BT_ID, link_tag) < 0)
TEST_ERROR;
/* verify no other entries present */
if (verify_no_unknown_tags(fid) < 0)
TEST_ERROR;
if (verify_no_unknown_tags(fid2) < 0)
TEST_ERROR;
/* Reset the changes we've made to the cache's data structures */
if (reset_all_entries_investigated(fid) < 0)
TEST_ERROR;
if (reset_all_entries_investigated(fid2) < 0)
TEST_ERROR;
/* =========================== */
/* Close open objects and file */
/* =========================== */
if (H5Gclose(xid) < 0)
TEST_ERROR;
if (H5Fclose(fid) < 0)
TEST_ERROR;
if (H5Fclose(fid2) < 0)
TEST_ERROR;
/* ========================================== */
/* Finished Test. Print status and return. */
/* ========================================== */
PASSED();
return 0;
error:
return 1;
} /* check_external_link_open_tags */
/*-------------------------------------------------------------------------
* Function: check_invalid_tag_application
*
* Purpose: This function verifies that an error occurs if a tag
* has not been set up during a protect or set of
* a new piece of metadata.
*
* Return: 0 on Success, 1 on Failure
*
* Programmer: Mike McGreevy
* May 27, 2010
*
*-------------------------------------------------------------------------
*/
static unsigned
check_invalid_tag_application(void)
{
#if H5C_DO_TAGGING_SANITY_CHECKS
/* Variables */
H5F_t * f = NULL;
hid_t fid = -1;
haddr_t addr;
H5HL_t *lheap = NULL;
hid_t fapl = -1; /* File access prop list */
hbool_t api_ctx_pushed = FALSE; /* Whether API context pushed */
#endif /* H5C_DO_TAGGING_SANITY_CHECKS */
/* Testing Macro */
TESTING("failure on invalid tag application");
#if H5C_DO_TAGGING_SANITY_CHECKS
/* Create Fapl */
if ((fapl = h5_fileaccess_flags(H5_FILEACCESS_LIBVER)) < 0)
TEST_ERROR;
/* Create a test file */
if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
TEST_ERROR;
if (H5Pclose(fapl) < 0)
TEST_ERROR;
/* Push API context */
if (H5CX_push() < 0)
TEST_ERROR
api_ctx_pushed = TRUE;
/* Get internal file pointer*/
if (NULL == (f = (H5F_t *)H5VL_object(fid)))
TEST_ERROR;
/* Call H5HL_create, an internal function that calls H5AC_insert_entry without setting up a tag */
/* Ensure this returns FAILURE, as a tag has not been set up. */
if (H5HL_create(f, (size_t)1024, &addr) >= 0)
TEST_ERROR;
/* Now set up a tag in the API context */
H5AC_tag((haddr_t)25, NULL);
/* Verify the same call to H5HL_create now works as intended, with a tag set up. */
if (H5HL_create(f, (size_t)1024, &addr) < 0)
TEST_ERROR;
/* Reset API context to use invalid tag. */
H5AC_tag(H5AC__INVALID_TAG, NULL);
/* Call H5HL_protect to protect the local heap created above. */
/* This should fail as no tag is set up during the protect call */
if ((lheap = H5HL_protect(f, addr, H5AC__NO_FLAGS_SET)) != NULL)
TEST_ERROR;
/* Again, set up a valid tag in the API context */
H5AC_tag((haddr_t)25, NULL);
/* Call H5HL_protect again to protect the local heap. This should succeed. */
if ((lheap = H5HL_protect(f, addr, H5AC__NO_FLAGS_SET)) == NULL)
TEST_ERROR;
/* Now unprotect the heap, as we're done with the test. */
if (H5HL_unprotect(lheap) < 0)
TEST_ERROR;
/* Pop API context */
if (api_ctx_pushed && H5CX_pop(FALSE) < 0)
TEST_ERROR
api_ctx_pushed = FALSE;
/* Close open objects and file */
if (H5Fclose(fid) < 0)
TEST_ERROR;
/* Finished Test. Print status and return. */
PASSED();
#else
SKIPPED();
HDprintf(" test skipped because sanity checking on tag value is disabled.\n");
#endif /* H5C_DO_TAGGING_SANITY_CHECKS */
return 0;
#if H5C_DO_TAGGING_SANITY_CHECKS
error:
if (api_ctx_pushed)
H5CX_pop(FALSE);
return 1;
#endif /* H5C_DO_TAGGING_SANITY_CHECKS */
} /* check_invalid_tag_application */
/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Run tests on library's ability to tag metadata entries.
*
* Return: EXIT_SUCCESS/EXIT_FAILURE
*
* Programmer: Mike McGreevy
* January 15, 2009
*
*-------------------------------------------------------------------------
*/
int
main(void)
{
/* Variable Declarations */
hid_t fcpl_default = -1; /* file creation prop list */
hid_t fcpl_shmesg_all = -1; /* file creation prop list */
hid_t fcpl = -1; /* file creation prop list */
unsigned nerrs = 0; /* Error Encountered */
int test_type = 0; /* test type iterator */
/* Open the HDF5 Library */
H5open();
/* ========== */
/* Test Setup */
/* ========== */
/* Create a standard file creation property list */
fcpl_default = H5Pcreate(H5P_FILE_CREATE);
/* Create an fcpl with shared messages and file space managment enabled */
fcpl_shmesg_all = H5Pcreate(H5P_FILE_CREATE);
H5Pset_shared_mesg_nindexes(fcpl_shmesg_all, 1);
H5Pset_shared_mesg_index(fcpl_shmesg_all, 0, H5O_SHMESG_ALL_FLAG, 20);
H5Pset_file_space_strategy(fcpl_shmesg_all, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)0);
/* ========= */
/* Run Tests */
/* ========= */
for (test_type = 0; test_type < NUM_TEST_TYPES; test_type++) {
/* Run tests on each fcpl set up above. */
if (test_type == TEST_DEFAULT) {
if (!nerrs)
HDprintf("Testing standard tag application cases w/ default fcpl:\n");
fcpl = fcpl_default;
}
else if (test_type == TEST_SHMESG) {
if (!nerrs)
HDprintf("Testing standard tag application cases w/ shared messages:\n");
fcpl = fcpl_shmesg_all;
}
else {
TEST_ERROR;
}
/* Check tag application under different circumstances */
if (!nerrs)
nerrs += check_file_creation_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_file_open_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_attribute_creation_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_attribute_open_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_attribute_write_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_attribute_delete_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_attribute_rename_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_dataset_creation_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_dataset_creation_earlyalloc_tags(fcpl, test_type);
if (!nerrs)
nerrs += check_link_removal_tags(fcpl, test_type);
} /* end for */
if (!nerrs)
HDprintf("Testing other specific tag application cases:\n");
if (!nerrs)
nerrs += check_group_creation_tags();
if (!nerrs)
nerrs += check_multi_group_creation_tags();
if (!nerrs)
nerrs += check_group_open_tags();
if (!nerrs)
nerrs += check_dataset_open_tags();
if (!nerrs)
nerrs += check_dataset_write_tags();
if (!nerrs)
nerrs += check_dataset_read_tags();
if (!nerrs)
nerrs += check_dataset_size_retrieval();
if (!nerrs)
nerrs += check_dataset_extend_tags();
if (!nerrs)
nerrs += check_object_info_tags();
if (!nerrs)
nerrs += check_object_copy_tags();
if (!nerrs)
nerrs += check_link_getname_tags();
if (!nerrs)
nerrs += check_external_link_creation_tags();
if (!nerrs)
nerrs += check_external_link_open_tags();
if (!nerrs)
nerrs += check_dense_attribute_tags();
if (!nerrs)
nerrs += check_link_iteration_tags();
if (!nerrs)
nerrs += check_invalid_tag_application();
/* Delete test files */
HDremove(FILENAME);
HDremove(FILENAME2);
/* Return Errors */
if (nerrs > 0)
return EXIT_FAILURE;
else
return EXIT_SUCCESS;
error:
/* Return with Error */
return EXIT_FAILURE;
} /* main */