summaryrefslogtreecommitdiffstats
path: root/test/tmisc.c
diff options
context:
space:
mode:
authorNeil Fortner <nfortne2@hdfgroup.org>2009-02-12 20:46:32 (GMT)
committerNeil Fortner <nfortne2@hdfgroup.org>2009-02-12 20:46:32 (GMT)
commit0bdedf0a39e859956b6810e848fa67d16b4e10a4 (patch)
treee558e84649e86dbf4422206089baf08ccef659f7 /test/tmisc.c
parent0eb811d83156bc15162607c967d98e8ca093a8df (diff)
downloadhdf5-0bdedf0a39e859956b6810e848fa67d16b4e10a4.zip
hdf5-0bdedf0a39e859956b6810e848fa67d16b4e10a4.tar.gz
hdf5-0bdedf0a39e859956b6810e848fa67d16b4e10a4.tar.bz2
[svn-r16480] Purpose: Improve chunk cache
Description: The meaning of the "nbytes" field in H5D_rdcc_t was not clear, and some places assumed it was the maximum size of the chunk cache, while some assumed it was the current size of the chunk cache. The end result was that only 1 chunk could be held in cache at a time. This field has been replaced by "nbytes_max" and "nbytes_used". Performance of cached I/O should improve greatly. Tested: jam, smirom (h5committest)
Diffstat (limited to 'test/tmisc.c')
-rw-r--r--test/tmisc.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/test/tmisc.c b/test/tmisc.c
index 746af5d..875a92b 100644
--- a/test/tmisc.c
+++ b/test/tmisc.c
@@ -300,6 +300,11 @@ unsigned m13_rdata[MISC13_DIM1][MISC13_DIM2]; /* Data read from dataset
#define MISC27_FILE "tbad_msg_count.h5"
#define MISC27_GROUP "Group"
+/* Definitions for misc. test #28 */
+#define MISC28_FILE "tmisc28.h5"
+#define MISC28_SIZE 10
+#define MISC28_NSLOTS 10000
+
/****************************************************************
**
** test_misc1(): test unlinking a dataset from a group and immediately
@@ -4854,6 +4859,183 @@ test_misc27(void)
CHECK(ret, FAIL, "H5Fclose");
} /* end test_misc27() */
+
+/****************************************************************
+**
+** test_misc28(): Ensure that the dataset chunk cache will hold
+** the correct number of chunks in cache without
+** evicting them.
+**
+****************************************************************/
+static void
+test_misc28(void)
+{
+ hid_t fid; /* File ID */
+ hid_t sidf; /* File Dataspace ID */
+ hid_t sidm; /* Memory Dataspace ID */
+ hid_t did; /* Dataset ID */
+ hid_t dcpl, fapl; /* Property List IDs */
+ hsize_t dims[] = {MISC28_SIZE, MISC28_SIZE};
+ hsize_t mdims[] = {MISC28_SIZE};
+ hsize_t cdims[] = {1, 1};
+ hsize_t start[] = {0,0};
+ hsize_t count[] = {MISC28_SIZE, 1};
+ size_t nbytes_used;
+ int nused;
+ char buf[10];
+ int i;
+ herr_t ret; /* Generic return value */
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Dataset chunk cache\n"));
+
+ /* Create the fapl and set the cache size. Set nelmts to larger than the
+ * file size so we can be guaranteed that no chunks will be evicted due to
+ * a hash collision. Set nbytes to fit exactly 1 column of chunks (10
+ * bytes). */
+ fapl = H5Pcreate(H5P_FILE_ACCESS);
+ CHECK(fapl, FAIL, "H5Pcreate");
+ ret = H5Pset_cache(fapl, MISC28_NSLOTS, MISC28_NSLOTS, MISC28_SIZE, 0.75);
+ CHECK(ret, FAIL, "H5Pset_cache");
+
+ /* Create the dcpl and set the chunk size */
+ dcpl = H5Pcreate(H5P_DATASET_CREATE);
+ CHECK(dcpl, FAIL, "H5Pcreate");
+ ret = H5Pset_chunk(dcpl, 2, cdims);
+ CHECK(ret, FAIL, "H5Pset_chunk");
+
+
+ /* Create a new file and datasets within that file that use these
+ * property lists
+ */
+ fid = H5Fcreate(MISC28_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+ CHECK(fid, FAIL, "H5Fcreate");
+
+ sidf = H5Screate_simple(2, dims, NULL);
+ CHECK(sidf, FAIL, "H5Screate_simple");
+
+ did = H5Dcreate2(fid, "dataset", H5T_NATIVE_CHAR, sidf, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+ CHECK(did, FAIL, "H5Dcreate2");
+
+ /* Verify that the chunk cache is empty */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) 0, "H5D_current_cache_size_test");
+ VERIFY(nused, 0, "H5D_current_cache_size_test");
+
+ /* Initialize write buffer */
+ for(i=0; i<MISC28_SIZE; i++)
+ buf[i] = i;
+
+ /* Create memory dataspace and selection in file dataspace */
+ sidm = H5Screate_simple(1, mdims, NULL);
+ CHECK(sidm, FAIL, "H5Screate_simple");
+
+ ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ /* Write hypserslab */
+ ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf);
+ CHECK(ret, FAIL, "H5Dwrite");
+
+ /* Verify that all 10 chunks written have been cached */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) MISC28_SIZE, "H5D_current_cache_size_test");
+ VERIFY(nused, MISC28_SIZE, "H5D_current_cache_size_test");
+
+ /* Initialize write buffer */
+ for(i=0; i<MISC28_SIZE; i++)
+ buf[i] = MISC28_SIZE - 1 - i;
+
+ /* Select new hyperslab */
+ start[1] = 1;
+ ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ /* Write hyperslab */
+ ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf);
+ CHECK(ret, FAIL, "H5Dwrite");
+
+ /* Verify that the size of the cache remains at 10 */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) MISC28_SIZE, "H5D_current_cache_size_test");
+ VERIFY(nused, MISC28_SIZE, "H5D_current_cache_size_test");
+
+ /* Close dataset */
+ ret = H5Dclose(did);
+ CHECK(ret, FAIL, "H5Dclose");
+
+
+ /* Re open dataset */
+ did = H5Dopen2(fid, "dataset", H5P_DEFAULT);
+ CHECK(did, FAIL, "H5Dopen2");
+
+ /* Verify that the chunk cache is empty */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) 0, "H5D_current_cache_size_test");
+ VERIFY(nused, 0, "H5D_current_cache_size_test");
+
+ /* Select hyperslabe for reading */
+ start[1] = 0;
+ ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ /* Read hypserslab */
+ ret = H5Dread(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf);
+ CHECK(ret, FAIL, "H5Dread");
+
+ /* Verify the data read */
+ for(i=0; i<MISC28_SIZE; i++)
+ VERIFY(buf[i], i, "H5Dread");
+
+ /* Verify that all 10 chunks read have been cached */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) MISC28_SIZE, "H5D_current_cache_size_test");
+ VERIFY(nused, MISC28_SIZE, "H5D_current_cache_size_test");
+
+ /* Select new hyperslab */
+ start[1] = 1;
+ ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ /* Read hyperslab */
+ ret = H5Dread(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf);
+ CHECK(ret, FAIL, "H5Dread");
+
+ /* Verify the data read */
+ for(i=0; i<MISC28_SIZE; i++)
+ VERIFY(buf[i], MISC28_SIZE - 1 - i, "H5Dread");
+
+ /* Verify that the size of the cache remains at 10 */
+ ret = H5D_current_cache_size_test(did, &nbytes_used, &nused);
+ CHECK(ret, FAIL, "H5D_current_cache_size_test");
+ VERIFY(nbytes_used, (size_t) MISC28_SIZE, "H5D_current_cache_size_test");
+ VERIFY(nused, MISC28_SIZE, "H5D_current_cache_size_test");
+
+ /* Close dataset */
+ ret = H5Dclose(did);
+ CHECK(ret, FAIL, "H5Dclose");
+
+
+ /* Close the dataspaces and file */
+ ret = H5Sclose(sidf);
+ CHECK_I(ret, "H5Sclose");
+ ret = H5Sclose(sidm);
+ CHECK_I(ret, "H5Sclose");
+ ret = H5Fclose(fid);
+ CHECK_I(ret, "H5Fclose");
+
+ /* Close the property lists. */
+ ret = H5Pclose(dcpl);
+ CHECK_I(ret, "H5Pclose");
+ ret = H5Pclose(fapl);
+ CHECK_I(ret, "H5Pclose");
+} /* end test_misc28() */
+
/****************************************************************
**
** test_misc(): Main misc. test routine.
@@ -4896,6 +5078,7 @@ test_misc(void)
test_misc25c(); /* Exercise another null object header message merge bug */
test_misc26(); /* Test closing property lists with long filter pipelines */
test_misc27(); /* Test opening file with object that has bad # of object header messages */
+ test_misc28(); /* Test that chunks are cached appropriately */
} /* test_misc() */
@@ -4950,5 +5133,6 @@ cleanup_misc(void)
HDremove(MISC25A_FILE);
HDremove(MISC25C_FILE);
HDremove(MISC26_FILE);
+ HDremove(MISC28_FILE);
}