summaryrefslogtreecommitdiffstats
path: root/test/cache_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/cache_image.c')
-rw-r--r--test/cache_image.c532
1 files changed, 515 insertions, 17 deletions
diff --git a/test/cache_image.c b/test/cache_image.c
index 0e7928a..f49f7b3 100644
--- a/test/cache_image.c
+++ b/test/cache_image.c
@@ -59,6 +59,9 @@ static unsigned cache_image_smoke_check_6(void);
static unsigned cache_image_api_error_check_1(void);
static unsigned cache_image_api_error_check_2(void);
static unsigned cache_image_api_error_check_3(void);
+static unsigned cache_image_api_error_check_4(void);
+
+static unsigned get_free_sections_test(void);
/****************************************************************************/
@@ -664,12 +667,10 @@ open_hdf5_file(hbool_t create_file, hbool_t mdci_sbem_expected,
}
if ( ( pass ) && ( config_fsm ) ) {
-
- if ( H5Pset_file_space(fcpl_id, H5F_FILE_SPACE_ALL_PERSIST, 1) < 0 ) {
-
- pass = FALSE;
- failure_mssg = "H5Pset_file_space() failed.";
- }
+ if(H5Pset_file_space_strategy(fcpl_id, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0) {
+ pass = FALSE;
+ failure_mssg = "H5Pset_file_space_strategy() failed.";
+ }
}
if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++);
@@ -5091,11 +5092,14 @@ cache_image_smoke_check_5(void)
* 13) Close the file.
*
* 14) Get the size of the file. Verify that it is less
- * than 1 KB. Without deletions and persistant free
+ * than 20 KB. Without deletions and persistant free
* space managers, size size is about 167 MB, so this
* is sufficient to verify that the persistant free
* space managers are more or less doing their job.
*
+ * Note that in the absence of paged allocation, file
+ * size gets below 1 KB.
+ *
* 15) Delete the file.
*
* Return: void
@@ -5408,20 +5412,24 @@ cache_image_smoke_check_6(void)
/* 14) Get the size of the file. Verify that it is less
- * than 1 KB. Without deletions and persistant free
+ * than 20 KB. Without deletions and persistant free
* space managers, size size is about 167 MB, so this
* is sufficient to verify that the persistant free
* space managers are more or less doing their job.
+ *
+ * Note that in the absence of paged allocation, file
+ * size gets below 1 KB, but since this test is run both
+ * with and without paged allocation, we must leave some
+ * extra space for the paged allocation case.
*/
- if((file_size = h5_get_file_size(filename, H5P_DEFAULT)) < 0) {
-
- pass = FALSE;
- failure_mssg = "h5_get_file_size() failed.\n";
-
- } else if ( file_size > 1024 ) {
-
- pass = FALSE;
- failure_mssg = "unexpectedly large file size.\n";
+ if(pass) {
+ if((file_size = h5_get_file_size(filename, H5P_DEFAULT)) < 0) {
+ pass = FALSE;
+ failure_mssg = "h5_get_file_size() failed.\n";
+ } else if(file_size > 20 * 1024) {
+ pass = FALSE;
+ failure_mssg = "unexpectedly large file size.\n";
+ }
}
if ( show_progress )
@@ -7069,6 +7077,494 @@ cache_image_api_error_check_4(void)
return !pass;
} /* cache_image_api_error_check_4() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: get_free_sections_test()
+ *
+ * Purpose: It is possible that H5Fget_free_sections() to be
+ * called before any activity on the metadata cache.
+ * This is a potential problem, as satisfying the
+ * H5Fget_free_sections() call requires access to all
+ * free space managers. When persistant free space
+ * managers are enabled, this will require calling
+ * H5MF_tidy_self_referential_fsm_hack(). This is a
+ * non issue in the absence of a cache image. However,
+ * this is a problem if a cache image exists, as
+ * the call to H5MF_tidy_self_referential_fsm_hack()
+ * will free the file space allocated to the cache
+ * image.
+ *
+ * The objective of this test is to create a test file
+ * with both non-empty self referential presistant
+ * free space managers, and a cache image, and then
+ * verify that this situation is handled correctly if
+ * H5Fget_free_sections() is called before the metadata
+ * cache image is loaded.
+ *
+ * The test is set up as follows:
+ *
+ * 1) Create a HDF5 file with a cache image requested
+ * and persistant free space managers enabled.
+ *
+ * 2) Create some data sets, and then delete some of
+ * of those near the beginning of the file.
+ *
+ * 3) Close the file.
+ *
+ * 4) Open the file read only.
+ *
+ * 5) Verify that a cache image exists, and has not
+ * been loaded.
+ *
+ * 6) Verify that one or more self referential FSMs
+ * have been stored at the end of the file just
+ * before the cache image.
+ *
+ * 7) Call H5Fget_free_sections().
+ *
+ * 8) Verify that the cache image has been loaded and
+ * that the self referential FSMs have been floated.
+ *
+ * 9) Verify that the remaining data sets contain the
+ * expected data.
+ *
+ * 10) Close the file.
+ *
+ * 11) Open the file R/W.
+ *
+ * 12) Verify that a cache image exists, and has not
+ * been loaded.
+ *
+ * 13) Verify that one or more self referential FSMs
+ * have been stored at the end of the file just
+ * before the cache image.
+ *
+ * 14) Call H5Fget_free_sections().
+ *
+ * 15) Verify that the cache image has been loaded and
+ * that the self referential FSMs have been floated.
+ *
+ * 16) Verify that the remaining data sets contain the
+ * expected data.
+ *
+ * 17) Delete the remaining data sets.
+ *
+ * 18) Close the file.
+ *
+ * 19) Verify that file space has been reclaimed.
+ *
+ * 20) Discard the file.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 1/10/17
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+get_free_sections_test(void)
+{
+ const char * fcn_name = "get_free_sections_test()";
+ char filename[512];
+ hbool_t show_progress = FALSE;
+ hid_t file_id = -1;
+ H5F_t *file_ptr = NULL;
+ H5C_t *cache_ptr = NULL;
+ h5_stat_size_t file_size;
+ int cp = 0;
+
+ TESTING("Cache image / H5Fget_free_sections() interaction");
+
+ pass = TRUE;
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* setup the file name */
+ if ( pass ) {
+
+ if ( h5_fixname(FILENAMES[0], H5P_DEFAULT, filename, sizeof(filename))
+ == NULL ) {
+
+ pass = FALSE;
+ failure_mssg = "h5_fixname() failed.\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 1) Create a HDF5 file with a cache image requested
+ * and persistant free space managers enabled.
+ */
+
+ if ( pass ) {
+
+ open_hdf5_file(/* create_file */ TRUE,
+ /* mdci_sbem_expected */ FALSE,
+ /* read_only */ FALSE,
+ /* set_mdci_fapl */ TRUE,
+ /* config_fsm */ TRUE,
+ /* hdf_file_name */ filename,
+ /* cache_image_flags */ H5C_CI__ALL_FLAGS,
+ /* file_id_ptr */ &file_id,
+ /* file_ptr_ptr */ &file_ptr,
+ /* cache_ptr_ptr */ &cache_ptr);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 2) Create some data sets, and then delete some of
+ * of those near the beginning of the file.
+ */
+
+ if ( pass ) {
+
+ create_datasets(file_id, 1, 10);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ if ( pass ) {
+
+ verify_datasets(file_id, 1, 10);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ if ( pass ) {
+
+ delete_datasets(file_id, 1, 5);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 3) Close the file. */
+
+ if ( pass ) {
+
+ if ( H5Fclose(file_id) < 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "H5Fclose() failed (1).\n";
+
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 4) Open the file read only. */
+
+ if ( pass ) {
+
+ open_hdf5_file(/* create_file */ FALSE,
+ /* mdci_sbem_expected */ TRUE,
+ /* read_only */ TRUE,
+ /* set_mdci_fapl */ FALSE,
+ /* config_fsm */ FALSE,
+ /* hdf_file_name */ filename,
+ /* cache_image_flags */ H5C_CI__ALL_FLAGS,
+ /* file_id_ptr */ &file_id,
+ /* file_ptr_ptr */ &file_ptr,
+ /* cache_ptr_ptr */ &cache_ptr);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 5) Verify that a cache image exists, and has not been loaded. */
+
+ if ( pass ) {
+
+ if ( ( ! file_ptr->shared->cache->load_image ) ||
+ ( file_ptr->shared->cache->image_loaded ) ) {
+
+ pass = FALSE;
+ failure_mssg = "unexpected cache image status.\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 6) Verify that one or more self referential FSMs
+ * have been stored at the end of the file just
+ * before the cache image.
+ */
+
+ if ( pass ) {
+
+ /* file_ptr->shared->first_alloc_dealloc is set to FALSE if the
+ * file is opened R/O.
+ */
+ if ( ( file_ptr->shared->first_alloc_dealloc ) ||
+ ( ! H5F_addr_defined(file_ptr->shared->eoa_pre_fsm_fsalloc) ) ||
+ ( ! H5F_addr_defined(file_ptr->shared->cache->image_addr) ) ||
+ ( H5F_addr_gt(file_ptr->shared->eoa_pre_fsm_fsalloc,
+ file_ptr->shared->cache->image_addr) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "unexpected cache image status (1).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 7) Call H5Fget_free_sections(). */
+
+ if ( pass ) {
+
+ if ( H5Fget_free_sections(file_id, H5FD_MEM_DEFAULT, (size_t)0, NULL)
+ < 0 ){
+
+ pass = FALSE;
+ failure_mssg = "H5Fget_free_sections() failed (1).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 8) Verify that the cache image has been loaded and
+ * that the self referential FSMs have been floated.
+ */
+ if ( pass ) {
+
+ if ( ! file_ptr->shared->cache->image_loaded ) {
+
+ pass = FALSE;
+ failure_mssg = "cache image not loaded (1).\n";
+
+ } else if ( file_ptr->shared->first_alloc_dealloc ) {
+
+ pass = FALSE;
+ failure_mssg = "self referential FSMs not floated (1).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 9) Verify that the remaining data sets contain the expected data. */
+
+ if ( pass ) {
+
+ verify_datasets(file_id, 6, 10);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 10) Close the file. */
+
+ if ( pass ) {
+
+ if ( H5Fclose(file_id) < 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "H5Fclose() failed (2).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 11) Open the file R/W. */
+
+ if ( pass ) {
+
+ open_hdf5_file(/* create_file */ FALSE,
+ /* mdci_sbem_expected */ TRUE,
+ /* read_only */ FALSE,
+ /* set_mdci_fapl */ FALSE,
+ /* config_fsm */ FALSE,
+ /* hdf_file_name */ filename,
+ /* cache_image_flags */ H5C_CI__ALL_FLAGS,
+ /* file_id_ptr */ &file_id,
+ /* file_ptr_ptr */ &file_ptr,
+ /* cache_ptr_ptr */ &cache_ptr);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 12) Verify that a cache image exists, and has not been loaded. */
+
+ if ( pass ) {
+
+ if ( ( ! file_ptr->shared->cache->load_image ) ||
+ ( file_ptr->shared->cache->image_loaded ) ) {
+
+ pass = FALSE;
+ failure_mssg = "unexpected cache image status.\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 13) Verify that one or more self referential FSMs
+ * have been stored at the end of the file just
+ * before the cache image.
+ */
+ if ( pass ) {
+
+ if ( ( ! file_ptr->shared->first_alloc_dealloc ) ||
+ ( ! H5F_addr_defined(file_ptr->shared->eoa_pre_fsm_fsalloc) ) ||
+ ( ! H5F_addr_defined(file_ptr->shared->cache->image_addr) ) ||
+ ( H5F_addr_gt(file_ptr->shared->eoa_pre_fsm_fsalloc,
+ file_ptr->shared->cache->image_addr) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "unexpected cache image status (2).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 14) Call H5Fget_free_sections(). */
+
+ if ( pass ) {
+
+ if ( H5Fget_free_sections(file_id, H5FD_MEM_DEFAULT, (size_t)0, NULL)
+ < 0 ){
+
+ pass = FALSE;
+ failure_mssg = "H5Fget_free_sections() failed (2).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 15) Verify that the cache image has been loaded and
+ * that the self referential FSMs have been floated.
+ */
+ if ( pass ) {
+
+ if ( ! file_ptr->shared->cache->image_loaded ) {
+
+ pass = FALSE;
+ failure_mssg = "cache image not loaded (2).\n";
+
+ } else if ( file_ptr->shared->first_alloc_dealloc ) {
+
+ pass = FALSE;
+ failure_mssg = "self referential FSMs not floated (2).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 16) Verify that the remaining data sets contain the expected data. */
+
+ if ( pass ) {
+
+ verify_datasets(file_id, 6, 10);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 17) Delete the remaining data sets. */
+
+ if ( pass ) {
+
+ delete_datasets(file_id, 6, 10);
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 18) Close the file. */
+
+ if ( pass ) {
+
+ if ( H5Fclose(file_id) < 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "H5Fclose() failed (3).\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 19) Verify that file space has been reclaimed. */
+
+ if ( pass ) {
+
+ if((file_size = h5_get_file_size(filename, H5P_DEFAULT)) < 0) {
+
+ pass = FALSE;
+ failure_mssg = "h5_get_file_size() failed.\n";
+
+ } else if ( file_size > 20 * 1024 ) {
+
+ pass = FALSE;
+ failure_mssg = "unexpectedly large file size.\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+
+ /* 20) Discard the file. */
+
+ if ( pass ) {
+
+ if ( HDremove(filename) < 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "HDremove() failed.\n";
+ }
+ }
+
+ if ( show_progress )
+ HDfprintf(stdout, "%s: cp = %d, pass = %d.\n", fcn_name, cp++, pass);
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ FUNC, failure_mssg);
+
+ return !pass;
+
+} /* get_free_sections_test() */
+
+
/*-------------------------------------------------------------------------
* Function: main
*
@@ -7117,6 +7613,8 @@ main(void)
nerrs += cache_image_api_error_check_3();
nerrs += cache_image_api_error_check_4();
+ nerrs += get_free_sections_test();
+
return(nerrs > 0);
} /* main() */