summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2002-06-01 03:11:34 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2002-06-01 03:11:34 (GMT)
commit44a72a6777520034f87f712697ce05de5929f288 (patch)
treea8ef3c925a71a46e83bb82783aed0fcfdc33d6a0
parent8249ec87a2170c52baf8c33c51c1743a4ead5ec7 (diff)
downloadhdf5-44a72a6777520034f87f712697ce05de5929f288.zip
hdf5-44a72a6777520034f87f712697ce05de5929f288.tar.gz
hdf5-44a72a6777520034f87f712697ce05de5929f288.tar.bz2
[svn-r5502] Purpose:
Test Bug Fix Description: Under certain [obscure] circumstances, an object header would get paged out of the metadata cache, and when it was accessed again and brought back into the cache, and immediately had additional metadata added to it (an attribute, usually, or perhaps adding an object to a group), and needed to be extended with a continuation message, but there was no room in any existing object header chunks for the continuation message and an existing object header message needed to be moved to the new object header chunk (I told you it was obscure :-), the object header message moved to the new chunk (not the new metadata being added) would get corrupted. *whew* :-) Solution: Actually copy the "raw" object header message information of the object header message being moved to the new chunk, instead of relying on the "native" object header message information being re-encoded when the object header is flushed. This is because when an object header is paged out of the metadata cache and subsequently brought back in, the "native" information pointer in memory is reset to NULL and only the "raw" information exists. [Actually, this additional testing doesn't trigger the bug, which needs _lots_ of objects to be created and accessed, but it does execise the object header continuation code more than other tests in the library.] Platforms tested: Solaris 2.7 (arabica) & FreeBSD 4.5 (sleipnir)
-rw-r--r--test/Makefile.in3
-rw-r--r--test/tmisc.c110
2 files changed, 112 insertions, 1 deletions
diff --git a/test/Makefile.in b/test/Makefile.in
index b8c6b71..a066969 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -48,7 +48,8 @@ MOSTLYCLEAN=cmpd_dset.h5 dataset.h5 extend.h5 istore.h5 tfile1.h5 tfile2.h5 \
mount_[0-9].h5 testmeta.h5 ttime.h5 trefer[12].h5 tvltypes.h5 \
tvlstr.h5 flush.h5 enum1.h5 titerate.h5 ttsafe.h5 tarray1.h5 \
tgenprop.h5 tmisc.h5 tmisc2a.h5 tmisc2b.h5 tmisc3.h5 tmisc4a.h5 \
- tmisc4b.h5 tmisc5.h5 set_extent_read.h5 set_extent_create.h5
+ tmisc4b.h5 tmisc5.h5 tmisc6.h5 set_extent_read.h5 \
+ set_extent_create.h5
CLEAN=$(TIMINGS)
## Source and object files for programs... The TEST_SRC list contains all the
diff --git a/test/tmisc.c b/test/tmisc.c
index 3112e98..6b3caac 100644
--- a/test/tmisc.c
+++ b/test/tmisc.c
@@ -106,6 +106,12 @@ typedef struct
misc5_struct2_hndl *st1h_st2hndl;
} misc5_struct1_hndl;
+/* Definitions for misc. test #6 */
+#define MISC6_FILE "tmisc6.h5"
+#define MISC6_DSETNAME1 "dset1"
+#define MISC6_DSETNAME2 "dset2"
+#define MISC6_NUMATTR 16
+
/****************************************************************
**
** test_misc1(): test unlinking a dataset from a group and immediately
@@ -797,6 +803,108 @@ test_misc5(void)
/****************************************************************
**
+** test_misc6(): Test that object header continuation messages are
+** created correctly.
+**
+****************************************************************/
+static void
+test_misc6(void)
+{
+ hid_t loc_id, space_id, dataset_id;
+ hid_t attr_id;
+ char attr_name[16];
+ unsigned u;
+ herr_t ret;
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Testing object header continuation code \n"));
+
+ /* Create the file */
+ loc_id=H5Fcreate(MISC6_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ CHECK(loc_id,FAIL,"H5Fcreate");
+
+ /* Create the dataspace */
+ space_id=H5Screate(H5S_SCALAR);
+ CHECK(space_id,FAIL,"H5Screate");
+
+ /* Create the first dataset */
+ dataset_id=H5Dcreate(loc_id, MISC6_DSETNAME1, H5T_NATIVE_INT, space_id, H5P_DEFAULT);
+ CHECK(dataset_id,FAIL,"H5Dcreate");
+
+ /* Close dataset */
+ ret=H5Dclose(dataset_id);
+ CHECK(ret,FAIL,"H5Dclose");
+
+ /* Create the second dataset */
+ dataset_id=H5Dcreate(loc_id, MISC6_DSETNAME2, H5T_NATIVE_INT, space_id, H5P_DEFAULT);
+ CHECK(dataset_id,FAIL,"H5Dcreate");
+
+ /* Close dataset */
+ ret=H5Dclose(dataset_id);
+ CHECK(ret,FAIL,"H5Dclose");
+
+ /* Close file */
+ ret=H5Fclose(loc_id);
+ CHECK(ret,FAIL,"H5Fclose");
+
+ /* Loop through adding attributes to each dataset */
+ for(u=0; u<MISC6_NUMATTR; u++) {
+ /* Create name for attribute */
+ sprintf(attr_name,"Attr#%u",u);
+
+ /* Open the file */
+ loc_id=H5Fopen(MISC6_FILE, H5F_ACC_RDWR, H5P_DEFAULT);
+ CHECK(loc_id,FAIL,"H5Fopen");
+
+
+ /* Open first dataset */
+ dataset_id=H5Dopen(loc_id, MISC6_DSETNAME1);
+ CHECK(dataset_id,FAIL,"H5Dopen");
+
+ /* Add attribute to dataset */
+ attr_id=H5Acreate(dataset_id,attr_name,H5T_NATIVE_INT,space_id,H5P_DEFAULT);
+ CHECK(attr_id, FAIL, "H5Acreate");
+
+ /* Close attribute */
+ ret=H5Aclose(attr_id);
+ CHECK(ret, FAIL, "H5Aclose");
+
+ /* Close dataset */
+ ret=H5Dclose(dataset_id);
+ CHECK(ret, FAIL, "H5Dclose");
+
+
+ /* Open second dataset */
+ dataset_id=H5Dopen(loc_id, MISC6_DSETNAME2);
+ CHECK(dataset_id,FAIL,"H5Dopen");
+
+ /* Add attribute to dataset */
+ attr_id=H5Acreate(dataset_id,attr_name,H5T_NATIVE_INT,space_id,H5P_DEFAULT);
+ CHECK(attr_id, FAIL, "H5Acreate");
+
+ /* Close attribute */
+ ret=H5Aclose(attr_id);
+ CHECK(ret, FAIL, "H5Aclose");
+
+ /* Close dataset */
+ ret=H5Dclose(dataset_id);
+ CHECK(ret, FAIL, "H5Dclose");
+
+
+ /* Close file */
+ ret=H5Fclose(loc_id);
+ CHECK(ret,FAIL,"H5Fclose");
+
+ } /* end for */
+
+ /* Close dataspace */
+ ret=H5Sclose(space_id);
+ CHECK(ret,FAIL,"H5Sclose");
+
+} /* end test_misc6() */
+
+/****************************************************************
+**
** test_misc(): Main misc. test routine.
**
****************************************************************/
@@ -811,6 +919,7 @@ test_misc(void)
test_misc3(); /* Test reading from chunked dataset with non-zero fill value */
test_misc4(); /* Test retrieving the fileno for various objects with H5Gget_objinfo() */
test_misc5(); /* Test several level deep nested compound & VL datatypes */
+ test_misc6(); /* Test object header continuation code */
} /* test_misc() */
@@ -839,4 +948,5 @@ cleanup_misc(void)
remove(MISC4_FILE_1);
remove(MISC4_FILE_2);
remove(MISC5_FILE);
+ remove(MISC6_FILE);
}