diff options
author | Vailin Choi <vchoi@jam.ad.hdfgroup.org> | 2018-10-22 18:43:55 (GMT) |
---|---|---|
committer | Vailin Choi <vchoi@jam.ad.hdfgroup.org> | 2018-10-22 18:43:55 (GMT) |
commit | a1bd33ad083351ad8bbb26d45c2625059b55dc63 (patch) | |
tree | cb5f68a2ebb52fba99d18367638135b1be77be91 /test/vfd_swmr.c | |
parent | 5c7ca8afff0e635f12652c35dbe9818235ac34c4 (diff) | |
download | hdf5-a1bd33ad083351ad8bbb26d45c2625059b55dc63.zip hdf5-a1bd33ad083351ad8bbb26d45c2625059b55dc63.tar.gz hdf5-a1bd33ad083351ad8bbb26d45c2625059b55dc63.tar.bz2 |
(1) Add tests for VFD SWMR writer
(2) Bug fixes
Diffstat (limited to 'test/vfd_swmr.c')
-rw-r--r-- | test/vfd_swmr.c | 626 |
1 files changed, 505 insertions, 121 deletions
diff --git a/test/vfd_swmr.c b/test/vfd_swmr.c index 4d1695a..0cf865a 100644 --- a/test/vfd_swmr.c +++ b/test/vfd_swmr.c @@ -24,38 +24,24 @@ /* * This file needs to access private information from the H5F package. */ -#define H5MF_FRIEND /*suppress error about including H5MFpkg */ -#include "H5MFpkg.h" -#define H5F_FRIEND /*suppress error about including H5Fpkg */ +#define H5F_FRIEND /*suppress error about including H5Fpkg */ #define H5F_TESTING +#include "H5FDprivate.h" #include "H5Fpkg.h" -#include "H5CXprivate.h" /* API Contexts */ -#include "H5Iprivate.h" -#include "H5PBprivate.h" +#include "H5CXprivate.h" /* API Contexts */ - -#define FILENAME_LEN 1024 -#define NUM_DSETS 5 -#define NX 100 -#define NY 50 - -static unsigned open_file(char *filename, hid_t fapl, hsize_t page_size, size_t page_buffer_size); +#define FS_PAGE_SIZE 512 +#define FILENAME "vfd_swmr_file.h5" +#define MD_FILENAME "vfd_swmr_metadata_file" /* test routines for VFD SWMR */ -static unsigned test_fapl(); -static unsigned test_file_end_tick(); -static unsigned test_file_fapl(); - -const char *FILENAME[] = { - "filepaged", - NULL -}; - - -/*********************/ -/*********************/ +static unsigned test_fapl(void); +static unsigned test_file_end_tick(void); +static unsigned test_file_fapl(void); +static unsigned test_writer_md(void); +static unsigned test_writer_update_md(void); /*------------------------------------------------------------------------- @@ -78,7 +64,7 @@ const char *FILENAME[] = { *------------------------------------------------------------------------- */ static unsigned -test_fapl() +test_fapl(void) { hid_t fapl = -1; /* File access property list */ H5F_vfd_swmr_config_t *my_config = NULL; /* Configuration for VFD SWMR */ @@ -149,7 +135,7 @@ test_fapl() TEST_ERROR; /* Set md_file_path */ - HDstrcpy(my_config->md_file_path, "my_md_file"); + HDstrcpy(my_config->md_file_path, MD_FILENAME); my_config->vfd_swmr_writer = TRUE; /* Should succeed in setting the configuration info */ @@ -168,7 +154,7 @@ test_fapl() TEST_ERROR; if(my_config->md_pages_reserved != 2) TEST_ERROR; - if(HDstrcmp(my_config->md_file_path, "my_md_file") != 0) + if(HDstrcmp(my_config->md_file_path, MD_FILENAME) != 0) TEST_ERROR; /* Close the file access property list */ @@ -200,6 +186,13 @@ error: * B) Verify the VFD SWMR configuration set in fapl * used to create/open the file is the same as the * configuration retrieved from the file's fapl. + * C) Verify the following when configured as VFD SWMR reader: + * (1) there is an existing file opened as writer: + * --same process open as reader: will just increment the + * file reference count and use the same shared struct + * (2) there is no existing file opened as writer: + * --opening the file as reader will fail + * because there is no metadata file * * Return: 0 if test is sucessful * 1 if test fails @@ -209,25 +202,22 @@ error: *------------------------------------------------------------------------- */ static unsigned -test_file_fapl() +test_file_fapl(void) { hid_t fid = -1; /* File ID */ + hid_t fid_read = -1; /* File ID */ hid_t fcpl = -1; /* File creation property list ID */ hid_t fapl1 = -1; /* File access property list ID */ hid_t fapl2 = -1; /* File access property list ID */ hid_t file_fapl = -1; /* File access property list ID associated with the file */ - H5F_vfd_swmr_config_t *config1 = NULL; /* Configuration for VFD SWMR */ - H5F_vfd_swmr_config_t *config2 = NULL; /* Configuration for VFD SWMR */ - H5F_vfd_swmr_config_t *config3 = NULL; /* Configuration for VFD SWMR */ - herr_t ret; /* Return value */ -hid_t fid_read = -1; /* File ID for VFD SWMR reader */ -hid_t sid = -1; -hid_t did = -1; + H5F_vfd_swmr_config_t *config1 = NULL; /* Configuration for VFD SWMR */ + H5F_vfd_swmr_config_t *config2 = NULL; /* Configuration for VFD SWMR */ + H5F_vfd_swmr_config_t *file_config = NULL; /* Configuration for VFD SWMR */ TESTING("VFD SWMR configuration for the file and fapl"); /* Should succeed without VFD SWMR configured */ - if((fid = H5Fcreate("myfile", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Close the file */ @@ -239,35 +229,36 @@ hid_t did = -1; FAIL_STACK_ERROR; if((config2 = (H5F_vfd_swmr_config_t *)HDmalloc(sizeof(H5F_vfd_swmr_config_t))) == NULL) FAIL_STACK_ERROR; - if((config3 = (H5F_vfd_swmr_config_t *)HDmalloc(sizeof(H5F_vfd_swmr_config_t))) == NULL) + if((file_config = (H5F_vfd_swmr_config_t *)HDmalloc(sizeof(H5F_vfd_swmr_config_t))) == NULL) FAIL_STACK_ERROR; HDmemset(config1, 0, sizeof(H5F_vfd_swmr_config_t)); HDmemset(config2, 0, sizeof(H5F_vfd_swmr_config_t)); - HDmemset(config3, 0, sizeof(H5F_vfd_swmr_config_t)); + HDmemset(file_config, 0, sizeof(H5F_vfd_swmr_config_t)); /* Create a copy of the file access property list */ if((fapl1 = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; + /* Configured as VFD SWMR writer */ config1->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; config1->tick_len = 4; config1->max_lag = 6; config1->vfd_swmr_writer = TRUE; config1->md_pages_reserved = 2; - HDstrcpy(config1->md_file_path, "my_md_file"); + HDstrcpy(config1->md_file_path, MD_FILENAME); /* Should succeed in setting the VFD SWMR configuration */ if(H5Pset_vfd_swmr_config(fapl1, config1) < 0) TEST_ERROR; - /* Should fail to configure VFD SWMR: page buffering and paged aggregation not enabled */ + /* Should fail to create: page buffering and paged aggregation not enabled */ H5E_BEGIN_TRY { - fid = H5Fcreate("myfile", H5F_ACC_TRUNC, H5P_DEFAULT, fapl1); + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl1); } H5E_END_TRY; if(fid >= 0) TEST_ERROR; - /* Create a copy of file creation property list */ + /* Create a copy of the file creation property list */ if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) FAIL_STACK_ERROR @@ -275,9 +266,9 @@ hid_t did = -1; if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0) FAIL_STACK_ERROR; - /* Should fail to configure VFD SWMR: no page buffering */ + /* Should fail to create: no page buffering */ H5E_BEGIN_TRY { - fid = H5Fcreate("myfile", H5F_ACC_TRUNC, fcpl, fapl1); + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl1); } H5E_END_TRY; if(fid >= 0) TEST_ERROR; @@ -286,8 +277,8 @@ hid_t did = -1; if(H5Pset_page_buffer_size(fapl1, 4096, 0, 0) < 0) FAIL_STACK_ERROR; - /* Should succeed to configure VFD SWMR: paged aggregation and page buffering enabled */ - if((fid = H5Fcreate("myfile", H5F_ACC_TRUNC, fcpl, fapl1)) < 0) + /* Should succeed to create the file: paged aggregation and page buffering enabled */ + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl1)) < 0) TEST_ERROR; /* Get the file's file access property list */ @@ -295,11 +286,11 @@ hid_t did = -1; FAIL_STACK_ERROR; /* Retrieve the VFD SWMR configuration from file_fapl */ - if(H5Pget_vfd_swmr_config(file_fapl, config2) < 0) + if(H5Pget_vfd_swmr_config(file_fapl, file_config) < 0) TEST_ERROR; /* Verify the retrieved info is the same as config1 */ - if(HDmemcmp(config1, config2, sizeof(H5F_vfd_swmr_config_t)) != 0) + if(HDmemcmp(config1, file_config, sizeof(H5F_vfd_swmr_config_t)) != 0) TEST_ERROR; /* Closing */ @@ -309,23 +300,23 @@ hid_t did = -1; FAIL_STACK_ERROR; - /* Should succeed: VFD SWMR writer */ - if((fid = H5Fopen("myfile", H5F_ACC_RDWR, fapl1)) < 0) + /* Should succeed to open the file as VFD SWMR writer */ + if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl1)) < 0) TEST_ERROR; /* Get the file's file access property list */ if((file_fapl = H5Fget_access_plist(fid)) < 0) FAIL_STACK_ERROR; - /* Clear info in config2 */ - HDmemset(config2, 0, sizeof(H5F_vfd_swmr_config_t)); + /* Clear info in file_config */ + HDmemset(file_config, 0, sizeof(H5F_vfd_swmr_config_t)); /* Retrieve the VFD SWMR configuration from file_fapl */ - if(H5Pget_vfd_swmr_config(file_fapl, config2) < 0) + if(H5Pget_vfd_swmr_config(file_fapl, file_config) < 0) TEST_ERROR; /* Verify the retrieved info is the same as config1 */ - if(HDmemcmp(config1, config2, sizeof(H5F_vfd_swmr_config_t)) != 0) + if(HDmemcmp(config1, file_config, sizeof(H5F_vfd_swmr_config_t)) != 0) TEST_ERROR; /* Closing */ @@ -334,97 +325,130 @@ hid_t did = -1; if(H5Pclose(file_fapl) < 0) FAIL_STACK_ERROR; - /* Set a different VFD SWMR configuration */ /* Create a copy of the file access property list */ if((fapl2 = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; - config3->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; - config3->tick_len = 4; - config3->max_lag = 10; - config3->vfd_swmr_writer = TRUE; - config3->md_pages_reserved = 2; - HDstrcpy(config3->md_file_path, "my_md_file"); + /* Set up different VFD SWMR configuration */ + config2->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; + config2->tick_len = 4; + config2->max_lag = 10; + config2->vfd_swmr_writer = TRUE; + config2->md_pages_reserved = 2; + HDstrcpy(config2->md_file_path, MD_FILENAME); /* Should succeed in setting the VFD SWMR configuration */ - if(H5Pset_vfd_swmr_config(fapl2, config3) < 0) + if(H5Pset_vfd_swmr_config(fapl2, config2) < 0) TEST_ERROR; /* Enable page buffering */ if(H5Pset_page_buffer_size(fapl2, 4096, 0, 0) < 0) FAIL_STACK_ERROR; - /* Should succeed: VFD SWMR writer */ - if((fid = H5Fopen("myfile", H5F_ACC_RDWR, fapl2)) < 0) + /* Should succeed to open the file as VFD SWMR writer */ + if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl2)) < 0) TEST_ERROR; /* Get the file's file access property list */ if((file_fapl = H5Fget_access_plist(fid)) < 0) FAIL_STACK_ERROR; - /* Clear info in config2 */ - HDmemset(config2, 0, sizeof(H5F_vfd_swmr_config_t)); + /* Clear info in file_config */ + HDmemset(file_config, 0, sizeof(H5F_vfd_swmr_config_t)); /* Retrieve the VFD SWMR configuration from file_fapl */ - if(H5Pget_vfd_swmr_config(file_fapl, config2) < 0) + if(H5Pget_vfd_swmr_config(file_fapl, file_config) < 0) TEST_ERROR; /* Verify the retrieved info is NOT the same as config1 */ - if(HDmemcmp(config1, config2, sizeof(H5F_vfd_swmr_config_t)) == 0) + if(HDmemcmp(config1, file_config, sizeof(H5F_vfd_swmr_config_t)) == 0) TEST_ERROR; - /* Verify the retrieved info is the same as config3 */ - if(HDmemcmp(config2, config3, sizeof(H5F_vfd_swmr_config_t)) != 0) + /* Verify the retrieved info is the same as config2 */ + if(HDmemcmp(config2, file_config, sizeof(H5F_vfd_swmr_config_t)) != 0) TEST_ERROR; - /* Closing */ - if(H5Fclose(fid) < 0) - FAIL_STACK_ERROR; - if(H5Pclose(file_fapl) < 0) - FAIL_STACK_ERROR; - - /* - * VDF SWMR READER + /* + * The file previously opened as writer is not closed. */ /* Create a copy of the file access property list */ if((fapl2 = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; - config3->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; - config3->tick_len = 4; - config3->max_lag = 10; - config3->vfd_swmr_writer = FALSE; - config3->md_pages_reserved = 2; - HDstrcpy(config3->md_file_path, "my_md_file"); + /* Set up as VFD SWMR reader */ + config2->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; + config2->tick_len = 4; + config2->max_lag = 10; + config2->vfd_swmr_writer = FALSE; + config2->md_pages_reserved = 2; + HDstrcpy(config2->md_file_path, MD_FILENAME); - /* Should succeed in setting the VFD SWMR configuration */ - if(H5Pset_vfd_swmr_config(fapl2, config3) < 0) + /* Should succeed in setting the VFD SWMR configuration in fapl2 */ + if(H5Pset_vfd_swmr_config(fapl2, config2) < 0) TEST_ERROR; /* Enable page buffering */ if(H5Pset_page_buffer_size(fapl2, 4096, 0, 0) < 0) FAIL_STACK_ERROR; + /* Should succeed in opening the file */ + /* Same process open: even though opened with reader configuration, + * it just increments the file reference count and uses the writer's + * shared file struct */ + if((fid_read = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl2)) < 0) + TEST_ERROR; + + /* Clear info in file_config */ + HDmemset(file_config, 0, sizeof(H5F_vfd_swmr_config_t)); + + /* Get the file's file access property list */ + if((file_fapl = H5Fget_access_plist(fid)) < 0) + FAIL_STACK_ERROR; + + /* Retrieve the VFD SWMR configuration from file_fapl */ + if(H5Pget_vfd_swmr_config(file_fapl, file_config) < 0) + TEST_ERROR; + + /* Verify that the retrieved config is a writer */ + if(file_config->vfd_swmr_writer == FALSE) + TEST_ERROR; + /* Verify that the retrieved config is not the same as the initial configuration */ + if(file_config->vfd_swmr_writer == config2->vfd_swmr_writer) + TEST_ERROR; + + /* Closing */ + if(H5Fclose(fid_read) < 0) + FAIL_STACK_ERROR; + if(H5Fclose(fid) < 0) + FAIL_STACK_ERROR; + if(H5Pclose(file_fapl) < 0) + FAIL_STACK_ERROR; - /* Open the file for reading only */ + /* + * The file opened as writer is closed. + */ + /* Should fail to open the file as VFD SWMR reader: no metadata file */ H5E_BEGIN_TRY { - fid_read = H5Fopen("myfile", H5F_ACC_RDONLY, fapl2); + fid_read = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl2); } H5E_END_TRY; if(fid_read >= 0) TEST_ERROR; + /* Closing */ if(H5Pclose(fapl1) < 0) FAIL_STACK_ERROR; if(H5Pclose(fapl2) < 0) FAIL_STACK_ERROR; if(H5Pclose(fcpl) < 0) FAIL_STACK_ERROR; + + /* Free buffers */ if(config1) HDfree(config1); if(config2) HDfree(config2); - if(config3) - HDfree(config3); + if(file_config) + HDfree(file_config); PASSED() return 0; @@ -440,8 +464,8 @@ error: HDfree(config1); if(config2) HDfree(config2); - if(config3) - HDfree(config3); + if(file_config) + HDfree(file_config); return 1; } /* test_file_fapl() */ @@ -463,7 +487,7 @@ error: *------------------------------------------------------------------------- */ static unsigned -test_file_end_tick() +test_file_end_tick(void) { hid_t fid = -1; /* File ID */ hid_t fapl = -1; /* File access property list */ @@ -474,7 +498,7 @@ test_file_end_tick() TESTING("H5Fvfd_swmr_end_tick() for VFD SWMR"); /* Should succeed without VFD SWMR configured */ - if((fid = H5Fcreate("myfile", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Should fail */ @@ -503,7 +527,7 @@ test_file_end_tick() my_config->max_lag = 3; my_config->vfd_swmr_writer = TRUE; my_config->md_pages_reserved = 2; - HDstrcpy(my_config->md_file_path, "my_md_file"); + HDstrcpy(my_config->md_file_path, MD_FILENAME); /* Should succeed in setting the VFD SWMR configuration */ if(H5Pset_vfd_swmr_config(fapl, my_config) < 0) @@ -522,7 +546,7 @@ test_file_end_tick() FAIL_STACK_ERROR; /* Create the file with VFD SWMR configured */ - if((fid = H5Fcreate("myfile", H5F_ACC_TRUNC, fcpl, fapl)) < 0) + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0) FAIL_STACK_ERROR; /* Should succeed */ @@ -534,7 +558,7 @@ test_file_end_tick() FAIL_STACK_ERROR; /* Open the file as VFD SWMR writer */ - if((fid = H5Fopen("myfile", H5F_ACC_RDWR, fapl)) < 0) + if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR; /* Should succeed */ @@ -545,72 +569,431 @@ test_file_end_tick() if(H5Fclose(fid) < 0) FAIL_STACK_ERROR; -#ifdef NOTYET - /* Open the file as VFD SWMR reader */ - if((fid = H5Fopen("myfile", H5F_ACC_RDONLY, fapl)) < 0) + /* Open the file as reader without VFD SWMR configured */ + if((fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR; - /* Should succeed */ - if(H5Fvfd_swmr_end_tick(fid) < 0) + /* Should fail */ + H5E_BEGIN_TRY { + ret = H5Fvfd_swmr_end_tick(fid); + } H5E_END_TRY; + if(ret >= 0) TEST_ERROR; /* Close the file */ if(H5Fclose(fid) < 0) FAIL_STACK_ERROR; -#endif - /* Open the file as writer without VFD SWMR configured */ - if((fid = H5Fopen("myfile", H5F_ACC_RDWR, H5P_DEFAULT)) < 0) + if(H5Pclose(fapl) < 0) FAIL_STACK_ERROR; + if(H5Pclose(fcpl) < 0) + FAIL_STACK_ERROR; + if(my_config) + HDfree(my_config); - /* Should fail */ + PASSED() + return 0; + +error: H5E_BEGIN_TRY { - ret = H5Fvfd_swmr_end_tick(fid); + H5Pclose(fapl); + H5Pclose(fcpl); + H5Fclose(fid); } H5E_END_TRY; - if(ret >= 0) - TEST_ERROR; + + if(my_config) + HDfree(my_config); + + return 1; +} /* test_file_end_tick() */ + + +/*------------------------------------------------------------------------- + * Function: test_writer_md() + * + * Purpose: Verify info in the metadata file when: + * --creating the HDF5 file + * --flushing the HDF5 file + * --opening an existing HDF5 file + * It will call the internal testing routine + * H5F__vfd_swmr_writer_md_test() to do the following: + * --Open the metadata file + * --Verify the file size is as expected (md_pages_reserved) + * --For file create: + * --No header magic is found + * --For file open or file flush: + * --Read and decode the header and index in the metadata file + * --Verify info in the header and index read from + * the metadata file is as expected (empty index) + * + * Return: 0 if test is sucessful + * 1 if test fails + * + * Programmer: Vailin Choi; October 2018 + * + *------------------------------------------------------------------------- + */ +static unsigned +test_writer_md(void) +{ + hid_t fid = -1; /* File ID */ + hid_t fapl = -1; /* File access property list */ + hid_t fcpl = -1; /* File creation property list */ + H5F_vfd_swmr_config_t *my_config = NULL; /* Configuration for VFD SWMR */ + + TESTING("Create/Open/Flush an HDF5 file for VFD SWMR"); + + /* Allocate memory for the configuration structure */ + if((my_config = (H5F_vfd_swmr_config_t *)HDmalloc(sizeof(H5F_vfd_swmr_config_t))) == NULL) + FAIL_STACK_ERROR; + HDmemset(my_config, 0, sizeof(H5F_vfd_swmr_config_t)); + + /* Create a copy of the file access property list */ + if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) + FAIL_STACK_ERROR; + + /* Set up the VFD SWMR configuration */ + my_config->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; + my_config->tick_len = 1; + my_config->max_lag = 3; + my_config->vfd_swmr_writer = TRUE; + my_config->md_pages_reserved = 1; + HDstrcpy(my_config->md_file_path, MD_FILENAME); + + /* Set the VFD SWMR configuration in fapl */ + if(H5Pset_vfd_swmr_config(fapl, my_config) < 0) + FAIL_STACK_ERROR; + + /* Enable page buffering */ + if(H5Pset_page_buffer_size(fapl, 4096, 0, 0) < 0) + FAIL_STACK_ERROR; + + /* Create a copy of the file creation property list */ + if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) + FAIL_STACK_ERROR + + /* Set file space strategy */ + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0) + FAIL_STACK_ERROR; + + /* Create an HDF5 file with VFD SWMR configured */ + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0) + FAIL_STACK_ERROR; + + /* Verify info in metadata file when creating the HDF5 file */ + if(H5F__vfd_swmr_writer_md_test(fid, TRUE) < 0) + TEST_ERROR + + /* Flush the HDF5 file */ + if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0) + FAIL_STACK_ERROR + + /* Verify info in metadata file when flushing the HDF5 file */ + if(H5F__vfd_swmr_writer_md_test(fid, FALSE) < 0) + TEST_ERROR /* Close the file */ if(H5Fclose(fid) < 0) FAIL_STACK_ERROR; - /* Open the file as reader without VFD SWMR configured */ - if((fid = H5Fopen("myfile", H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) + /* Re-open the file as VFD SWMR writer */ + if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl)) < 0) + TEST_ERROR; + + /* Verify info in metadata file when reopening the HDF5 file */ + if(H5F__vfd_swmr_writer_md_test(fid, FALSE) < 0) + TEST_ERROR + + /* Closing */ + if(H5Fclose(fid) < 0) + FAIL_STACK_ERROR; + if(H5Pclose(fapl) < 0) + FAIL_STACK_ERROR; + if(H5Pclose(fcpl) < 0) FAIL_STACK_ERROR; - /* Should fail */ + if(my_config) + HDfree(my_config); + + PASSED() + return 0; + +error: + if(my_config) + HDfree(my_config); + H5E_BEGIN_TRY { - ret = H5Fvfd_swmr_end_tick(fid); + H5Pclose(fapl); + H5Pclose(fcpl); + H5Fclose(fid); } H5E_END_TRY; - if(ret >= 0) - TEST_ERROR; + + return 1; +} /* test_writer_md() */ + + +/*------------------------------------------------------------------------- + * Function: test_writer_update_md() + * + * Purpose: Verify info in the metadata file after update with the + * constructed index: (A), (B), (C), (D) + * It will call the internal testing routine + * H5F__vfd_swmr_writer_update_md_test() to do the following: + * --Update the metadata file with the input index via the + * internal library routine H5F_update_vfd_swmr_metadata_file() + * --Verify the entries in the delayed list is as expected + * (input: num_insert_dl, num_remove_dl) + * --Open the metadata file, read and decode the header and index + * --Verify info in the header and index just read from the + * metadatea file is as expected (input: num_entries and index) + * + * Return: 0 if test is sucessful + * 1 if test fails + * + * Programmer: Vailin Choi; October 2018 + * + *------------------------------------------------------------------------- + */ +static unsigned +test_writer_update_md(void) +{ + hid_t fid = -1; /* File ID */ + hid_t fid_read = -1; /* File ID for the reader */ + hid_t fapl = -1; /* File access property list */ + hid_t fapl2 = -1; /* File access property list */ + hid_t fcpl = -1; /* File creation property list */ + unsigned num_entries = 10; /* Number of entries in the index */ + unsigned i = 0; /* Local index variables */ + uint8_t *buf = NULL; /* Data page from the page buffer */ + hid_t dcpl = -1; /* Dataset creation property list */ + hid_t sid = -1; /* Dataspace ID */ + hid_t did = -1; /* Dataset ID */ + int *rwbuf = NULL; /* Data buffer for writing */ + H5O_info_t oinfo; /* Object metadata information */ + char dname[50]; /* Name of dataset */ + hsize_t dims[2] = {50, 20}; /* Dataset dimension sizes */ + hsize_t max_dims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* Dataset maximum dimension sizes */ + hsize_t chunk_dims[2] = {2, 5}; /* Dataset chunked dimension sizes */ + H5FD_vfd_swmr_idx_entry_t *index = NULL; /* Pointer to the index entries */ + H5F_vfd_swmr_config_t *my_config = NULL; /* Configuration for VFD SWMR */ + + TESTING("Updating the metadata file for VFD SWMR writer"); + + /* Allocate memory for the configuration structure */ + if((my_config = (H5F_vfd_swmr_config_t *)HDmalloc(sizeof(H5F_vfd_swmr_config_t))) == NULL) + FAIL_STACK_ERROR; + HDmemset(my_config, 0, sizeof(H5F_vfd_swmr_config_t)); + + /* Create a copy of the file access property list */ + if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) + FAIL_STACK_ERROR; + + /* Set up the VFD SWMR configuration */ + my_config->version = H5F__CURR_VFD_SWMR_CONFIG_VERSION; + my_config->tick_len = 1; + my_config->max_lag = 3; + my_config->vfd_swmr_writer = TRUE; + my_config->md_pages_reserved = 2; + HDstrcpy(my_config->md_file_path, MD_FILENAME); + + /* Set the VFD SWMR configuration in fapl */ + if(H5Pset_vfd_swmr_config(fapl, my_config) < 0) + FAIL_STACK_ERROR; + + /* Enable page buffering */ + if(H5Pset_page_buffer_size(fapl, FS_PAGE_SIZE, 0, 0) < 0) + FAIL_STACK_ERROR; + + /* Create a copy of the file creation property list */ + if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) + FAIL_STACK_ERROR + + /* Set file space strategy */ + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0) + FAIL_STACK_ERROR; + if(H5Pset_file_space_page_size(fcpl, FS_PAGE_SIZE) < 0) + FAIL_STACK_ERROR; + + /* Create an HDF5 file with VFD SWMR configured */ + if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0) + FAIL_STACK_ERROR; + + /* Verify info in the metadata file when creating an HDF5 file */ + if(H5F__vfd_swmr_writer_md_test(fid, TRUE) < 0) + TEST_ERROR + + /* Allocate num_entries for the data buffer */ + if((buf = (uint8_t *)HDmalloc((num_entries * FS_PAGE_SIZE * sizeof(uint8_t)))) == NULL) + FAIL_STACK_ERROR; + + /* Allocate memory for num_entries index */ + if(NULL == (index = (H5FD_vfd_swmr_idx_entry_t *)HDcalloc(num_entries, sizeof(H5FD_vfd_swmr_idx_entry_t)))) + FAIL_STACK_ERROR; + + /* (A) Construct index for updating the metadata file */ + for(i = 0; i < num_entries; i++) { + index[i].hdf5_page_offset = (uint64_t)my_config->md_pages_reserved; + index[i].md_file_page_offset = 0; + index[i].length = (uint32_t)FS_PAGE_SIZE; + index[i].entry_ptr = (void *)&buf[i]; + } + + /* Update with index and verify info in the metadata file */ + /* Also verify that 0/0 entries are inserted/removed to/from the delayed list */ + if(H5F__vfd_swmr_writer_update_md_test(fid, num_entries, index, 0, 0) < 0) + TEST_ERROR + + /* Create dataset creation property list */ + if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) + FAIL_STACK_ERROR + + /* Set to use chunked dataset */ + if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0) + FAIL_STACK_ERROR + + /* Create dataspace */ + if((sid = H5Screate_simple(2, dims, max_dims)) < 0) + FAIL_STACK_ERROR + + /* Perform activities to ensure that max_lag ticks elapse */ + for(i = 0; i < 500; i++) { + + /* Create a chunked dataset */ + sprintf(dname, "dset %d", i); + if((did = H5Dcreate2(fid, dname, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + FAIL_STACK_ERROR + + /* Get dataset object header address */ + if(H5Oget_info2(did, &oinfo, H5O_INFO_BASIC) < 0) + FAIL_STACK_ERROR + + /* Close the dataset */ + if(H5Dclose(did) < 0) + FAIL_STACK_ERROR + } + + /* (B) Update every other entry in the index */ + for(i = 0; i < num_entries; i+= 2) + index[i].entry_ptr = (void *)&buf[i]; + + /* Update with index and verify info in the metadata file */ + /* Also verify that 5/0 entries are inserted/removed to/from the delayed list */ + if(H5F__vfd_swmr_writer_update_md_test(fid, num_entries, index, 5, 0) < 0) + TEST_ERROR + + /* Allocate memory for the read/write buffer */ + if((rwbuf = (int *)HDmalloc(sizeof(int) * (50 * 20))) == NULL) + FAIL_STACK_ERROR; + for(i = 0; i < (50 * 20); i++) + rwbuf[i] = (int)i; + + /* Perform activities to ensure that max_lag ticks elapse */ + for(i = 0; i < 500; i++) { + /* Open the dataset */ + sprintf(dname, "dset %d", i); + if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0) + FAIL_STACK_ERROR + + /* Write to the dataset */ + if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rwbuf) < 0) + FAIL_STACK_ERROR + + /* Get dataset object info */ + if(H5Oget_info2(did, &oinfo, H5O_INFO_BASIC) < 0) + FAIL_STACK_ERROR + + /* Close the dataset */ + if(H5Dclose(did) < 0) + FAIL_STACK_ERROR + } + + /* (C) Update every 3 entry in the index */ + for(i = 0; i < num_entries; i+= 3) + index[i].entry_ptr = (void *)&buf[i]; + + /* Update with index and verify info in the metadata file */ + /* Also verify that 4/5 entries are inserted/removed to/from the delayed list */ + if(H5F__vfd_swmr_writer_update_md_test(fid, num_entries, index, 4, 5) < 0) + TEST_ERROR + + /* Clear the read/write buffer */ + HDmemset(rwbuf, 0, sizeof(sizeof(int) * (50 * 20))); + + /* Perform activities to ensure that max_lag ticks elapse */ + for(i = 0; i < 500; i++) { + /* Open the dataset */ + sprintf(dname, "dset %d", i); + if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0) + FAIL_STACK_ERROR + + /* Read from the dataset */ + if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rwbuf) < 0) + FAIL_STACK_ERROR + + /* Get dataset object info */ + if(H5Oget_info2(did, &oinfo, H5O_INFO_BASIC) < 0) + FAIL_STACK_ERROR + + /* Close the dataset */ + if(H5Dclose(did) < 0) + FAIL_STACK_ERROR + } + + /* (D) Update two entries in the index */ + index[1].entry_ptr = (void *)&buf[1]; + index[5].entry_ptr = (void *)&buf[5]; + + /* Update with index and verify info in the metadata file */ + /* Also verify that 2/4 entries are inserted/removed to/from the delayed list */ + if(H5F__vfd_swmr_writer_update_md_test(fid, num_entries, index, 2, 4) < 0) + TEST_ERROR /* Close the file */ if(H5Fclose(fid) < 0) FAIL_STACK_ERROR; + if(H5Sclose(sid) < 0) + FAIL_STACK_ERROR; + if(H5Pclose(dcpl) < 0) + FAIL_STACK_ERROR; + if(H5Pclose(fapl) < 0) FAIL_STACK_ERROR; if(H5Pclose(fcpl) < 0) FAIL_STACK_ERROR; + if(my_config) HDfree(my_config); + if(buf) + HDfree(buf); + if(rwbuf) + HDfree(rwbuf); + PASSED() return 0; error: + if(my_config) + HDfree(my_config); + if(buf) + HDfree(buf); + if(rwbuf) + HDfree(rwbuf); + if(index) + HDfree(index); + H5E_BEGIN_TRY { + H5Dclose(did); + H5Sclose(sid); + H5Pclose(dcpl); H5Pclose(fapl); H5Pclose(fcpl); H5Fclose(fid); } H5E_END_TRY; - if(my_config) - HDfree(my_config); - return 1; -} /* test_file_end_tick() */ +} /* test_writer_update_md() */ /*------------------------------------------------------------------------- @@ -663,7 +1046,8 @@ main(void) nerrors += test_file_fapl(); nerrors += test_file_end_tick(); - h5_clean_files(FILENAME, fapl); + nerrors += test_writer_md(); + nerrors += test_writer_update_md(); if(nerrors) goto error; |