summaryrefslogtreecommitdiffstats
path: root/test/big.c
diff options
context:
space:
mode:
authorAlbert Cheng <acheng@hdfgroup.org>2010-09-20 05:18:29 (GMT)
committerAlbert Cheng <acheng@hdfgroup.org>2010-09-20 05:18:29 (GMT)
commit88abe7432bc45180ae746c11e3a552045a4b7a24 (patch)
treecebd947398bfaeb0c96ebed60d69ddb43eb8c9c3 /test/big.c
parent91565db20993a0bf73b3d32828bb87b8e7d6bf0c (diff)
downloadhdf5-88abe7432bc45180ae746c11e3a552045a4b7a24.zip
hdf5-88abe7432bc45180ae746c11e3a552045a4b7a24.tar.gz
hdf5-88abe7432bc45180ae746c11e3a552045a4b7a24.tar.bz2
[svn-r19423] Bug fix: 1961-- AIX 6.1 --enable-share did not work.
Description: In an AIX 6.1 system, configure --enable-shared could not build a shared HDF5 library. The problem was because the version of config.guess was too old to recongnize AIX 6.X and also configure.in had a local fix which did not recognize AIX 6.X. Solution: 1. Mike McGreevy updated bin/config.guess to handle AIX 6.X. 2 Albert fixed configure.in to recognize AIX 6.X. Note that though HDF5 can build shared lib for AIX 6.X systems but it still could not install the proper library as in AIX 5.X systems. Also, bin/config.sub should be updated too. Tested: BP which is the AIX 6.1 system that exposed this problem.
Diffstat (limited to 'test/big.c')
-rw-r--r--test/big.c325
1 files changed, 208 insertions, 117 deletions
diff --git a/test/big.c b/test/big.c
index 8d65559..e4381c5 100644
--- a/test/big.c
+++ b/test/big.c
@@ -16,15 +16,57 @@
/*
* Programmer: Robb Matzke <matzke@llnl.gov>
* Wednesday, April 8, 1998
+ * Modified: Albert Cheng <acheng@hdfgroup.org>
+ * September 11, 2010
+ */
+/*
+ * The purpose of this test is to verify if a virtual file driver can handle:
+ * a. Large file (2GB)
+ * This should exceed 32bits I/O system since offset is a signed
+ * integral type (in order to support negative offset with respect to
+ * end of file).
+ * b. Extra Large file (4GB)
+ * This definite exceeds 32bit I/O and file systems.
+ * c. Huge file (tens of GB)
+ * This verifies the HDF5 library handles big logical file size
+ * correctly.
+ * In practice, if a VFD can handle a big file size, there is no need to
+ * test the smaller file sizes. E.g., If it can handle the Huge file,
+ * there is no need to test the Extra large or Large files. Therefore the
+ * test starts with larger size files and continues to test the smaller size
+ * files only if the large sige file tests have failed.
+ *
+ * Another consideration is that even if a VFD is capable to handle a
+ * huge file but it is likely to take a long time to write every byte
+ * of a huge file. E.g., a simple workstation may have disks of write
+ * speed of 10MB/sec. A huge file of 30GB will take about an hour to
+ * write it. Therefore, this test will run the huge file test only if the
+ * underlying file system supports sparse file. (A Sparse file here means
+ * that disk space is allocated only when the contents are actually written.
+ * E.g., If one creates a new file, seeks forward 10 million bytes, writes
+ * 1 bytes and closes the file, then a sparse file, will show file size of
+ * 10 million bytes but actaully uses only couple disk blocks, much smaller
+ * than the formal file size.)
+ *
+ * One more consideration is that we want to distinguish an HDF5 library
+ * failure from some system limits such as current free disk space or user
+ * disk space quota. Therefore, the test will first attempt to verify no
+ * such limits exist before running the actual VFD tests.
*/
#include "h5test.h"
+typedef enum fsizes_t { LFILE, XLFILE, HUGEFILE} fsizes_t;
+typedef enum vfd_t { SEC2_VFD, STDIO_VFD, FAMILY_VFD } vfd_t;
+fsizes_t file_size= HUGEFILE;
+
const char *FILENAME[] = {
"big",
"sec2",
"stdio",
NULL
};
+int cflag=1; /* check file system before test */
+hsize_t family_size_def; /* default family file size */
#define DNAME "big.data"
@@ -44,6 +86,7 @@ const char *FILENAME[] = {
/* Protocols */
static void usage(void);
+int testvfd(vfd_t vfd);
/* Array used to record all addresses at which data has been written */
/* so far. Used to prevent overlapping writes. */
@@ -157,22 +200,32 @@ is_sparse(void)
*-------------------------------------------------------------------------
*/
static int
-supports_big(void)
+supports_big(vfd_t vfd)
{
int fd;
- if ((fd=HDopen("y.h5", O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) return 0;
-
- /* Write a few bytes at 2GB */
- if (HDlseek(fd, 2*GB, SEEK_SET)!=2*GB) return 0;
- if (5!=HDwrite(fd, "hello", (size_t)5)) return 0;
-
- /* Write a few bytes at 4GB */
- if (HDlseek(fd, 4*GB, SEEK_SET) != 4*GB) return 0;
- if (5!=HDwrite(fd, "hello", (size_t)5)) return 0;
-
- if (HDclose(fd) < 0) return 0;
- if (HDremove("y.h5") < 0) return 0;
+ switch (vfd){
+ case FAMILY_VFD:
+ case SEC2_VFD:
+ case STDIO_VFD:
+ if ((fd=HDopen("y.h5", O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) return 0;
+
+ /* Write a few bytes at 2GB */
+ if (HDlseek(fd, 2*GB, SEEK_SET)!=2*GB) return 0;
+ if (5!=HDwrite(fd, "hello", (size_t)5)) return 0;
+
+ /* Write a few bytes at 4GB */
+ if (HDlseek(fd, 4*GB, SEEK_SET) != 4*GB) return 0;
+ if (5!=HDwrite(fd, "hello", (size_t)5)) return 0;
+
+ if (HDclose(fd) < 0) return 0;
+ if (HDremove("y.h5") < 0) return 0;
+ break;
+ default:
+ /* unknown or unsupported VFD */
+ return 0;
+ break;
+ }
return (1);
}
@@ -475,6 +528,142 @@ usage(void)
+int testvfd(vfd_t vfd)
+{
+ hid_t fapl=-1;
+ hsize_t family_size;
+ char filename[1024];
+
+
+ switch(vfd){
+ case FAMILY_VFD:
+ /* Why should I do h5_fileaccess to get fapl and prompty override it??*/
+ fapl = h5_fileaccess();
+
+ /* Test big file with the family driver */
+ puts("Testing big file with the Family Driver ");
+ if (H5FD_FAMILY!=H5Pget_driver(fapl)) {
+ HDfprintf(stdout,
+ "Changing file drivers to the family driver, %Hu bytes each\n",
+ family_size_def);
+ if (H5Pset_fapl_family(fapl, family_size_def, H5P_DEFAULT) < 0) goto error;
+ } else if (H5Pget_fapl_family(fapl, &family_size, NULL) < 0) {
+ goto error;
+ } else if (family_size!=family_size_def) {
+ HDfprintf(stdout, "Changing family member size from %Hu to %Hu\n",
+ family_size, family_size_def);
+ if (H5Pset_fapl_family(fapl, family_size_def, H5P_DEFAULT) < 0)
+ goto error;
+ }
+
+ if (cflag){
+ /*
+ * We shouldn't run this test if the file system doesn't support holes
+ * because we would generate multi-gigabyte files.
+ */
+ puts("Checking if file system is adequate for this test...");
+ if (sizeof(long long)<8 || 0==GB8LL) {
+ puts("Test skipped because sizeof(long long) is too small. This");
+ puts("hardware apparently doesn't support 64-bit integer types.");
+ usage();
+ goto quit;
+ }
+ if (!is_sparse()) {
+ puts("Test skipped because file system does not support holes.");
+ usage();
+ goto quit;
+ }
+ if (!enough_room(fapl)) {
+ puts("Test skipped because of quota (file size or num open files).");
+ usage();
+ goto quit;
+ }
+ }
+
+ /* Do the test with the Family Driver */
+ h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+ if (writer(filename, fapl, WRT_N)) goto error;
+ if (reader(filename, fapl)) goto error;
+
+ puts("Test passed with the Family Driver.");
+ break;
+
+ case SEC2_VFD:
+ /*
+ * We shouldn't run this test if the file system doesn't support big files
+ * because we would generate multi-gigabyte files.
+ */
+ puts("\nChecking if file system supports big files...");
+ if (!supports_big(SEC2_VFD)) {
+ puts("Test for sec2 is skipped because file system does not support big files.");
+ usage();
+ goto quit;
+ }
+
+ /* Test big file with the SEC2 driver */
+ puts("Testing big file with the SEC2 Driver ");
+
+ fapl = h5_fileaccess();
+ if(H5Pset_fapl_sec2(fapl) < 0)
+
+ HDmemset(filename, 0, sizeof(filename));
+ h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
+
+ if (writer(filename, fapl, WRT_N)) goto error;
+ if (reader(filename, fapl)) goto error;
+
+ puts("Test passed with the SEC2 Driver.");
+ break;
+
+ case STDIO_VFD:
+ /*
+ * We shouldn't run this test if the file system doesn't support big files
+ * because we would generate multi-gigabyte files.
+ */
+ puts("\nChecking if file system supports big files...");
+ if (!supports_big(STDIO_VFD)) {
+ puts("Test for stdio is skipped because file system does not support big files.");
+ usage();
+ goto quit;
+ }
+ /* Test big file with the STDIO driver only if fseeko is supported,
+ * because the OFFSET parameter of fseek has the type LONG, not big
+ * enough to support big files. */
+ puts("\nTesting big file with the STDIO Driver ");
+
+ fapl = h5_fileaccess();
+ if(H5Pset_fapl_stdio(fapl) < 0)
+
+ HDmemset(filename, 0, sizeof(filename));
+ h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
+
+ if (writer(filename, fapl, WRT_N)) goto error;
+ if (reader(filename, fapl)) goto error;
+ puts("Test passed with the STDIO Driver.");
+ break;
+
+ default:
+ puts("Unsupprted VFD");
+ usage();
+ goto error;;
+ } /* end of switch (vfd) */
+
+quit:
+ /* End with normal return code */
+ /* Clean up the test file */
+ if (h5_cleanup(FILENAME, fapl)) remove(DNAME);
+ return 0;
+
+
+error:
+ if (fapl>=0) H5Pclose(fapl);
+ puts("*** TEST FAILED ***");
+ return 1;
+}
+
+
+
/*-------------------------------------------------------------------------
* Function: main
*
@@ -501,12 +690,7 @@ usage(void)
int
main (int ac, char **av)
{
- hid_t fapl=-1;
- hsize_t family_size;
- hsize_t family_size_def; /* default family file size */
unsigned long seed = 0; /* Random # seed */
- int cflag=1; /* check file system before test */
- char filename[1024];
/* parameters setup */
family_size_def = FAMILY_SIZE;
@@ -546,113 +730,20 @@ HDfprintf(stderr, "Random # seed was: %lu\n", seed);
#endif /* QAK */
HDsrandom(seed);
- /* Reset library */
- h5_reset();
- fapl = h5_fileaccess();
-
- /* Test big file with the family driver */
- puts("Testing big file with the Family Driver ");
- if (H5FD_FAMILY!=H5Pget_driver(fapl)) {
- HDfprintf(stdout,
- "Changing file drivers to the family driver, %Hu bytes each\n",
- family_size_def);
- if (H5Pset_fapl_family(fapl, family_size_def, H5P_DEFAULT) < 0) goto error;
- } else if (H5Pget_fapl_family(fapl, &family_size, NULL) < 0) {
+/*=================================================*/
+ if (testvfd(FAMILY_VFD) != 0)
+ goto error;
+ if (testvfd(SEC2_VFD) != 0)
+ goto error;
+ if (testvfd(STDIO_VFD) != 0)
goto error;
- } else if (family_size!=family_size_def) {
- HDfprintf(stdout, "Changing family member size from %Hu to %Hu\n",
- family_size, family_size_def);
- if (H5Pset_fapl_family(fapl, family_size_def, H5P_DEFAULT) < 0)
- goto error;
- }
-
- if (cflag){
- /*
- * We shouldn't run this test if the file system doesn't support holes
- * because we would generate multi-gigabyte files.
- */
- puts("Checking if file system is adequate for this test...");
- if (sizeof(long long)<8 || 0==GB8LL) {
- puts("Test skipped because sizeof(long long) is too small. This");
- puts("hardware apparently doesn't support 64-bit integer types.");
- usage();
- goto quit;
- }
- if (!is_sparse()) {
- puts("Test skipped because file system does not support holes.");
- usage();
- goto quit;
- }
- if (!enough_room(fapl)) {
- puts("Test skipped because of quota (file size or num open files).");
- usage();
- goto quit;
- }
- }
-
- /* Do the test with the Family Driver */
- h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-
- if (writer(filename, fapl, WRT_N)) goto error;
- if (reader(filename, fapl)) goto error;
-
- puts("Test passed with the Family Driver.");
-
- /*
- * We shouldn't run this test if the file system doesn't support big files
- * because we would generate multi-gigabyte files.
- */
- puts("\nChecking if file system supports big files...");
- if (!supports_big()) {
- puts("Tests for sec2 and stdio are skipped because file system does not support big files.");
- usage();
- goto quit;
- }
-
- /* Clean up the test file */
- if (h5_cleanup(FILENAME, fapl)) remove(DNAME);
-
- /* Test big file with the SEC2 driver */
- puts("Testing big file with the SEC2 Driver ");
-
- fapl = h5_fileaccess();
- if(H5Pset_fapl_sec2(fapl) < 0)
-
- HDmemset(filename, 0, sizeof(filename));
- h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
-
- if (writer(filename, fapl, WRT_N)) goto error;
- if (reader(filename, fapl)) goto error;
-
- puts("Test passed with the SEC2 Driver.");
-
-#ifdef H5_HAVE_FSEEKO
- /* Clean up the test file */
- if (h5_cleanup(FILENAME, fapl)) remove(DNAME);
-
- /* Test big file with the STDIO driver only if fseeko is supported,
- * because the OFFSET parameter of fseek has the type LONG, not big
- * enough to support big files. */
- puts("\nTesting big file with the STDIO Driver ");
-
- fapl = h5_fileaccess();
- if(H5Pset_fapl_stdio(fapl) < 0)
- HDmemset(filename, 0, sizeof(filename));
- h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
-
- if (writer(filename, fapl, WRT_N)) goto error;
- if (reader(filename, fapl)) goto error;
- puts("Test passed with the STDIO Driver.");
-#endif
quit:
/* End with normal exit code */
- if (h5_cleanup(FILENAME, fapl)) remove(DNAME);
return 0;
error:
- if (fapl>=0) H5Pclose(fapl);
puts("*** TEST FAILED ***");
return 1;
}