diff options
Diffstat (limited to 'tools/test/h5dump/h5dumpgentest.c')
-rw-r--r-- | tools/test/h5dump/h5dumpgentest.c | 677 |
1 files changed, 677 insertions, 0 deletions
diff --git a/tools/test/h5dump/h5dumpgentest.c b/tools/test/h5dump/h5dumpgentest.c index 30e0c46..08f241c 100644 --- a/tools/test/h5dump/h5dumpgentest.c +++ b/tools/test/h5dump/h5dumpgentest.c @@ -117,6 +117,13 @@ #define FILE87 "tintsnodata.h5" #define FILE88 "tldouble_scalar.h5" #define FILE89 "tfloatsattrs.h5" +#define FILE90 "tst_onion_dset_1d.h5" +#define FILE91 "tst_onion_objs.h5" +#define FILE92 "tst_onion_dset_ext.h5" + +#define ONION_TEST_FIXNAME_SIZE 1024 +#define ONION_TEST_PAGE_SIZE (uint32_t)32 +#define ONE_DIM_SIZE 16 /*------------------------------------------------------------------------- * prototypes @@ -11350,6 +11357,671 @@ error: H5E_END_TRY; } /* gen_err_attr_dspace() */ +/* Structure to collect the onion filepaths in one place. */ +struct onion_filepaths { + char *canon; + char *onion; + char *recovery; +}; + +/* Allocate and populate filepaths with h5_fixname'd strings as appropriate. + * Should be released with onion_filepaths_destroy() when done. + */ +static struct onion_filepaths * +onion_filepaths_init(const char *basename) +{ + struct onion_filepaths *paths = NULL; + + if (NULL == (paths = HDcalloc(1, sizeof(struct onion_filepaths)))) + goto error; + + if (NULL == (paths->canon = HDstrdup(basename))) + goto error; + + if (NULL == (paths->onion = HDmalloc(sizeof(char) * ONION_TEST_FIXNAME_SIZE))) + goto error; + HDsnprintf(paths->onion, ONION_TEST_FIXNAME_SIZE, "%s.onion", paths->canon); + + if (NULL == (paths->recovery = HDmalloc(sizeof(char) * ONION_TEST_FIXNAME_SIZE))) + goto error; + HDsnprintf(paths->recovery, ONION_TEST_FIXNAME_SIZE, "%s.onion.recovery", paths->canon); + + return paths; + +error: + if (paths != NULL) { + HDfree(paths->canon); + HDfree(paths->onion); + HDfree(paths->recovery); + HDfree(paths); + } + return NULL; +} + +static void +onion_filepaths_destroy(struct onion_filepaths *s) +{ + if (s) { + HDfree(s->canon); + HDfree(s->onion); + HDfree(s->recovery); + HDfree(s); + } +} + +static int +gent_onion_1d_dset(void) +{ + hid_t file_id = H5I_INVALID_HID; + hid_t file = H5I_INVALID_HID; + hid_t space = H5I_INVALID_HID; + hid_t dset = H5I_INVALID_HID; + hid_t dcpl = H5I_INVALID_HID; + hid_t fapl_id = H5I_INVALID_HID; + struct onion_filepaths *paths = NULL; + H5FD_onion_fapl_info_t onion_info = { + H5FD_ONION_FAPL_INFO_VERSION_CURR, + H5I_INVALID_HID, /* backing_fapl_id */ + ONION_TEST_PAGE_SIZE, /* page_size */ + H5FD_ONION_STORE_TARGET_ONION, /* store_target */ + H5FD_ONION_FAPL_INFO_REVISION_ID_LATEST, + 0, /* force_write_open */ + 0, /* creation flags, was H5FD_ONION_FAPL_INFO_CREATE_FLAG_ENABLE_PAGE_ALIGNMENT */ + "initial commit" /* comment */ + }; + hsize_t dims[2] = {1, ONE_DIM_SIZE}; + hsize_t maxdims[2] = {1, ONE_DIM_SIZE}; + int wdata[1][ONE_DIM_SIZE]; + int fillval; + + /* Setup */ + onion_info.backing_fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + goto error; + if (H5Pset_fapl_onion(fapl_id, &onion_info) < 0) + goto error; + + if ((paths = onion_filepaths_init(FILE90)) == NULL) + goto error; + + /*---------------------------------------------------------------------- + * Create the skeleton file (create the file without Onion VFD) + *---------------------------------------------------------------------- + */ + /* Initialize data */ + for (int i = 0; i < ONE_DIM_SIZE; i++) + wdata[0][i] = i; + + /* Create a new file using the default properties */ + if ((file = H5Fcreate(paths->canon, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + goto error; + + /* Create dataspace with unlimited dimensions */ + if ((space = H5Screate_simple(2, dims, maxdims)) < 0) + goto error; + + /* Create the dataset creation property list */ + if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) + goto error; + + /* Set the fill value for the dataset */ + fillval = 99; + if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0) + goto error; + + /* Set the allocation time to "early". This way we can be sure + * that reading from the dataset immediately after creation will + * return the fill value. + */ + if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) + goto error; + + /* Create the dataset using the dataset creation property list */ + if ((dset = H5Dcreate2(file, "DS1", H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + goto error; + + /* Write the data to the dataset */ + if (H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]) < 0) + goto error; + + /* Close and release resources */ + if (H5Pclose(dcpl) < 0) + goto error; + if (H5Dclose(dset) < 0) + goto error; + if (H5Sclose(space) < 0) + goto error; + if (H5Fclose(file) < 0) + goto error; + + /*---------------------------------------------------------------------- + * First revision: open the file with Onion VFD and change the data + *---------------------------------------------------------------------- + */ + if ((file_id = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if ((dset = H5Dopen2(file_id, "DS1", H5P_DEFAULT)) < 0) + goto error; + + int dset_data[1][ONE_DIM_SIZE]; + for (int i = 0; i < ONE_DIM_SIZE; i++) + dset_data[0][i] = i + ONE_DIM_SIZE; + + if (H5Dwrite(dset, H5T_STD_I32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + if (H5Fclose(file_id) < 0) + goto error; + + /*---------------------------------------------------------------------- + * Second revision: open the file with Onion VFD and change the data + *---------------------------------------------------------------------- + */ + if ((file_id = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if ((dset = H5Dopen2(file_id, "DS1", H5P_DEFAULT)) < 0) + goto error; + + for (int i = 0; i < ONE_DIM_SIZE; i++) + dset_data[0][i] = i + 2048; + + if (H5Dwrite(dset, H5T_STD_I32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data) < 0) + goto error; + + /* CLEANUP */ + if (H5Dclose(dset) < 0) + goto error; + dset = H5I_INVALID_HID; + if (H5Fclose(file_id) < 0) + goto error; + file_id = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Third revision: open the file with Onion VFD and change the data + *---------------------------------------------------------------------- + */ + if ((file_id = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if ((dset = H5Dopen2(file_id, "DS1", H5P_DEFAULT)) < 0) + goto error; + + for (int i = 0; i < ONE_DIM_SIZE; i += 20) + dset_data[0][i] = i + 3072; + + if (H5Dwrite(dset, H5T_STD_I32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data) < 0) + goto error; + + /* CLEANUP */ + if (H5Dclose(dset) < 0) + goto error; + if (H5Fclose(file_id) < 0) + goto error; + if (H5Pclose(fapl_id) < 0) + goto error; + if (H5Pclose(onion_info.backing_fapl_id) < 0) + goto error; + + onion_filepaths_destroy(paths); + + return 0; + +error: + H5E_BEGIN_TRY + { + H5Pclose(onion_info.backing_fapl_id); + H5Pclose(fapl_id); + H5Dclose(dset); + H5Sclose(space); + H5Fclose(file_id); + } + H5E_END_TRY; + + return -1; +} /* gent_onion_1d_dset */ + +static int +gent_onion_create_delete_objects(void) +{ + struct onion_filepaths *paths = NULL; + + H5FD_onion_fapl_info_t onion_info = { + H5FD_ONION_FAPL_INFO_VERSION_CURR, + H5I_INVALID_HID, /* backing_fapl_id */ + ONION_TEST_PAGE_SIZE, /* page_size */ + H5FD_ONION_STORE_TARGET_ONION, /* store_target */ + H5FD_ONION_FAPL_INFO_REVISION_ID_LATEST, + 0, /* force_write_open */ + 0, /* creation flags, was H5FD_ONION_FAPL_INFO_CREATE_FLAG_ENABLE_PAGE_ALIGNMENT */ + "initial commit" /* comment */ + }; + + hid_t fapl_id = H5I_INVALID_HID; + hid_t group_id = H5I_INVALID_HID; + hid_t attr_space_id = H5I_INVALID_HID; + hid_t attr_id = H5I_INVALID_HID; + hid_t file = H5I_INVALID_HID; + hid_t space = H5I_INVALID_HID; + hid_t dset = H5I_INVALID_HID; + hid_t dcpl = H5I_INVALID_HID; + + hsize_t attr_dim[1] = {4}; + hsize_t dims[2] = {4, 4}; + hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; + hsize_t chunk[2] = {4, 4}; + int wdata[4][4]; + + int fillval; + + /* Set up */ + if ((onion_info.backing_fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + goto error; + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + goto error; + if (H5Pset_fapl_onion(fapl_id, &onion_info) < 0) + goto error; + + if ((paths = onion_filepaths_init(FILE91)) == NULL) + goto error; + + /*---------------------------------------------------------------------- + * Create the skeleton file (create the file without Onion VFD) + *---------------------------------------------------------------------- + */ + + /* + * Initialize data. + */ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + wdata[i][j] = i + j; + + /* + * Create a new file using the default properties. + */ + if ((file = H5Fcreate(paths->canon, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + goto error; + + /* + * Create dataspace with unlimited dimensions. + */ + if ((space = H5Screate_simple(2, dims, maxdims)) < 0) + goto error; + + /* + * Create the dataset creation property list, and set the chunk + * size. + */ + if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) + goto error; + if (H5Pset_chunk(dcpl, 2, chunk) < 0) + goto error; + + /* + * Set the fill value for the dataset. + */ + fillval = 99; + if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0) + goto error; + + /* + * Set the allocation time to "early". This way we can be sure + * that reading from the dataset immediately after creation will + * return the fill value. + */ + if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) + goto error; + + /* + * Create the dataset using the dataset creation property list. + */ + if ((dset = H5Dcreate2(file, "DS1", H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + goto error; + + /* + * Write the data to the dataset. + */ + if (H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + if (H5Fclose(file) < 0) + goto error; + + /*---------------------------------------------------------------------- + * First revision: open the file with Onion VFD and add a dataset (DS2) to the file + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + /* + * Create the dataset using the dataset creation property list. + */ + if ((dset = H5Dcreate2(file, "DS2", H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + goto error; + + /* + * Write the data to the dataset. + */ + if (H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + dset = H5I_INVALID_HID; + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Second revision: open the file with Onion VFD and remove the dataset (DS2), + * which was added during the first revision. + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if (H5Ldelete(file, "DS2", H5P_DEFAULT) < 0) + goto error; + + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Third revision: open the file with Onion VFD and add an attribute to the file + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + /* Create dataspace for attribute */ + attr_space_id = H5Screate_simple(1, attr_dim, NULL); + + if ((attr_id = + H5Acreate2(file, "file_attribute", H5T_STD_I32LE, attr_space_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) + goto error; + + if (H5Sclose(attr_space_id) < 0) + goto error; + if (H5Aclose(attr_id) < 0) + goto error; + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Fourth revision: open the file with Onion VFD and delete the attribute + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if (H5Adelete(file, "file_attribute") < 0) + goto error; + + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Fifth revision: open the file with Onion VFD and add a group to the file + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if ((group_id = H5Gcreate2(file, "new_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) + goto error; + + if (H5Gclose(group_id) < 0) + goto error; + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Sixth revision: open the file with Onion VFD and delete the newly added group + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + if (H5Ldelete(file, "new_group", H5P_DEFAULT) < 0) + goto error; + + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /* + * Close and release resources. + */ + if (H5Pclose(onion_info.backing_fapl_id) < 0) + goto error; + if (H5Pclose(fapl_id) < 0) + goto error; + if (H5Pclose(dcpl) < 0) + goto error; + if (H5Sclose(space) < 0) + goto error; + + onion_filepaths_destroy(paths); + + return 0; +error: + + if (paths != NULL) { + HDremove(paths->canon); + HDremove(paths->onion); + HDremove(paths->recovery); + onion_filepaths_destroy(paths); + } + + if (dset != H5I_INVALID_HID) + (void)H5Dclose(dset); + if (file != H5I_INVALID_HID) + (void)H5Fclose(file); + if (fapl_id != H5I_INVALID_HID) + (void)H5Pclose(fapl_id); + if (onion_info.backing_fapl_id != H5I_INVALID_HID) + H5Pclose(onion_info.backing_fapl_id); + + return -1; +} /* gent_onion_create_delete_objects */ + +static int +gent_onion_dset_extension(void) +{ + hid_t fapl_id = H5I_INVALID_HID; + hid_t file = H5I_INVALID_HID; + hid_t space = H5I_INVALID_HID; + hid_t dset_space = H5I_INVALID_HID; + hid_t dset = H5I_INVALID_HID; + hid_t dcpl = H5I_INVALID_HID; + struct onion_filepaths *paths = NULL; + H5FD_onion_fapl_info_t onion_info = { + H5FD_ONION_FAPL_INFO_VERSION_CURR, + H5I_INVALID_HID, /* backing_fapl_id */ + ONION_TEST_PAGE_SIZE, /* page_size */ + H5FD_ONION_STORE_TARGET_ONION, /* store_target */ + H5FD_ONION_FAPL_INFO_REVISION_ID_LATEST, + 0, /* force_write_open */ + 0, /* creation flags, was H5FD_ONION_FAPL_INFO_CREATE_FLAG_ENABLE_PAGE_ALIGNMENT */ + "initial commit" /* comment */ + }; + hsize_t dims[2] = {4, 4}; + hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; + hsize_t chunk[2] = {4, 4}; + hsize_t size[2]; + hsize_t offset[2]; + int wdata[4][4]; /* Write buffer */ + int fillval; + + /* Setup */ + if ((onion_info.backing_fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + goto error; + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + goto error; + + if (H5Pset_fapl_onion(fapl_id, &onion_info) < 0) + goto error; + + if ((paths = onion_filepaths_init(FILE92)) == NULL) + goto error; + + /*---------------------------------------------------------------------- + * Create the skeleton file (create the file without Onion VFD) + *---------------------------------------------------------------------- + */ + /* Initialize data */ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + wdata[i][j] = i + j; + + /* Create a new file using the default properties */ + if ((file = H5Fcreate(paths->canon, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + goto error; + + /* Create dataspace with unlimited dimensions */ + if ((space = H5Screate_simple(2, dims, maxdims)) < 0) + goto error; + + /* Create the dataset creation property list, and set the chunk + * size. + */ + if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) + goto error; + if (H5Pset_chunk(dcpl, 2, chunk) < 0) + goto error; + + /* Set the fill value for the dataset */ + fillval = 99; + if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0) + goto error; + + /* Set the allocation time to "early". This way we can be sure + * that reading from the dataset immediately after creation will + * return the fill value. + */ + if (H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) + goto error; + + /* Create the dataset using the dataset creation property list */ + if ((dset = H5Dcreate2(file, "DS1", H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + goto error; + + /* Write the data to the dataset */ + if (H5Dwrite(dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + if (H5Fclose(file) < 0) + goto error; + + /*---------------------------------------------------------------------- + * First revision: open the file with Onion VFD and extend the dataset + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + /* Open the dataset */ + if ((dset = H5Dopen2(file, "DS1", H5P_DEFAULT)) < 0) + goto error; + + /* Extend the dataset and double the rows */ + size[0] = 2 * dims[0]; + size[1] = dims[1]; + if (H5Dset_extent(dset, size) < 0) + goto error; + + if ((dset_space = H5Dget_space(dset)) < 0) + goto error; + + offset[0] = dims[0]; + offset[1] = 0; + if (H5Sselect_hyperslab(dset_space, H5S_SELECT_SET, offset, NULL, dims, NULL) < 0) + goto error; + + /* Write the data to the dataset. */ + if (H5Dwrite(dset, H5T_NATIVE_INT, space, dset_space, H5P_DEFAULT, wdata) < 0) + goto error; + + if (H5Sclose(dset_space) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + dset = H5I_INVALID_HID; + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /*---------------------------------------------------------------------- + * Second revision: open the file with Onion VFD and shrink the dataset + *---------------------------------------------------------------------- + */ + if ((file = H5Fopen(paths->canon, H5F_ACC_RDWR, fapl_id)) < 0) + goto error; + + /* Open the dataset */ + if ((dset = H5Dopen2(file, "DS1", H5P_DEFAULT)) < 0) + goto error; + + /* Extend the dataset and shrink back the size */ + if (H5Dset_extent(dset, dims) < 0) + goto error; + + if (H5Dclose(dset) < 0) + goto error; + dset = H5I_INVALID_HID; + if (H5Fclose(file) < 0) + goto error; + file = H5I_INVALID_HID; + + /* Close and release resources. */ + if (H5Pclose(onion_info.backing_fapl_id) < 0) + goto error; + if (H5Pclose(fapl_id) < 0) + goto error; + if (H5Pclose(dcpl) < 0) + goto error; + if (H5Sclose(space) < 0) + goto error; + + onion_filepaths_destroy(paths); + + return 0; +error: + + if (paths != NULL) { + HDremove(paths->canon); + HDremove(paths->onion); + HDremove(paths->recovery); + onion_filepaths_destroy(paths); + } + + H5E_BEGIN_TRY + { + H5Dclose(dset); + H5Fclose(file); + H5Pclose(fapl_id); + H5Pclose(onion_info.backing_fapl_id); + } + H5E_END_TRY; + + return -1; +} /* gent_onion_dset_extension */ + int main(void) { @@ -11449,5 +12121,10 @@ main(void) gent_err_attr_dspace(); + /* Generate the files for testing Onion VFD */ + gent_onion_1d_dset(); + gent_onion_create_delete_objects(); + gent_onion_dset_extension(); + return 0; } |