mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-12 17:31:09 +08:00
Fix for HDFFV-10808 H5Pset_file_space_strategy succeeds when using H5Pset_libver_bounds v18,v18.
Fails file creation when non-default free-space info is set in fcpl and the library version high bound is less than v110 because free-space info message is introduced in library release v110.
This commit is contained in:
parent
3c9b147707
commit
d9653606d8
@ -318,6 +318,9 @@ struct H5F_file_t {
|
||||
H5F_fspace_strategy_t fs_strategy; /* File space handling strategy */
|
||||
hsize_t fs_threshold; /* Free space section threshold */
|
||||
hbool_t fs_persist; /* Free-space persist or not */
|
||||
unsigned fs_version; /* Free-space version: */
|
||||
/* It is used to update fsinfo message in the superblock
|
||||
extension when closing down the free-space managers */
|
||||
hbool_t use_tmp_space; /* Whether temp. file space allocation is allowed */
|
||||
haddr_t tmp_addr; /* Next address to use for temp. space in the file */
|
||||
hbool_t point_of_no_return; /* Flag to indicate that we can't go back and delete a freespace header when it's used up */
|
||||
|
@ -80,6 +80,15 @@ static const unsigned HDF5_superblock_ver_bounds[] = {
|
||||
HDF5_SUPERBLOCK_VERSION_LATEST /* H5F_LIBVER_LATEST */
|
||||
};
|
||||
|
||||
/* Format version bounds for fsinfo message */
|
||||
/* This message exists starting library release v1.10 */
|
||||
static const unsigned H5O_fsinfo_ver_bounds[] = {
|
||||
H5O_INVALID_VERSION, /* H5F_LIBVER_EARLIEST */
|
||||
H5O_INVALID_VERSION, /* H5F_LIBVER_V18 */
|
||||
H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V110 */
|
||||
H5O_FSINFO_VERSION_LATEST /* H5F_LIBVER_LATEST */
|
||||
};
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5F__super_ext_create
|
||||
@ -782,6 +791,14 @@ H5F__super_read(H5F_t *f, H5P_genplist_t *fa_plist, hbool_t initial_read)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get free-space manager info message")
|
||||
|
||||
/* Update changed values */
|
||||
|
||||
/* Version bounds check */
|
||||
if(H5O_fsinfo_ver_bounds[H5F_HIGH_BOUND(f)] == H5O_INVALID_VERSION ||
|
||||
fsinfo.version > H5O_fsinfo_ver_bounds[H5F_HIGH_BOUND(f)])
|
||||
HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, FAIL, "File space info message's version out of bounds")
|
||||
if(f->shared->fs_version != fsinfo.version)
|
||||
f->shared->fs_version = fsinfo.version;
|
||||
|
||||
if(f->shared->fs_strategy != fsinfo.strategy) {
|
||||
f->shared->fs_strategy = fsinfo.strategy;
|
||||
|
||||
@ -1375,6 +1392,11 @@ H5F__super_init(H5F_t *f)
|
||||
fsinfo.eoa_pre_fsm_fsalloc = HADDR_UNDEF;
|
||||
fsinfo.mapped = FALSE;
|
||||
|
||||
/* Set the version for the fsinfo message */
|
||||
if(H5O__fsinfo_set_version(f, &fsinfo) < 0)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set version of fsinfo")
|
||||
f->shared->fs_version = fsinfo.version;
|
||||
|
||||
for(ptype = H5F_MEM_PAGE_SUPER; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
|
||||
fsinfo.fs_addr[ptype - 1] = HADDR_UNDEF;
|
||||
|
||||
@ -1801,3 +1823,45 @@ done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* H5F__super_ext_remove_msg() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5O__fsinfo_set_version
|
||||
*
|
||||
* Purpose: Set the version to encode the fsinfo message with.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Vailin Choi; June 2019
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5O__fsinfo_set_version(H5F_t *f, H5O_fsinfo_t *fsinfo)
|
||||
{
|
||||
unsigned version; /* Message version */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
/* Sanity check */
|
||||
HDassert(f);
|
||||
HDassert(fsinfo);
|
||||
|
||||
version = H5O_FSINFO_VERSION_1;
|
||||
|
||||
/* Upgrade to the version indicated by the file's low bound if higher */
|
||||
if(H5O_fsinfo_ver_bounds[H5F_LOW_BOUND(f)] != H5O_INVALID_VERSION) {
|
||||
version = MAX(version, H5O_fsinfo_ver_bounds[H5F_LOW_BOUND(f)]);
|
||||
}
|
||||
|
||||
/* Version bounds check */
|
||||
if(H5O_fsinfo_ver_bounds[H5F_HIGH_BOUND(f)] == H5O_INVALID_VERSION ||
|
||||
version > H5O_fsinfo_ver_bounds[H5F_HIGH_BOUND(f)])
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "File space info message's version out of bounds")
|
||||
|
||||
/* Set the message version */
|
||||
fsinfo->version = version;
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O__fsinfo_set_version() */
|
||||
|
@ -1835,6 +1835,7 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
|
||||
fsinfo.page_size = f->shared->fs_page_size;
|
||||
fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
|
||||
fsinfo.eoa_pre_fsm_fsalloc = f->shared->eoa_pre_fsm_fsalloc;
|
||||
fsinfo.version = f->shared->fs_version;
|
||||
|
||||
/* Write the free space manager message -- message must already exist */
|
||||
if(H5F__super_ext_write_msg(f, H5O_FSINFO_ID, &fsinfo, FALSE, H5O_MSG_FLAG_MARK_IF_UNKNOWN) < 0)
|
||||
@ -1973,6 +1974,8 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
|
||||
fsinfo.page_size = f->shared->fs_page_size;
|
||||
fsinfo.pgend_meta_thres = f->shared->pgend_meta_thres;
|
||||
fsinfo.eoa_pre_fsm_fsalloc = HADDR_UNDEF;
|
||||
fsinfo.version = f->shared->fs_version;
|
||||
|
||||
for(ptype = H5F_MEM_PAGE_META; ptype < H5F_MEM_PAGE_NTYPES; H5_INC_ENUM(H5F_mem_page_t, ptype))
|
||||
fsinfo.fs_addr[ptype - 1] = HADDR_UNDEF;
|
||||
|
||||
|
@ -65,10 +65,6 @@ const H5O_msg_class_t H5O_MSG_FSINFO[1] = {{
|
||||
H5O__fsinfo_debug /* debug the message */
|
||||
}};
|
||||
|
||||
/* Current version of free-space manager info information */
|
||||
#define H5O_FSINFO_VERSION_0 0
|
||||
#define H5O_FSINFO_VERSION_1 1
|
||||
|
||||
/* Declare a free list to manage the H5O_fsinfo_t struct */
|
||||
H5FL_DEFINE_STATIC(H5O_fsinfo_t);
|
||||
|
||||
@ -157,11 +153,13 @@ H5O_fsinfo_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file space strategy")
|
||||
} /* end switch */
|
||||
|
||||
fsinfo->version = H5O_FSINFO_VERSION_1;
|
||||
fsinfo->mapped = TRUE;
|
||||
|
||||
} else {
|
||||
HDassert(vers == H5O_FSINFO_VERSION_1);
|
||||
HDassert(vers >= H5O_FSINFO_VERSION_1);
|
||||
|
||||
fsinfo->version = vers;
|
||||
fsinfo->strategy = (H5F_fspace_strategy_t)*p++; /* File space strategy */
|
||||
fsinfo->persist = *p++; /* Free-space persist or not */
|
||||
H5F_DECODE_LENGTH(f, p, fsinfo->threshold); /* Free-space section threshold */
|
||||
@ -214,7 +212,7 @@ H5O_fsinfo_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, c
|
||||
HDassert(p);
|
||||
HDassert(fsinfo);
|
||||
|
||||
*p++ = H5O_FSINFO_VERSION_1; /* message version */
|
||||
*p++ = (uint8_t)fsinfo->version; /* message version */
|
||||
*p++ = fsinfo->strategy; /* File space strategy */
|
||||
*p++ = (unsigned char)fsinfo->persist; /* Free-space persist or not */
|
||||
H5F_ENCODE_LENGTH(f, p, fsinfo->threshold); /* Free-space section size threshold */
|
||||
|
@ -804,6 +804,17 @@ typedef uint32_t H5O_refcount_t; /* Contains # of links to object, if >1
|
||||
*/
|
||||
typedef unsigned H5O_unknown_t; /* Original message type ID */
|
||||
|
||||
/* To indicate an invalid version for a message that does not exist yet for the release */
|
||||
/* Message version is 1 byte so the value can be 0 to 255 */
|
||||
#define H5O_INVALID_VERSION 256
|
||||
|
||||
/* The initial version of the fsinfo message: deprecated */
|
||||
/* This version is mapped to version 1 from release 1.10.1 onwards */
|
||||
#define H5O_FSINFO_VERSION_0 0
|
||||
|
||||
/* The latest version for fsinfo message */
|
||||
#define H5O_FSINFO_VERSION_1 1
|
||||
#define H5O_FSINFO_VERSION_LATEST H5O_FSINFO_VERSION_1
|
||||
/*
|
||||
* File space info Message.
|
||||
* Contains file space management info and
|
||||
@ -811,6 +822,7 @@ typedef unsigned H5O_unknown_t; /* Original message type ID */
|
||||
* (Data structure in memory)
|
||||
*/
|
||||
typedef struct H5O_fsinfo_t {
|
||||
unsigned version; /* Version number */
|
||||
H5F_fspace_strategy_t strategy; /* File space strategy */
|
||||
hbool_t persist; /* Persisting free-space or not */
|
||||
hsize_t threshold; /* Free-space section threshold */
|
||||
|
276
test/tfile.c
276
test/tfile.c
@ -181,8 +181,8 @@ const char *FILESPACE_NAME[] = {
|
||||
/* Local test function declarations for version bounds */
|
||||
static void test_libver_bounds_low_high(void);
|
||||
static void test_libver_bounds_super(hid_t fapl);
|
||||
static void test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr);
|
||||
static void test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr);
|
||||
static void test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm);
|
||||
static void test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm);
|
||||
static void test_libver_bounds_obj(hid_t fapl);
|
||||
static void test_libver_bounds_dataset(hid_t fapl);
|
||||
static void test_libver_bounds_dataspace(hid_t fapl);
|
||||
@ -4819,7 +4819,7 @@ test_filespace_1_10_0_compatible(void)
|
||||
for(j = 0; j < NELMTS(OLD_1_10_0_FILENAME); j++) {
|
||||
/* Make a copy of the test file */
|
||||
status = h5_make_local_copy(OLD_1_10_0_FILENAME[j], FILE5);
|
||||
CHECK(status, FAIL, "h5_make_local_copy");
|
||||
CHECK(status, FAIL, "h5_make_local_copy");
|
||||
|
||||
/* Open the temporary test file */
|
||||
fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT);
|
||||
@ -5583,13 +5583,13 @@ test_libver_bounds_super(hid_t fapl)
|
||||
|
||||
/* Verify superblock version when creating a file with input fapl,
|
||||
fcpl #A and with/without SWMR access */
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Verify superblock version when opening a file which is created
|
||||
with input fapl, fcpl #A and with/without SWMR access */
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Close the fcpl */
|
||||
ret = H5Pclose(fcpl);
|
||||
@ -5604,13 +5604,13 @@ test_libver_bounds_super(hid_t fapl)
|
||||
|
||||
/* Verify superblock version when creating a file with input fapl,
|
||||
fcpl #B and with/without SWMR access */
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Verify superblock version when opening a file which is created
|
||||
with input fapl, fcpl #B and with/without SWMR access */
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Close the fcpl */
|
||||
ret = H5Pclose(fcpl);
|
||||
@ -5627,13 +5627,13 @@ test_libver_bounds_super(hid_t fapl)
|
||||
|
||||
/* Verify superblock version when creating a file with input fapl,
|
||||
fcpl #C and with/without SWMR access */
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Verify superblock version when opening a file which is created
|
||||
with input fapl, fcpl #C and with/without SWMR access */
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE, FALSE);
|
||||
|
||||
/* Close the fcpl */
|
||||
ret = H5Pclose(fcpl);
|
||||
@ -5648,13 +5648,13 @@ test_libver_bounds_super(hid_t fapl)
|
||||
|
||||
/* Verify superblock version when creating a file with input fapl,
|
||||
fcpl #D and with/without SWMR access */
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, TRUE, TRUE);
|
||||
test_libver_bounds_super_create(fapl, fcpl, FALSE, TRUE);
|
||||
|
||||
/* Verify superblock version when opening a file which is created
|
||||
with input fapl, fcpl #D and with/without SWMR access */
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, TRUE, TRUE);
|
||||
test_libver_bounds_super_open(fapl, fcpl, FALSE, TRUE);
|
||||
|
||||
/* Close the fcpl */
|
||||
ret = H5Pclose(fcpl);
|
||||
@ -5666,8 +5666,8 @@ test_libver_bounds_super(hid_t fapl)
|
||||
/**************************************************************************************************
|
||||
**
|
||||
** test_libver_bounds_super_create():
|
||||
** Verify the following when the file is created with the input fapl, fcpl, and
|
||||
** with/without SWMR access:
|
||||
** Verify the following when the file is created with the input fapl, fcpl,
|
||||
** and with/without SWMR access:
|
||||
** (a) the superblock version #
|
||||
** (b) the file's low bound setting
|
||||
** (c) fail or succeed in creating the file
|
||||
@ -5679,7 +5679,10 @@ test_libver_bounds_super(hid_t fapl)
|
||||
** in the input fapl. The next three rows list the expected results for #a to #c.
|
||||
** "-->" indicates "upgrade to"
|
||||
**
|
||||
** Creating a file with write access
|
||||
** The last table lists the expected results in creating the file when non-default
|
||||
** free-space info (fsinfo) is enabled in fcpl.
|
||||
**
|
||||
** Creating a file with write access
|
||||
** --------------------------------------------------------------------------------
|
||||
** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) |
|
||||
** |______________________________________________________________________________|
|
||||
@ -5690,7 +5693,7 @@ test_libver_bounds_super(hid_t fapl)
|
||||
** File creation | succeed |
|
||||
** |______________________________________________________________________________|
|
||||
**
|
||||
** Creating a file with SWMR-write access
|
||||
** Creating a file with SWMR-write access
|
||||
** --------------------------------------------------------------------------------
|
||||
** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) |
|
||||
** |______________________________________________________________________________|
|
||||
@ -5698,12 +5701,19 @@ test_libver_bounds_super(hid_t fapl)
|
||||
** |------------------------------------------------------------------------------|
|
||||
** File's low bound | -- | ->v110 | -- | ->v110 | no change |
|
||||
** |------------------------------------------------------------------------------|
|
||||
** File creation | fail | succeed | fail | succeed | succed |
|
||||
** File creation | fail | succeed | fail | succeed | succeed |
|
||||
** |______________________________________________________________________________|
|
||||
**
|
||||
** Creating a file with write/SWMR-write access + non-default fsinfo
|
||||
** --------------------------------------------------------------------------------
|
||||
** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) |
|
||||
** |______________________________________________________________________________|
|
||||
** File creation | fail | succeed | fail | succeed | succeed |
|
||||
** |______________________________________________________________________________|
|
||||
**
|
||||
******************************************************************************************************/
|
||||
static void
|
||||
test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm)
|
||||
{
|
||||
hid_t fid = -1; /* File ID */
|
||||
H5F_t *f = NULL; /* Internal file pointer */
|
||||
@ -5726,8 +5736,10 @@ test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
ret = H5Pget_libver_bounds(fapl, &low, &high);
|
||||
CHECK(ret, FAIL, "H5Pget_libver_bounds");
|
||||
|
||||
if(is_swmr) { /* SWMR is enabled */
|
||||
if(non_def_fsm && high < H5F_LIBVER_V110)
|
||||
VERIFY(fid, FAIL, "H5Fcreate");
|
||||
|
||||
else if(is_swmr) { /* SWMR is enabled */
|
||||
if(high >= H5F_LIBVER_V110) { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fcreate");
|
||||
VERIFY(HDF5_SUPERBLOCK_VERSION_3, f->shared->sblock->super_vers, "HDF5_superblock_ver_bounds");
|
||||
@ -5736,37 +5748,37 @@ test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
} else /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fcreate");
|
||||
|
||||
}
|
||||
else { /* Should succeed */
|
||||
} else { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fcreate");
|
||||
VERIFY(low, f->shared->low_bound, "HDF5_superblock_ver_bounds");
|
||||
|
||||
switch(low) {
|
||||
case H5F_LIBVER_EARLIEST:
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_DEF ||
|
||||
f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_1 ||
|
||||
f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_DEF ||
|
||||
f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_1 ||
|
||||
f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
|
||||
case H5F_LIBVER_V18:
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
|
||||
case H5F_LIBVER_V110:
|
||||
case H5F_LIBVER_V112:
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_3);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_3);
|
||||
VERIFY(ok, TRUE, "HDF5_superblock_ver_bounds");
|
||||
break;
|
||||
|
||||
case H5F_LIBVER_ERROR:
|
||||
case H5F_LIBVER_NBOUNDS:
|
||||
default:
|
||||
ERROR("H5Pget_libver_bounds");
|
||||
ERROR("H5Pget_libver_bounds");
|
||||
|
||||
} /* end switch */
|
||||
}
|
||||
|
||||
} /* end else */
|
||||
|
||||
if(fid >= 0) { /* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
@ -5793,11 +5805,14 @@ test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
** For file open, the file's superblock version, the low/high bounds setting in fapl,
|
||||
** and with/without SWMR file access will determine the results for #a and #b.
|
||||
**
|
||||
** The first row for the following tables is the 5 pairs of low/high bounds setting
|
||||
** The first row for the following tables (#A - #B) is the 5 pairs of low/high bounds setting
|
||||
** in the input fapl. The next two rows list the expected results for #a and #b.
|
||||
** "-->" indicates "upgrade to"
|
||||
**
|
||||
** Opening a file with write access
|
||||
** The last table (#C) lists the expected results in opening the file when non-default
|
||||
** free-space info (fsinfo) is enabled in fcpl.
|
||||
**
|
||||
** (A) Opening a file with write access
|
||||
**
|
||||
** Superblock version 0, 1
|
||||
** --------------------------------------------------------------------------------
|
||||
@ -5829,7 +5844,7 @@ test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
**
|
||||
**
|
||||
**
|
||||
** Opening a file with SWMR-write access
|
||||
** (B) Opening a file with SWMR-write access
|
||||
**
|
||||
** Superblock version 0, 1, 2
|
||||
** -------------------------------------------------------------------------------
|
||||
@ -5851,9 +5866,17 @@ test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
** |_____________________________________________________________________________|
|
||||
**
|
||||
**
|
||||
** (C) Opening a file with write/SWMR-write access + non-default fsinfo
|
||||
** -------------------------------------------------------------------------------
|
||||
** | (earliest, v18) | (earliest, v10) | (v18, v18) | (v18, v110) | (v110, v110) |
|
||||
** |_____________________________________________________________________________|
|
||||
** File open | fail | succeed | fail | succeed | succeed |
|
||||
** |_____________________________________________________________________________|
|
||||
**
|
||||
**
|
||||
******************************************************************************************************/
|
||||
static void
|
||||
test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm)
|
||||
{
|
||||
hid_t fid = -1; /* File ID */
|
||||
H5F_t *f = NULL; /* Internal file pointer */
|
||||
@ -5863,96 +5886,113 @@ test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr)
|
||||
herr_t ret; /* Return value */
|
||||
|
||||
/* Create the file with the input fcpl and fapl */
|
||||
fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, fcpl, fapl);
|
||||
CHECK(fid, FAIL, "H5Fcreate");
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, fcpl, fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Get the internal file pointer */
|
||||
f = (H5F_t *)H5VL_object(fid);
|
||||
CHECK(f, NULL, "H5VL_object");
|
||||
/* Retrieve the low/high bounds */
|
||||
ret = H5Pget_libver_bounds(fapl, &low, &high);
|
||||
CHECK(ret, FAIL, "H5Pget_libver_bounds");
|
||||
|
||||
/* The file's superblock version */
|
||||
super_vers = f->shared->sblock->super_vers;
|
||||
if(non_def_fsm && high < H5F_LIBVER_V110) {
|
||||
VERIFY(fid, FAIL, "H5Fcreate");
|
||||
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
} else {
|
||||
VERIFY(fid >= 0, TRUE, "H5Fcreate");
|
||||
|
||||
/* Create a default file access property list */
|
||||
new_fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
CHECK(new_fapl, FAIL, "H5Pcreate");
|
||||
/* Get the internal file pointer */
|
||||
f = (H5F_t *)H5VL_object(fid);
|
||||
CHECK(f, NULL, "H5VL_object");
|
||||
|
||||
/* Loop through all the combinations of low/high bounds in new_fapl */
|
||||
for(low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; H5_INC_ENUM(H5F_libver_t, low)) {
|
||||
for(high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; H5_INC_ENUM(H5F_libver_t, high)) {
|
||||
H5E_BEGIN_TRY {
|
||||
ret = H5Pset_libver_bounds(new_fapl, low, high);
|
||||
} H5E_END_TRY;
|
||||
/* The file's superblock version */
|
||||
super_vers = f->shared->sblock->super_vers;
|
||||
|
||||
/* Invalid combinations */
|
||||
if (ret < 0)
|
||||
continue;
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
|
||||
/* Open the file with or without SWMR access */
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(FILE8, H5F_ACC_RDWR | (is_swmr ? H5F_ACC_SWMR_WRITE : 0), new_fapl);
|
||||
} H5E_END_TRY;
|
||||
/* Create a default file access property list */
|
||||
new_fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
CHECK(new_fapl, FAIL, "H5Pcreate");
|
||||
|
||||
/* Get the internal file pointer if the open succeeds */
|
||||
if(fid >= 0) {
|
||||
f = (H5F_t *)H5VL_object(fid);
|
||||
CHECK(f, NULL, "H5VL_object");
|
||||
}
|
||||
/* Loop through all the combinations of low/high bounds in new_fapl */
|
||||
for(low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; H5_INC_ENUM(H5F_libver_t, low)) {
|
||||
for(high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; H5_INC_ENUM(H5F_libver_t, high)) {
|
||||
H5E_BEGIN_TRY {
|
||||
ret = H5Pset_libver_bounds(new_fapl, low, high);
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Verify the file open succeeds or fails */
|
||||
switch(super_vers) {
|
||||
case 3:
|
||||
if(high >= H5F_LIBVER_V110) {
|
||||
/* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound >= H5F_LIBVER_V110, TRUE, "HDF5_superblock_ver_bounds");
|
||||
/* Invalid combinations */
|
||||
if (ret < 0)
|
||||
continue;
|
||||
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
} else /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
break;
|
||||
/* Open the file with or without SWMR access */
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(FILE8, H5F_ACC_RDWR | (is_swmr ? H5F_ACC_SWMR_WRITE : 0), new_fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
case 2:
|
||||
if(is_swmr) /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
else { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound >= H5F_LIBVER_V18, TRUE, "HDF5_superblock_ver_bounds");
|
||||
if(non_def_fsm && high < H5F_LIBVER_V110) {
|
||||
VERIFY(fid, FAIL, "H5Fopen");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
}
|
||||
break;
|
||||
/* Get the internal file pointer if the open succeeds */
|
||||
if(fid >= 0) {
|
||||
f = (H5F_t *)H5VL_object(fid);
|
||||
CHECK(f, NULL, "H5VL_object");
|
||||
}
|
||||
|
||||
case 1:
|
||||
case 0:
|
||||
if(is_swmr) /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
else { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound, low, "HDF5_superblock_ver_bounds");
|
||||
/* Verify the file open succeeds or fails */
|
||||
switch(super_vers) {
|
||||
case 3:
|
||||
if(high >= H5F_LIBVER_V110) {
|
||||
/* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound >= H5F_LIBVER_V110, TRUE, "HDF5_superblock_ver_bounds");
|
||||
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
}
|
||||
break;
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
} else /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
} /* end switch */
|
||||
case 2:
|
||||
if(is_swmr) /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
else { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound >= H5F_LIBVER_V18, TRUE, "HDF5_superblock_ver_bounds");
|
||||
|
||||
/* Close the file */
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 0:
|
||||
if(is_swmr) /* Should fail */
|
||||
VERIFY(fid >= 0, FALSE, "H5Fopen");
|
||||
else { /* Should succeed */
|
||||
VERIFY(fid >= 0, TRUE, "H5Fopen");
|
||||
VERIFY(f->shared->low_bound, low, "HDF5_superblock_ver_bounds");
|
||||
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
} /* end switch */
|
||||
} /* end for */
|
||||
} /* end for */
|
||||
} /* end for */
|
||||
|
||||
/* Close the file access property list */
|
||||
ret = H5Pclose(new_fapl);
|
||||
CHECK(ret, FAIL, "H5Pclose");
|
||||
/* Close the file access property list */
|
||||
ret = H5Pclose(new_fapl);
|
||||
CHECK(ret, FAIL, "H5Pclose");
|
||||
} /* end else */
|
||||
|
||||
} /* end test_libver_bounds_super_open() */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user