Fix for HDFFV-10800 H5Ocopy failure:

The value for the H5F_LIBVER_V18 index in H5O_fill_ver_bounds[], the format
version bounds array for fill value message, should be version 3 not 2.
This commit is contained in:
Vailin Choi
2019-06-12 12:55:12 -05:00
parent 48b0ff7724
commit 8d72e5e3e0
7 changed files with 103 additions and 5 deletions

View File

@@ -1009,6 +1009,7 @@
./test/file_image.c ./test/file_image.c
./test/file_image_core_test.h5 ./test/file_image_core_test.h5
./test/fill_old.h5 ./test/fill_old.h5
./test/fill18.h5
./test/fillval.c ./test/fillval.c
./test/filter_fail.c ./test/filter_fail.c
./test/filter_plugin.c ./test/filter_plugin.c

View File

@@ -256,6 +256,17 @@ Bug Fixes since HDF5-1.10.3 release
Library Library
------- -------
- H5Ocopy a dataset in a 1.8 library file created with the latest format
When H5Ocopy the dataset in the 1.8 library file to a 1.10 library file
created with (v18, v18) version bounds, the library fails with error stack
indicating that the fill value message version is out of bounds.
The value for the H5F_LIBVER_V18 index in H5O_fill_ver_bounds[], the format
version bounds array for fill value message, should be version 3 not 2.
(VC - 2019/6/11, HDFFV-10800)
- Fixed a bug that would cause an error or cause fill values to be - Fixed a bug that would cause an error or cause fill values to be
incorrectly read from a chunked dataset using the "single chunk" index if incorrectly read from a chunked dataset using the "single chunk" index if
the data was held in cache and there was no data on disk. the data was held in cache and there was no data on disk.

View File

