hdf5/testpar/t_chunk_alloc.c
Albert Cheng c12eeffd9f [svn-r11349] Purpose:
Bug fix.

Description:
Some tests showed the filesize was not as expected.  But the error was
intermittent.  This was a racing condition as some processes finish
extend_chunked_dataset() sooner than others and return to the main
body which proceeds to call the next test which also uses the same
test data file and alters it.  That messes up the "slower" processes
which then see unexpected filesize.

Also, the routine create_chunked_dataset() which creates test data file
actually was executed by all processes.  That is wrong.

Solution:
Added a barrier at the end of extend_chunked_dataset to make sure all
processes are done with the test data file before returning.

Changed create_chunked_dataset such that only one process would create
the test data file.  The rest does nothing but just wait for it to finish.

Platforms tested:
Tested in TG-NCSA in which the errors were detected.

Misc. update:
2005-09-05 15:23:02 -05:00

194 lines
6.1 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by the Board of Trustees of the University of Illinois. *
* 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 files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* This verifies if the storage space allocation methods are compatible between
* serial and parallel modes.
*
* Created by: Christian Chilan and Albert Cheng
* Date: 2005/07/05
*/
#include "testphdf5.h"
static int mpi_size, mpi_rank;
#define DATASETNAME "ExtendibleArray"
#define CHUNKSIZE 1000 /* #elements per chunk */
#define DSETSIZE 20000*CHUNKSIZE
static MPI_Offset
get_filesize(const char *filename)
{
int mpierr;
MPI_File fd;
MPI_Offset filesize;
mpierr = MPI_File_open(MPI_COMM_SELF, (char*)filename, MPI_MODE_RDONLY,
MPI_INFO_NULL, &fd);
VRFY((mpierr == MPI_SUCCESS), "");
mpierr = MPI_File_get_size(fd, &filesize);
VRFY((mpierr == MPI_SUCCESS), "");
mpierr = MPI_File_close(&fd);
VRFY((mpierr == MPI_SUCCESS), "");
return(filesize);
}
/*
* This creates a dataset serially with 20000 chunks, each of 1000
* elements. It does not perform any writing on it. Another routine
* will open this in parallel for extension test.
*/
void
create_chunked_dataset(const char *filename)
{
hid_t file; /* handles */
hid_t dataspace, dataset;
hid_t cparms;
hsize_t dims[1] = {DSETSIZE}; /* dataset dimensions
at creation time */
hsize_t maxdims[1] = {H5S_UNLIMITED};
herr_t hrc;
/* Variables used in reading data back */
hsize_t chunk_dims[1] ={CHUNKSIZE};
/* set up MPI parameters */
MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank);
/* Only MAINPROCESS should create the file. Others just wait. */
if (MAINPROCESS){
/* Create the data space with unlimited dimensions. */
dataspace = H5Screate_simple (1, dims, maxdims);
VRFY((dataspace >= 0), "");
/* Create a new file. If file exists its contents will be overwritten. */
file = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
VRFY((file >= 0), "");
/* Modify dataset creation properties, i.e. enable chunking */
cparms = H5Pcreate (H5P_DATASET_CREATE);
VRFY((cparms >= 0), "");
hrc = H5Pset_chunk ( cparms, 1, chunk_dims);
VRFY((hrc >= 0), "");
/* Create a new dataset within the file using cparms creation properties. */
dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, dataspace, cparms);
VRFY((dataset >= 0), "");
/* Close resources */
hrc = H5Dclose (dataset);
VRFY((hrc >= 0), "");
hrc = H5Fclose (file);
VRFY((hrc >= 0), "");
}
/* Make sure all processes are done before exiting this routine. Otherwise,
* other tests may start and change the test data file before some processes
* of this test are still accessing the file.
*/
MPI_Barrier(MPI_COMM_WORLD);
}
/*
* This program extends the size of a small dataset to 20000 chunks (each of
* 1000 elements) in parallel. The dataset was initially created in a serial
* environment. A correct extend operation should increase the file size
* considerably.
*/
void
extend_chunked_dataset(const char *filename)
{
/* HDF5 gubbins */
hid_t file_id, dataset; /* HDF5 file identifier */
hid_t access_plist; /* HDF5 ID for file access property list */
herr_t hrc; /* HDF5 return code */
hsize_t size[1];
/* MPI Gubbins */
MPI_Offset filesize, /* actual file size */
est_filesize; /* estimated file size */
int mpierr;
/* Initialize MPI */
MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank);
/* Set up MPIO file access property lists */
access_plist = H5Pcreate(H5P_FILE_ACCESS);
VRFY((access_plist >= 0), "");
hrc = H5Pset_fapl_mpio(access_plist, MPI_COMM_WORLD, MPI_INFO_NULL);
VRFY((hrc >= 0), "");
/* Open the file */
file_id = H5Fopen(filename, H5F_ACC_RDWR, access_plist);
VRFY((file_id >= 0), "");
/* Open dataset*/
dataset = H5Dopen(file_id, DATASETNAME);
VRFY((dataset >= 0), "");
#if 0
size[0] = DSETSIZE;
/* Extend dataset*/
hrc = H5Dextend(dataset, size);
VRFY((hrc >= 0), "");
#endif
/* Close up */
hrc = H5Dclose(dataset);
VRFY((hrc >= 0), "");
hrc = H5Fclose(file_id);
VRFY((hrc >= 0), "");
/* verify file size has grown */
filesize = get_filesize(filename);
est_filesize = DSETSIZE*sizeof(H5T_NATIVE_INT);
VRFY((filesize>=est_filesize), "file size check");
/* Can close some plists */
hrc = H5Pclose(access_plist);
VRFY((hrc >= 0), "");
/* Make sure all processes are done before exiting this routine. Otherwise,
* other tests may start and change the test data file before some processes
* of this test are still accessing the file.
*/
MPI_Barrier(MPI_COMM_WORLD);
}
void
test_chunk_alloc(void)
{
const char *filename;
filename = GetTestParameters();
if (VERBOSE_MED)
printf("Extend Chunked allocation test on file %s\n", filename);
/* create the datafile first */
create_chunked_dataset(filename);
/* reopen it in parallel and extend it. */
extend_chunked_dataset(filename);
}