mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
cc89b8a605
---------------------- ./MANIFEST ./src/H5FDmulti.c [NEW] ./src/H5FDmulti.h [NEW] ./src/Makefile.in ./src/hdf5.h The split driver was reimplemented as a more general "multi" driver which is capable of splitting data into multiple files like the family driver except the partioning is done by memory usage type instead of address. The H5Pset_fapl_split() function just calls H5Pset_fapl_multi() with arguments which prepare to split the address space into two files: meta and raw data. This is the first version. I plan to allow the open() call to relax a bit which would allow one to open an hdf5 file when only the meta-data file is present. This would allow a very large file to be split and stored on tape and the relatively small meta file to be mirrored on disk to allow limited browsing of the file (any request for raw data would fail). ./src/H5private.h ./src/H5F.c ./src/H5FD.c ./src/H5FDprivate.h ./src/H5FDpublic.h ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDmpio.c ./src/H5FDsec2.c Added the ability for a file driver to store information in the superblock which would be needed if the file were opened again later for reading. The format is driver-defined which allows users to extend it however they like. ./doc/html/H5.format.html Added information about the new driver information block of the superblock. This is where file drivers store information they need in order to reopen the file later. ./src/H5F.c ./src/H5Fprivate.h ./src/H5FD.c ./src/H5FDprivate.h ./src/H5FDpublic.h ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDmpio.c ./src/H5FDsec2.c ./src/H5Fistore.c ./src/H5R.c The file access properties and the file access property list were decoupled, which allows the property list to more cleanly contain properties for various levels of the file and which allows the property list to be modified more cleanly when opening files. ./src/H5.c ./src/H5FDpublic.h Removed H5FD_MEM_META and H5FD_MEM_GROUP since they're never used. ./src/H5D.c Changed the way we detect the MPIO driver in all these special cases. ./src/H5F.c ./src/H5Rpublic.h ./test/tfile.c The default file sizeof(offset) was changed to be a function of haddr_t instead of hsize_t. THE H5RPUBLIC.H DEFINITIONS WILL HAVE PROBLEMS IF THE USER CREATES A FILE WITH NON-DEFAULT OFFSET AND SIZE SIZES! ./src/H5F.c Fixed an uninitialized memory access bug in file closing related to the VFL. ./src/H5T.c ./src/H5Tpublic.h Added an H5T_NATIVE_HADDR predefined datatype which corresponds to the `haddr_t' type. ./test/Makefile.in Reformatted long lines. ./test/big.c ./test/cmpd_dset.c ./test/dsets.c ./test/dtypes.c ./test/extend.c ./test/external.c Removed the H5F_ACC_DEBUG flag from file creation/open calls. ./test/big.c Plugged a memory leak. ./test/h5test.c Added support for the `multi' driver. Removed #warning about not having the stdio driver. Plans are to not implement it since the sec2 driver serves the same purpose and testing didn't show any difference in execution times between the two.
341 lines
10 KiB
C
341 lines
10 KiB
C
/****************************************************************************
|
||
* NCSA HDF *
|
||
* Software Development Group *
|
||
* National Center for Supercomputing Applications *
|
||
* University of Illinois at Urbana-Champaign *
|
||
* 605 E. Springfield, Champaign IL 61820 *
|
||
* *
|
||
* For conditions of distribution and use, see the accompanying *
|
||
* hdf/COPYING file. *
|
||
* *
|
||
****************************************************************************/
|
||
|
||
#ifdef RCSID
|
||
static char RcsId[] = "$Revision$";
|
||
#endif
|
||
|
||
/* $Id$ */
|
||
|
||
/***********************************************************
|
||
*
|
||
* Test program: tfile
|
||
*
|
||
* Test the low-level file I/O features.
|
||
*
|
||
*************************************************************/
|
||
|
||
#include <testhdf5.h>
|
||
|
||
#include <H5private.h>
|
||
#include <H5Bprivate.h>
|
||
#include <H5Pprivate.h>
|
||
|
||
#define F1_USERBLOCK_SIZE (hsize_t)0
|
||
#define F1_OFFSET_SIZE sizeof(haddr_t)
|
||
#define F1_LENGTH_SIZE sizeof(hsize_t)
|
||
#define F1_SYM_LEAF_K 4
|
||
#define F1_SYM_INTERN_K 16
|
||
#define FILE1 "tfile1.h5"
|
||
|
||
#define F2_USERBLOCK_SIZE (hsize_t)512
|
||
#define F2_OFFSET_SIZE 8
|
||
#define F2_LENGTH_SIZE 8
|
||
#define F2_SYM_LEAF_K 8
|
||
#define F2_SYM_INTERN_K 32
|
||
#define FILE2 "tfile2.h5"
|
||
|
||
#define F3_USERBLOCK_SIZE (hsize_t)0
|
||
#define F3_OFFSET_SIZE F2_OFFSET_SIZE
|
||
#define F3_LENGTH_SIZE F2_LENGTH_SIZE
|
||
#define F3_SYM_LEAF_K F2_SYM_LEAF_K
|
||
#define F3_SYM_INTERN_K F2_SYM_INTERN_K
|
||
#define FILE3 "tfile3.h5"
|
||
|
||
/****************************************************************
|
||
**
|
||
** test_file_create(): Low-level file creation I/O test routine.
|
||
**
|
||
****************************************************************/
|
||
static void
|
||
test_file_create(void)
|
||
{
|
||
hid_t fid1, fid2, fid3; /* HDF5 File IDs */
|
||
hid_t tmpl1, tmpl2; /*file creation templates */
|
||
hsize_t ublock; /*sizeof userblock */
|
||
size_t parm; /*file-creation parameters */
|
||
size_t parm2; /*file-creation parameters */
|
||
int iparm, iparm2;
|
||
herr_t ret; /*generic return value */
|
||
|
||
/* Output message about test being performed */
|
||
MESSAGE(5, ("Testing Low-Level File Creation I/O\n"));
|
||
|
||
/* Test create with various sequences of H5F_ACC_EXCL and */
|
||
/* H5F_ACC_TRUNC flags */
|
||
|
||
/* Create with H5F_ACC_EXCL */
|
||
/* First ensure the file does not exist */
|
||
remove(FILE1);
|
||
fid1 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
|
||
CHECK(fid1, FAIL, "H5Fcreate");
|
||
|
||
/*
|
||
* try to create the same file with H5F_ACC_TRUNC. This should fail
|
||
* because fid1 is the same file and is currently open.
|
||
*/
|
||
fid2 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
|
||
VERIFY(fid2, FAIL, "H5Fcreate");
|
||
|
||
/* Close all files */
|
||
ret = H5Fclose(fid1);
|
||
CHECK(ret, FAIL, "H5Fclose");
|
||
ret = H5Fclose(fid2);
|
||
VERIFY(ret, FAIL, "H5Fclose"); /*file should already be closed*/
|
||
|
||
/*
|
||
* Try again with H5F_ACC_EXCL. This should fail because the file already
|
||
* exists from the previous steps.
|
||
*/
|
||
fid1 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
|
||
VERIFY(fid1, FAIL, "H5Fcreate");
|
||
|
||
/* Test create with H5F_ACC_TRUNC. This will truncate the existing file. */
|
||
fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
|
||
CHECK(fid1, FAIL, "H5Fcreate");
|
||
|
||
/*
|
||
* Try to truncate first file again. This should fail because fid1 is the
|
||
* same file and is currently open.
|
||
*/
|
||
fid2 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
|
||
VERIFY(fid2, FAIL, "H5Fcreate");
|
||
|
||
/*
|
||
* Try with H5F_ACC_EXCL. This should fail too because the file already
|
||
* exists.
|
||
*/
|
||
fid2 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
|
||
VERIFY(fid2, FAIL, "H5Fcreate");
|
||
|
||
/* Get the file-creation template */
|
||
tmpl1 = H5Fget_create_plist(fid1);
|
||
CHECK(tmpl1, FAIL, "H5Fget_create_plist");
|
||
|
||
/* Get the file-creation parameters */
|
||
ret = H5Pget_userblock(tmpl1, &ublock);
|
||
CHECK(ret, FAIL, "H5Pget_userblock");
|
||
VERIFY(ublock, F1_USERBLOCK_SIZE, "H5Pget_userblock");
|
||
|
||
ret = H5Pget_sizes(tmpl1, &parm, &parm2);
|
||
CHECK(ret, FAIL, "H5Pget_sizes");
|
||
VERIFY(parm, F1_OFFSET_SIZE, "H5Pget_sizes");
|
||
VERIFY(parm2, F1_LENGTH_SIZE, "H5Pget_sizes");
|
||
|
||
ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2);
|
||
CHECK(ret, FAIL, "H5Pget_sym_k");
|
||
VERIFY(iparm, F1_SYM_INTERN_K, "H5Pget_sym_k");
|
||
VERIFY(iparm2, F1_SYM_LEAF_K, "H5Pget_sym_k");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl1);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
#ifdef LATER
|
||
/* Double-check that the atom has been vaporized */
|
||
ret = H5Pclose(tmpl1);
|
||
VERIFY(ret, FAIL, "H5Pclose");
|
||
#endif
|
||
|
||
/* Create a new file with a non-standard file-creation template */
|
||
tmpl1 = H5Pcreate(H5P_FILE_CREATE);
|
||
CHECK(tmpl1, FAIL, "H5Pnew");
|
||
|
||
/* Set the new file-creation parameters */
|
||
ret = H5Pset_userblock(tmpl1, F2_USERBLOCK_SIZE);
|
||
CHECK(ret, FAIL, "H5Pset_userblock");
|
||
|
||
ret = H5Pset_sizes(tmpl1, F2_OFFSET_SIZE, F2_LENGTH_SIZE);
|
||
CHECK(ret, FAIL, "H5Pset_sizes");
|
||
|
||
ret = H5Pset_sym_k(tmpl1, F2_SYM_INTERN_K, F2_SYM_LEAF_K);
|
||
CHECK(ret, FAIL, "H5Pset_sym_k");
|
||
|
||
/*
|
||
* Try to create second file, with non-standard file-creation template
|
||
* params.
|
||
*/
|
||
fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, tmpl1, H5P_DEFAULT);
|
||
CHECK(fid2, FAIL, "H5Fcreate");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl1);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
/* Get the file-creation template */
|
||
tmpl1 = H5Fget_create_plist(fid2);
|
||
CHECK(tmpl1, FAIL, "H5Fget_create_plist");
|
||
|
||
/* Get the file-creation parameters */
|
||
ret = H5Pget_userblock(tmpl1, &ublock);
|
||
CHECK(ret, FAIL, "H5Pget_userblock");
|
||
VERIFY(ublock, F2_USERBLOCK_SIZE, "H5Pget_userblock");
|
||
|
||
ret = H5Pget_sizes(tmpl1, &parm, &parm2);
|
||
CHECK(ret, FAIL, "H5Pget_sizes");
|
||
VERIFY(parm, F2_OFFSET_SIZE, "H5Pget_sizes");
|
||
VERIFY(parm2, F2_LENGTH_SIZE, "H5Pget_sizes");
|
||
|
||
ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2);
|
||
CHECK(ret, FAIL, "H5Pget_sym_k");
|
||
VERIFY(iparm, F2_SYM_INTERN_K, "H5Pget_sym_k");
|
||
VERIFY(iparm2, F2_SYM_LEAF_K, "H5Pget_sym_k");
|
||
|
||
/* Clone the file-creation template */
|
||
tmpl2 = H5Pcopy(tmpl1);
|
||
CHECK(tmpl2, FAIL, "H5Pcopy");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl1);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
/* Set the new file-creation parameter */
|
||
ret = H5Pset_userblock(tmpl2, F3_USERBLOCK_SIZE);
|
||
CHECK(ret, FAIL, "H5Pset_userblock");
|
||
|
||
/*
|
||
* Try to create second file, with non-standard file-creation template
|
||
* params
|
||
*/
|
||
fid3 = H5Fcreate(FILE3, H5F_ACC_TRUNC, tmpl2, H5P_DEFAULT);
|
||
CHECK(fid3, FAIL, "H5Fcreate");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl2);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
/* Get the file-creation template */
|
||
tmpl1 = H5Fget_create_plist(fid3);
|
||
CHECK(tmpl1, FAIL, "H5Fget_create_plist");
|
||
|
||
/* Get the file-creation parameters */
|
||
ret = H5Pget_userblock(tmpl1, &ublock);
|
||
CHECK(ret, FAIL, "H5Pget_userblock");
|
||
VERIFY(ublock, F3_USERBLOCK_SIZE, "H5Pget_userblock");
|
||
|
||
ret = H5Pget_sizes(tmpl1, &parm, &parm2);
|
||
CHECK(ret, FAIL, "H5Pget_sizes");
|
||
VERIFY(parm, F3_OFFSET_SIZE, "H5Pget_sizes");
|
||
VERIFY(parm2, F3_LENGTH_SIZE, "H5Pget_sizes");
|
||
|
||
ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2);
|
||
CHECK(ret, FAIL, "H5Pget_sym_k");
|
||
VERIFY(iparm, F3_SYM_INTERN_K, "H5Pget_sym_k");
|
||
VERIFY(iparm2, F3_SYM_LEAF_K, "H5Pget_sym_k");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl1);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
/* Close first file */
|
||
ret = H5Fclose(fid1);
|
||
CHECK(ret, FAIL, "H5Fclose");
|
||
|
||
/* Close second file */
|
||
ret = H5Fclose(fid2);
|
||
CHECK(ret, FAIL, "H5Fclose");
|
||
|
||
/* Close third file */
|
||
ret = H5Fclose(fid3);
|
||
CHECK(ret, FAIL, "H5Fclose");
|
||
} /* test_file_create() */
|
||
|
||
/****************************************************************
|
||
**
|
||
** test_file_open(): Low-level file open I/O test routine.
|
||
**
|
||
****************************************************************/
|
||
static void
|
||
test_file_open(void)
|
||
{
|
||
hid_t fid1; /*HDF5 File IDs */
|
||
hid_t tmpl1; /*file creation templates */
|
||
hsize_t ublock; /*sizeof user block */
|
||
size_t parm; /*file-creation parameters */
|
||
size_t parm2; /*file-creation parameters */
|
||
int iparm, iparm2;
|
||
herr_t ret; /*generic return value */
|
||
|
||
/* Output message about test being performed */
|
||
MESSAGE(5, ("Testing Low-Level File Opening I/O\n"));
|
||
|
||
/* Open first file */
|
||
fid1 = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT);
|
||
CHECK(fid1, FAIL, "H5Fopen");
|
||
|
||
/* Get the file-creation template */
|
||
tmpl1 = H5Fget_create_plist(fid1);
|
||
CHECK(tmpl1, FAIL, "H5Fget_create_plist");
|
||
|
||
/* Get the file-creation parameters */
|
||
ret = H5Pget_userblock(tmpl1, &ublock);
|
||
CHECK(ret, FAIL, "H5Pget_userblock");
|
||
VERIFY(ublock, F2_USERBLOCK_SIZE, "H5Pget_userblock");
|
||
|
||
ret = H5Pget_sizes(tmpl1, &parm, &parm2);
|
||
CHECK(ret, FAIL, "H5Pget_sizes");
|
||
VERIFY(parm, F2_OFFSET_SIZE, "H5Pget_sizes");
|
||
VERIFY(parm2, F2_LENGTH_SIZE, "H5Pget_sizes");
|
||
|
||
ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2);
|
||
CHECK(ret, FAIL, "H5Pget_sym_k");
|
||
VERIFY(iparm, F2_SYM_INTERN_K, "H5Pget_sym_k");
|
||
VERIFY(iparm2, F2_SYM_LEAF_K, "H5Pget_sym_k");
|
||
|
||
/* Release file-creation template */
|
||
ret = H5Pclose(tmpl1);
|
||
CHECK(ret, FAIL, "H5Pclose");
|
||
|
||
/* Close first file */
|
||
ret = H5Fclose(fid1);
|
||
CHECK(ret, FAIL, "H5Fclose");
|
||
} /* test_file_open() */
|
||
|
||
/****************************************************************
|
||
**
|
||
** test_file(): Main low-level file I/O test routine.
|
||
**
|
||
****************************************************************/
|
||
void
|
||
test_file(void)
|
||
{
|
||
/* Output message about test being performed */
|
||
MESSAGE(5, ("Testing Low-Level File I/O\n"));
|
||
|
||
test_file_create(); /* Test file creation (also creation templates) */
|
||
test_file_open(); /* Test file opening */
|
||
} /* test_file() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: cleanup_file
|
||
*
|
||
* Purpose: Cleanup temporary test files
|
||
*
|
||
* Return: none
|
||
*
|
||
* Programmer: Albert Cheng
|
||
* July 2, 1998
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
void
|
||
cleanup_file(void)
|
||
{
|
||
remove(FILE1);
|
||
remove(FILE2);
|
||
remove(FILE3);
|
||
}
|
||
|