-
Notifications
You must be signed in to change notification settings - Fork 262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support SWMR in HDF5 #1448
base: main
Are you sure you want to change the base?
Support SWMR in HDF5 #1448
Changes from all commits
633182a
757207f
ba9362a
932d6e0
f0f3543
cd4cd05
9a4e0b5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -51,6 +51,10 @@ nc4_create_file(const char *path, int cmode, size_t initialsz, | |
NC_HDF5_FILE_INFO_T *hdf5_info; | ||
NC_HDF5_GRP_INFO_T *hdf5_grp; | ||
|
||
#ifdef HAVE_H5PSET_LIBVER_BOUNDS | ||
H5F_libver_t low, high; | ||
#endif | ||
|
||
#ifdef USE_PARALLEL4 | ||
NC_MPI_INFO *mpiinfo = NULL; | ||
MPI_Comm comm; | ||
|
@@ -105,6 +109,13 @@ nc4_create_file(const char *path, int cmode, size_t initialsz, | |
else | ||
flags = H5F_ACC_TRUNC; | ||
|
||
#ifdef HDF5_HAS_SWMR | ||
#ifndef HAVE_H5PSET_LIBVER_BOUNDS | ||
if (cmode & NC_HDF5_SWMR) | ||
flags |= H5F_ACC_SWMR_WRITE; | ||
#endif | ||
#endif | ||
|
||
/* If this file already exists, and NC_NOCLOBBER is specified, | ||
return an error (unless diskless|inmemory) */ | ||
if (!nc4_info->mem.diskless && !nc4_info->mem.inmemory) { | ||
|
@@ -158,12 +169,20 @@ nc4_create_file(const char *path, int cmode, size_t initialsz, | |
|
||
#ifdef HAVE_H5PSET_LIBVER_BOUNDS | ||
#if H5_VERSION_GE(1,10,2) | ||
if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, H5F_LIBVER_V18) < 0) | ||
low = H5F_LIBVER_EARLIEST; | ||
high = H5F_LIBVER_V18; | ||
#ifdef HDF5_HAS_SWMR | ||
if ((cmode & NC_HDF5_SWMR)) { | ||
low = H5F_LIBVER_LATEST; | ||
high = H5F_LIBVER_LATEST; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will this create files that are unreadable by older versions of HDF5? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that the files will be unreadable with 1.8.X clients. Here is a blurb from 1.10.2 release notes:
|
||
} | ||
#endif /* HDF5_HAS_SWMR */ | ||
#else | ||
if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, | ||
H5F_LIBVER_LATEST) < 0) | ||
low = H5F_LIBVER_EARLIEST; | ||
high = H5F_LIBVER_LATEST; | ||
#endif | ||
BAIL(NC_EHDFERR); | ||
if (H5Pset_libver_bounds(fapl_id, low, high) < 0) | ||
BAIL(NC_EHDFERR); | ||
#endif | ||
|
||
/* Create the property list. */ | ||
|
@@ -238,6 +257,14 @@ nc4_create_file(const char *path, int cmode, size_t initialsz, | |
if ((retval = NC4_new_provenance(nc4_info))) | ||
BAIL(retval); | ||
|
||
#ifdef HDF5_HAS_SWMR | ||
if ((cmode & NC_HDF5_SWMR)) { | ||
/* Prepare for single writer multiple readers */ | ||
if ((retval = H5Fstart_swmr_write(hdf5_info->hdfid))) | ||
BAIL(retval); | ||
} | ||
#endif | ||
|
||
return NC_NOERR; | ||
|
||
exit: /*failure exit*/ | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -292,6 +292,79 @@ main(int argc, char **argv) | |
if (nc_close(ncid)) ERR; | ||
} | ||
SUMMARIZE_ERR; | ||
#ifdef HDF5_HAS_SWMR | ||
printf("*** testing HDF5 SWMR..."); | ||
{ | ||
#define DATA_LEN 3 | ||
|
||
int ncid, ncid2, varid, dimids[2]; | ||
size_t time_len, beam_len; | ||
int i; | ||
int values[DATA_LEN]; | ||
size_t start[2] = {0,0}, count[2] = {1, DATA_LEN}; | ||
|
||
/* Initialize some phony data. */ | ||
for (i = 0; i < DATA_LEN; i++) | ||
values[i] = DATA_LEN*2 - i; | ||
|
||
/* Create a file in SWMR mode for writing, create structure and close. */ | ||
if (nc_create(FILE_NAME, NC_NETCDF4|NC_HDF5_SWMR, &ncid)) ERR; | ||
if (nc_def_dim(ncid, "time", NC_UNLIMITED, &dimids[0])) ERR; | ||
if (nc_def_dim(ncid, "beam", NC_UNLIMITED, &dimids[1])) ERR; | ||
if (nc_def_var(ncid, "depth", NC_INT, 2, dimids, &varid)) ERR; | ||
if (nc_close(ncid)) ERR; | ||
|
||
/* Open the file for SWMR reading and close. */ | ||
if (nc_open(FILE_NAME, NC_HDF5_SWMR, &ncid)) ERR; | ||
if (nc_close(ncid)) ERR; | ||
|
||
/* Open the file for SWMR writing, append data, and close. */ | ||
if (nc_open(FILE_NAME, NC_WRITE|NC_HDF5_SWMR, &ncid)) ERR; | ||
if (nc_inq_varid(ncid, "depth", &varid)) ERR; | ||
if (nc_put_vara_int(ncid, varid, start, count, values)) ERR; | ||
if (nc_inq_dimlen(ncid, dimids[0], &time_len)) ERR; | ||
if (time_len != 1) ERR; | ||
if (nc_inq_dimlen(ncid, dimids[1], &beam_len)) ERR; | ||
if (beam_len != DATA_LEN) ERR; | ||
if (nc_close(ncid)) ERR; | ||
|
||
/* Open the file for SWMR reading, verify data, and close. */ | ||
if (nc_open(FILE_NAME, NC_HDF5_SWMR, &ncid)) ERR; | ||
if (nc_inq_varid(ncid, "depth", &varid)) ERR; | ||
if (nc_put_vara_int(ncid, varid, start, count, values) == 0) ERR; // Writing should fail | ||
if (nc_inq_dimlen(ncid, dimids[0], &time_len)) ERR; | ||
if (time_len != 1) ERR; | ||
if (nc_inq_dimlen(ncid, dimids[1], &beam_len)) ERR; | ||
if (beam_len != DATA_LEN) ERR; | ||
if (nc_close(ncid)) ERR; | ||
|
||
/* Append data to the file from one writer (ncid1) and verify from a reader (ncid2) */ | ||
if (nc_open(FILE_NAME, NC_WRITE|NC_HDF5_SWMR, &ncid)) ERR; | ||
if (nc_open(FILE_NAME, NC_HDF5_SWMR, &ncid2)) ERR; | ||
|
||
// Verify length of time dimension == 1 in both reader and writer | ||
if (nc_inq_dimlen(ncid, dimids[0], &time_len)) ERR; | ||
if (time_len != 1) ERR; | ||
if (nc_inq_dimlen(ncid2, dimids[0], &time_len)) ERR; | ||
if (time_len != 1) ERR; | ||
|
||
// Append data | ||
start[0] = 1; start[1] = 0; | ||
if (nc_inq_varid(ncid, "depth", &varid)) ERR; | ||
if (nc_put_vara_int(ncid, varid, start, count, values)) ERR; | ||
|
||
// Verify length of time dimension == 2 in both reader and writer | ||
if (nc_inq_dimlen(ncid, dimids[0], &time_len)) ERR; | ||
if (time_len != 2) ERR; | ||
if (nc_inq_dimlen(ncid2, dimids[0], &time_len)) ERR; | ||
if (time_len != 2) ERR; | ||
|
||
if (nc_close(ncid)) ERR; | ||
if (nc_close(ncid2)) ERR; | ||
|
||
} | ||
SUMMARIZE_ERR; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Excellent test, thanks! |
||
#endif /* HDF_HAS_SWMR */ | ||
printf("*** testing CLASSIC_MODEL flag with classic formats..."); | ||
{ | ||
int ncid; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we ever not have H5PSET_LIBVER_BOUNDS?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was introduced in HDF5-1.8.0