@@ -156,7 +156,7 @@ const H5O_msg_class_t H5O_MSG_FILL_NEW[1] = {{
/* Format version bounds for fill value */ /* Format version bounds for fill value */
const unsigned H5O_fill_ver_bounds[] = { const unsigned H5O_fill_ver_bounds[] = {
H5O_FILL_VERSION_1, /* H5F_LIBVER_EARLIEST */ H5O_FILL_VERSION_1, /* H5F_LIBVER_EARLIEST */
H5O_FILL_VERSION_2, /* H5F_LIBVER_V18 */ H5O_FILL_VERSION_3, /* H5F_LIBVER_V18 */
H5O_FILL_VERSION_3, /* H5F_LIBVER_V110 */ H5O_FILL_VERSION_3, /* H5F_LIBVER_V110 */
H5O_FILL_VERSION_LATEST /* H5F_LIBVER_LATEST */ H5O_FILL_VERSION_LATEST /* H5F_LIBVER_LATEST */
}; };

View File

@@ -158,6 +158,7 @@ set (HDF5_REFERENCE_TEST_FILES
filespace_1_6.h5 filespace_1_6.h5
filespace_1_8.h5 filespace_1_8.h5
fill_old.h5 fill_old.h5
fill18.h5
filter_error.h5 filter_error.h5
fsm_aggr_nopersist.h5 fsm_aggr_nopersist.h5
fsm_aggr_persist.h5 fsm_aggr_persist.h5

BIN
test/fill18.h5 Normal file

Binary file not shown.

View File

@@ -2136,7 +2136,7 @@ test_copy_dataset_versionbounds(hid_t fcpl_src, hid_t fapl_src)
char src_fname[NAME_BUF_SIZE]; /* Name of source file */ char src_fname[NAME_BUF_SIZE]; /* Name of source file */
char dst_fname[NAME_BUF_SIZE]; /* Name of destination file */ char dst_fname[NAME_BUF_SIZE]; /* Name of destination file */
H5F_libver_t low, high; /* File format bounds */ H5F_libver_t low, high; /* File format bounds */
unsigned srcdset_fillversion; /* Fill version of source dataset */ unsigned srcdset_layoutversion; /* Layout version of source dataset */
int i, j; /* Local index variables */ int i, j; /* Local index variables */
H5D_t *dsetp = NULL; /* Pointer to internal dset structure */ H5D_t *dsetp = NULL; /* Pointer to internal dset structure */
herr_t ret; /* Generic return value */ herr_t ret; /* Generic return value */
@@ -2179,7 +2179,8 @@ test_copy_dataset_versionbounds(hid_t fcpl_src, hid_t fapl_src)
/* Get the internal dset ptr to get the fill version for verifying later */ /* Get the internal dset ptr to get the fill version for verifying later */
if ((dsetp = (H5D_t *)H5VL_object(did_src)) == NULL) TEST_ERROR if ((dsetp = (H5D_t *)H5VL_object(did_src)) == NULL) TEST_ERROR
srcdset_fillversion = dsetp->shared->dcpl_cache.fill.version;
srcdset_layoutversion = dsetp->shared->layout.version;
/* Close dataspace */ /* Close dataspace */
if(H5Sclose(sid) < 0) TEST_ERROR if(H5Sclose(sid) < 0) TEST_ERROR
@@ -2224,9 +2225,9 @@ test_copy_dataset_versionbounds(hid_t fcpl_src, hid_t fapl_src)
/* If copy failed, check if the failure is expected */ /* If copy failed, check if the failure is expected */
if (ret < 0) if (ret < 0)
{ {
/* Failure is valid if fill version of source dataset is /* Failure is valid if layout version of source dataset is
greater than destination */ greater than destination */
if (srcdset_fillversion <= H5O_fill_ver_bounds[high]) if (srcdset_layoutversion <= H5O_layout_ver_bounds[high])
TEST_ERROR TEST_ERROR
/* Close the DST file before continue */ /* Close the DST file before continue */

View File

@@ -169,6 +169,15 @@ const char *FILESPACE_NAME[] = {
NULL NULL
}; };
/* Declarations for test_libver_bounds_copy(): */
/* SRC_FILE: source file created under 1.8 branch with latest format */
/* DST_FILE: destination file for copying the dataset in SRC_FILE */
/* DSET_DS1: the dataset created in SRC_FILE to be copied to DST_FILE */
#define SRC_FILE "fill18.h5"
#define DST_FILE "fill18_copy.h5"
#define DSET_DS1 "DS1"
/* Local test function declarations for version bounds */ /* Local test function declarations for version bounds */
static void test_libver_bounds_low_high(void); static void test_libver_bounds_low_high(void);
static void test_libver_bounds_super(hid_t fapl); static void test_libver_bounds_super(hid_t fapl);
@@ -5277,6 +5286,79 @@ test_libver_bounds_open(void)
} /* end test_libver_bounds_open() */ } /* end test_libver_bounds_open() */
/*-------------------------------------------------------------------------
* Function: test_libver_bounds_copy
*
* Purpose: Test to verify HDFFV-10800 is fixed:
* This test is copied from the user test program: copy10.c.
* (See attached programs in the jira issue.)
*
* The source file used in the test is generated by the user test
* program "fill18.c" with the 1.8 library. The file is created
* with the latest format and the dataset created in the file
* has version 3 fill value message (latest).
*
* The test creates the destination file with (v18, v18) version bounds.
* H5Ocopy() should succeed in copying the dataset in the source file
* to the destination file.
*
* Return: Success: 0
* Failure: number of errors
*
*-------------------------------------------------------------------------
*/
static void
test_libver_bounds_copy(void)
{
hid_t src_fid = -1; /* File ID */
hid_t dst_fid = -1; /* File ID */
hid_t fapl = -1; /* File access property list ID */
const char *src_fname; /* Source file name */
herr_t ret; /* Generic return value */
/* Output message about the test being performed */
MESSAGE(5, ("Testing H5Ocopy a dataset in a 1.8 library file to a 1.10 library file\n"));
/* Get the test file name */
src_fname = H5_get_srcdir_filename(SRC_FILE);
/* Open the source test file */
src_fid = H5Fopen(src_fname, H5F_ACC_RDONLY, H5P_DEFAULT);
CHECK(src_fid, FAIL, "H5Fopen");
/* Create file access property list */
fapl = H5Pcreate(H5P_FILE_ACCESS);
CHECK(fapl, FAIL, "H5Pcreate");
/* Set library version bounds to (v18, v18) */
ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_V18, H5F_LIBVER_V18);
CHECK(ret, FAIL, "H5Pset_libver_bounds");
/* Create the destination file with the fapl */
dst_fid = H5Fcreate(DST_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
CHECK(dst_fid, FAIL, "H5Pcreate");
/* Close the fapl */
ret = H5Pclose(fapl);
CHECK(ret, FAIL, "H5Pclose");
/* Copy the dataset in the source file to the destination file */
ret = H5Ocopy(src_fid, DSET_DS1, dst_fid, DSET_DS1, H5P_DEFAULT, H5P_DEFAULT);
VERIFY(ret, SUCCEED, "H5Ocopy");
/* Close the source file */
ret = H5Fclose(src_fid);
CHECK(ret, FAIL, "H5Fclose");
/* Close the destination file */
ret = H5Fclose(dst_fid);
CHECK(ret, FAIL, "H5Fclose");
/* Remove the destination file */
HDremove(DST_FILE);
} /* end test_libver_bounds_copy() */
/**************************************************************** /****************************************************************
** **
** test_libver_bounds(): ** test_libver_bounds():
@@ -5295,6 +5377,7 @@ test_libver_bounds(void)
test_libver_bounds_real(H5F_LIBVER_EARLIEST, 1, H5F_LIBVER_LATEST, 2); test_libver_bounds_real(H5F_LIBVER_EARLIEST, 1, H5F_LIBVER_LATEST, 2);
test_libver_bounds_real(H5F_LIBVER_LATEST, 2, H5F_LIBVER_EARLIEST, 2); test_libver_bounds_real(H5F_LIBVER_LATEST, 2, H5F_LIBVER_EARLIEST, 2);
test_libver_bounds_open(); test_libver_bounds_open();
test_libver_bounds_copy();
} /* end test_libver_bounds() */ } /* end test_libver_bounds() */
/************************************************************************************** /**************************************************************************************
@@ -7690,5 +7773,6 @@ cleanup_file(void)
HDremove(FILE5); HDremove(FILE5);
HDremove(FILE6); HDremove(FILE6);
HDremove(FILE7); HDremove(FILE7);
HDremove(DST_FILE);
} }