diff --git a/README.md b/README.md
index ecf2f64a684..fcb0882166d 100644
--- a/README.md
+++ b/README.md
@@ -90,10 +90,12 @@ are tentative.
| Release | New Features |
| ------- | ------------ |
-| 1.14.4 | native float16 support, cloud-optimized HDF5 improvements |
-| 1.14.5 | Complex number support |
-| TBD | VFD SWMR |
-| 2.0.0 | TBD |
+| 1.14.5 | oss-fuzz fixes, ros3 VFD improvements |
+| 1.14.6 | Last maintenance release of 1.14 |
+| 1.16.0 | Complex number support, updated library defaults (cache sizes, etc.) |
+| 2.0.0 | Multi-threaded HDF5, crashproofing / metadata journaling, Full (VFD) SWMR, encryption, digital signatures, semantic versioning |
+
+Some HDF5 2.0.0 features listed here may be released in a 1.16.x release.
This list of feature release versions is also tentative, and the specific release
in which a feature is introduced may change.
diff --git a/doc/img/release-schedule.plantuml b/doc/img/release-schedule.plantuml
index 28535b07e6f..741160e31d3 100644
--- a/doc/img/release-schedule.plantuml
+++ b/doc/img/release-schedule.plantuml
@@ -23,17 +23,26 @@ Project starts 2023-01-01
[1.12.3] happens 2023-11-30
[1.12] is colored in #88CCEE
-[1.14] starts at 2023-01-01 and lasts 104 weeks
+[1.14] starts at 2023-01-01 and lasts 122 weeks
[1.14.1] happens at 2023-04-30
[1.14.2] happens at 2023-08-31
[1.14.3] happens at 2023-10-31
-[1.14.4] happens at 2024-03-31
+[1.14.4.2] happens at 2024-04-15
+[1.14.4.3] happens at 2024-05-22
[1.14.5] happens at 2024-09-30
+[1.14.6] happens at 2025-04-30
[1.14.1] displays on same row as [1.14.1]
[1.14.2] displays on same row as [1.14.1]
[1.14.3] displays on same row as [1.14.1]
-[1.14.4] displays on same row as [1.14.1]
+[1.14.4.2] displays on same row as [1.14.1]
[1.14.5] displays on same row as [1.14.1]
+[1.14.6] displays on same row as [1.14.1]
[1.14] is colored in #B187CF
+[1.16] starts at 2025-04-30 and lasts 35 weeks
+[1.16.0] happens at 2025-04-30
+[1.16.1] happens at 2025-09-30
+[1.16.1] displays on same row as [1.16.0]
+[1.16] is colored in #02BFA0
+
@endgantt
diff --git a/doc/img/release-schedule.png b/doc/img/release-schedule.png
old mode 100755
new mode 100644
index ce69e665d33..82e1cf5d495
Binary files a/doc/img/release-schedule.png and b/doc/img/release-schedule.png differ
diff --git a/doxygen/dox/VOLConnGuide.dox b/doxygen/dox/VOLConnGuide.dox
index 190d1fb2048..1f0fb20b022 100644
--- a/doxygen/dox/VOLConnGuide.dox
+++ b/doxygen/dox/VOLConnGuide.dox
@@ -664,7 +664,11 @@ structure. It is the opposite of the to_str callback.
\subsection subsecVOLRefWrap Object Wrap Callbacks
The object wrap callbacks are used by passthrough connectors to wrap/unwrap objects and contexts when
-passing them up and down the VOL chain.
+passing them up and down the VOL chain. Each passthrough VOL must define an object wrapping structure and a wrap context.
+The object wrapping structure should contain the information necessary to recursively unwrap the object - at a minimum, this is the object provided from and the ID of the next connector in the stack.
+The wrap context should contain the information necessary to recursively wrap the object - at a minimum, this is the ID and the wrap context of the next VOL connector in the stack.
+
+Each callback should use H5VL<callback> to recursively invoke the same callback in all lower passthrough VOl connectors.
Wrap class for object wrapping routines, H5VLconnector.h
\code
@@ -678,7 +682,13 @@ typedef struct H5VL_wrap_class_t {
\endcode
\subsubsection subsubsecVOLRefWrapobj wrap: get_object
-Retrieves an underlying object.
+Retrieves the underlying object from a wrapped object. Should return a pointer to the underlying object belonging to the terminal VOL connector.
+
+This will generally be done by unwrapping this VOL's object wrapping structure, before recursively calling H5VLget_object to invoke the get_object
+callback for all lower VOL connectors which define it. H5VLget_object requires the object returned by the next VOL and the next VOL's ID. Both of
+these fields should be stored by the VOL somehow, generally on the wrapped object structure.
+
+This callback should not cleanup or modify the provided object wrapping structure.
Signature: |
@@ -696,7 +706,7 @@ Retrieves an underlying object.
\code
- obj (IN): Object being unwrapped.
+ obj (IN): The object to be unwrapped.
\endcode
|
@@ -704,6 +714,9 @@ Retrieves an underlying object.
\subsubsection subsubsecVOLRefWrapctx wrap: get_wrap_ctx
Get a VOL connector's object wrapping context.
+
+The context should be returned in dynamically allocated memory under *wrap_ctx.
+Any resources this callback allocates should be freed within free_wrap_ctx.
Signature: |
@@ -721,7 +734,7 @@ Get a VOL connector's object wrapping context.
\code
- obj (IN): Object for which we need a context.
+ obj (IN): Object wrapped by this VOL connector, for which we need a context.
wrap_ctx (OUT): Context.
\endcode
|
@@ -729,7 +742,11 @@ Get a VOL connector's object wrapping context.
\subsubsection subsubsecVOLRefWrapwrap wrap: wrap_object
-Asks a connector to wrap an underlying object.
+Asks a connector to wrap an underlying object. This callback should use H5VLwrap_object
+to recursively have the object wrapped by all lower VOL connectors before performing its own wrapping.
+
+The wrapped object should provide the information necessary for unwrap_object to recursively
+unwrap it - at a minimum, the object provided from and the ID of the next VOL connector.
Signature: |
@@ -747,7 +764,7 @@ Asks a connector to wrap an underlying object.
\code
- obj (IN): Object being wrapped.
+ obj (IN): The object to be wrapped.
obj_type (IN): Object type (see H5Ipublic.h).
wrap_ctx (IN): Context.
\endcode
@@ -756,7 +773,10 @@ Asks a connector to wrap an underlying object.
|
\subsubsection subsubsecVOLRefWrapunwrap wrap: unwrap_object
-Unwrap an object from connector.
+Unwrap an object from connector. Any resources allocated during wrap_object should be released and cleaned up here.
+
+This callback should clean up this VOL's object wrapping structure before recursively invoking H5VLunwrap_object.
+
Signature: |
@@ -774,14 +794,15 @@ Unwrap an object from connector.
\code
- obj (IN): Object being unwrapped.
+ obj (IN): Object to be unwrapped.
\endcode
|
\subsubsection subsubsecVOLRefWrapfree wrap: free_wrap_ctx
-Release a VOL connector's object wrapping context.
+Release a VOL connector's object wrapping context. This should free any resources allocated during get_wrap_ctx, and recursively invoke H5VLfree_wrap_ctx
+to execute the free callback for the lower VOL connectors in the stack.
Signature: |
diff --git a/fortran/src/H5_f.c b/fortran/src/H5_f.c
index 530068ba880..3b278bbbc54 100644
--- a/fortran/src/H5_f.c
+++ b/fortran/src/H5_f.c
@@ -539,6 +539,7 @@ h5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid
h5f_flags[27] = (int_f)H5F_LIBVER_V110;
h5f_flags[28] = (int_f)H5F_LIBVER_V112;
h5f_flags[29] = (int_f)H5F_LIBVER_V114;
+ h5f_flags[30] = (int_f)H5F_LIBVER_V116;
/*
* H5FD flags
diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90
index fb3bba67198..f4bb211e0d1 100644
--- a/fortran/src/H5_ff.F90
+++ b/fortran/src/H5_ff.F90
@@ -56,7 +56,7 @@ MODULE H5LIB
!
! H5F flags declaration
!
- INTEGER, PARAMETER :: H5F_FLAGS_LEN = 30
+ INTEGER, PARAMETER :: H5F_FLAGS_LEN = 31
INTEGER, DIMENSION(1:H5F_FLAGS_LEN) :: H5F_flags
!
! H5generic flags declaration
@@ -379,6 +379,7 @@ END FUNCTION h5init1_flags_c
H5F_LIBVER_V110_F = H5F_flags(28)
H5F_LIBVER_V112_F = H5F_flags(29)
H5F_LIBVER_V114_F = H5F_flags(30)
+ H5F_LIBVER_V116_F = H5F_flags(31)
!
! H5generic flags
!
diff --git a/fortran/src/H5f90global.F90 b/fortran/src/H5f90global.F90
index 4794bdc83c8..6d8697da699 100644
--- a/fortran/src/H5f90global.F90
+++ b/fortran/src/H5f90global.F90
@@ -236,6 +236,7 @@ MODULE H5GLOBAL
!DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V110_F
!DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V112_F
!DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V114_F
+ !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V116_F
!DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_FSM_AGGR_F
!DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_PAGE_F
!DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_AGGR_F
@@ -269,6 +270,7 @@ MODULE H5GLOBAL
INTEGER :: H5F_LIBVER_V110_F !< H5F_LIBVER_V110
INTEGER :: H5F_LIBVER_V112_F !< H5F_LIBVER_V112
INTEGER :: H5F_LIBVER_V114_F !< H5F_LIBVER_V114
+ INTEGER :: H5F_LIBVER_V116_F !< H5F_LIBVER_V116
INTEGER :: H5F_FSPACE_STRATEGY_FSM_AGGR_F !< H5F_FSPACE_STRATEGY_FSM_AGGR
INTEGER :: H5F_FSPACE_STRATEGY_PAGE_F !< H5F_FSPACE_STRATEGY_PAGE
INTEGER :: H5F_FSPACE_STRATEGY_AGGR_F !< H5F_FSPACE_STRATEGY_AGGR
diff --git a/fortran/test/tH5P_F03.F90 b/fortran/test/tH5P_F03.F90
index 64dd1d2891c..95b634e6782 100644
--- a/fortran/test/tH5P_F03.F90
+++ b/fortran/test/tH5P_F03.F90
@@ -228,6 +228,13 @@ SUBROUTINE test_create(total_error)
CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V114_F, total_error)
CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V114_F, total_error)
+ CALL h5pset_libver_bounds_f(fapl, H5F_LIBVER_V116_F, H5F_LIBVER_V116_F, error)
+ CALL check("h5pset_libver_bounds_f",error, total_error)
+ CALL h5pget_libver_bounds_f(fapl, low, high, error)
+ CALL check("h5pget_libver_bounds_f",error, total_error)
+ CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V116_F, total_error)
+ CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V116_F, total_error)
+
CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
CALL check("H5Pset_libver_bounds_f",error, total_error)
CALL h5pget_libver_bounds_f(fapl, low, high, error)
diff --git a/src/H5Aint.c b/src/H5Aint.c
index 45df0dfbe3e..a459402f589 100644
--- a/src/H5Aint.c
+++ b/src/H5Aint.c
@@ -95,6 +95,7 @@ const unsigned H5O_attr_ver_bounds[] = {
H5O_ATTR_VERSION_3, /* H5F_LIBVER_V110 */
H5O_ATTR_VERSION_3, /* H5F_LIBVER_V112 */
H5O_ATTR_VERSION_3, /* H5F_LIBVER_V114 */
+ H5O_ATTR_VERSION_3, /* H5F_LIBVER_V116 */
H5O_ATTR_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Dlayout.c b/src/H5Dlayout.c
index 249bfcc41e7..bd3765e2236 100644
--- a/src/H5Dlayout.c
+++ b/src/H5Dlayout.c
@@ -48,6 +48,7 @@ const unsigned H5O_layout_ver_bounds[] = {
H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V110 */
H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V112 */
H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V114 */
+ H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V116 */
H5O_LAYOUT_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h
index 4214341b434..c6c50c2eef3 100644
--- a/src/H5Dpkg.h
+++ b/src/H5Dpkg.h
@@ -633,7 +633,7 @@ H5_DLLVAR const H5B2_class_t H5D_BT2[1];
H5_DLLVAR const H5B2_class_t H5D_BT2_FILT[1];
/* Array of versions for Layout */
-H5_DLLVAR const unsigned H5O_layout_ver_bounds[H5F_LIBVER_NBOUNDS];
+H5_DLLVAR const unsigned H5O_layout_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
/******************************/
/* Package Private Prototypes */
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index 5a32fc0ce68..550560d9387 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -71,6 +71,7 @@ static const unsigned HDF5_superblock_ver_bounds[] = {
HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V110 */
HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V112 */
HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V114 */
+ HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V116 */
HDF5_SUPERBLOCK_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index a481275d5b8..1b56be12580 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -153,6 +153,7 @@ const unsigned H5O_fill_ver_bounds[] = {
H5O_FILL_VERSION_3, /* H5F_LIBVER_V110 */
H5O_FILL_VERSION_3, /* H5F_LIBVER_V112 */
H5O_FILL_VERSION_3, /* H5F_LIBVER_V114 */
+ H5O_FILL_VERSION_3, /* H5F_LIBVER_V116 */
H5O_FILL_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Ofsinfo.c b/src/H5Ofsinfo.c
index f9cb8feb111..6e559792530 100644
--- a/src/H5Ofsinfo.c
+++ b/src/H5Ofsinfo.c
@@ -69,6 +69,7 @@ static const unsigned H5O_fsinfo_ver_bounds[] = {
H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V110 */
H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V112 */
H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V114 */
+ H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V116 */
H5O_FSINFO_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
#define N_FSINFO_VERSION_BOUNDS H5F_LIBVER_NBOUNDS
diff --git a/src/H5Oint.c b/src/H5Oint.c
index 5d4694d021c..2528fb93c68 100644
--- a/src/H5Oint.c
+++ b/src/H5Oint.c
@@ -127,6 +127,7 @@ const unsigned H5O_obj_ver_bounds[] = {
H5O_VERSION_2, /* H5F_LIBVER_V110 */
H5O_VERSION_2, /* H5F_LIBVER_V112 */
H5O_VERSION_2, /* H5F_LIBVER_V114 */
+ H5O_VERSION_2, /* H5F_LIBVER_V116 */
H5O_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index ee6126a818c..d4cab42471d 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -626,10 +626,10 @@ H5_DLL herr_t H5O__attr_count_real(H5F_t *f, H5O_t *oh, hsize_t *nattrs);
* Object header, Attribute/Fill value/Filter pipeline messages
*/
/* Layout/Datatype/Dataspace arrays of versions are in H5Dpkg.h, H5Tpkg.h and H5Spkg.h */
-H5_DLLVAR const unsigned H5O_obj_ver_bounds[H5F_LIBVER_NBOUNDS];
-H5_DLLVAR const unsigned H5O_attr_ver_bounds[H5F_LIBVER_NBOUNDS];
-H5_DLLVAR const unsigned H5O_fill_ver_bounds[H5F_LIBVER_NBOUNDS];
-H5_DLLVAR const unsigned H5O_pline_ver_bounds[H5F_LIBVER_NBOUNDS];
+H5_DLLVAR const unsigned H5O_obj_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
+H5_DLLVAR const unsigned H5O_attr_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
+H5_DLLVAR const unsigned H5O_fill_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
+H5_DLLVAR const unsigned H5O_pline_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
/* Testing functions */
#ifdef H5O_TESTING
diff --git a/src/H5Opline.c b/src/H5Opline.c
index 65c11fdfaa5..19af5442cb7 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -88,6 +88,7 @@ const unsigned H5O_pline_ver_bounds[] = {
H5O_PLINE_VERSION_2, /* H5F_LIBVER_V110 */
H5O_PLINE_VERSION_2, /* H5F_LIBVER_V112 */
H5O_PLINE_VERSION_2, /* H5F_LIBVER_V114 */
+ H5O_PLINE_VERSION_2, /* H5F_LIBVER_V116 */
H5O_PLINE_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5S.c b/src/H5S.c
index 3b8a825ee8c..d6611654729 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -61,6 +61,7 @@ const unsigned H5O_sdspace_ver_bounds[] = {
H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V110 */
H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V112 */
H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V114 */
+ H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V116 */
H5O_SDSPACE_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Shyper.c b/src/H5Shyper.c
index 143839265ac..bc5d6c3db96 100644
--- a/src/H5Shyper.c
+++ b/src/H5Shyper.c
@@ -235,12 +235,13 @@ const H5S_select_class_t H5S_sel_hyper[1] = {{
}};
/* Format version bounds for dataspace hyperslab selection */
-const unsigned H5O_sds_hyper_ver_bounds[] = {
+static const unsigned H5O_sds_hyper_ver_bounds[] = {
H5S_HYPER_VERSION_1, /* H5F_LIBVER_EARLIEST */
H5S_HYPER_VERSION_1, /* H5F_LIBVER_V18 */
H5S_HYPER_VERSION_2, /* H5F_LIBVER_V110 */
H5S_HYPER_VERSION_3, /* H5F_LIBVER_V112 */
H5S_HYPER_VERSION_3, /* H5F_LIBVER_V114 */
+ H5S_HYPER_VERSION_3, /* H5F_LIBVER_V116 */
H5S_HYPER_VERSION_3 /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Spkg.h b/src/H5Spkg.h
index e851f548f94..ea0feefffa7 100644
--- a/src/H5Spkg.h
+++ b/src/H5Spkg.h
@@ -382,7 +382,7 @@ H5_DLLVAR const H5S_select_class_t H5S_sel_none[1];
H5_DLLVAR const H5S_select_class_t H5S_sel_point[1];
/* Array of versions for Dataspace */
-H5_DLLVAR const unsigned H5O_sdspace_ver_bounds[H5F_LIBVER_NBOUNDS];
+H5_DLLVAR const unsigned H5O_sdspace_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
/* Extent functions */
H5_DLL herr_t H5S__extent_release(H5S_extent_t *extent);
diff --git a/src/H5Spoint.c b/src/H5Spoint.c
index 142332d6252..e102969657b 100644
--- a/src/H5Spoint.c
+++ b/src/H5Spoint.c
@@ -120,12 +120,13 @@ const H5S_select_class_t H5S_sel_point[1] = {{
}};
/* Format version bounds for dataspace point selection */
-const unsigned H5O_sds_point_ver_bounds[] = {
+static const unsigned H5O_sds_point_ver_bounds[] = {
H5S_POINT_VERSION_1, /* H5F_LIBVER_EARLIEST */
H5S_POINT_VERSION_1, /* H5F_LIBVER_V18 */
H5S_POINT_VERSION_1, /* H5F_LIBVER_V110 */
H5S_POINT_VERSION_2, /* H5F_LIBVER_V112 */
H5S_POINT_VERSION_2, /* H5F_LIBVER_V114 */
+ H5S_POINT_VERSION_2, /* H5F_LIBVER_V116 */
H5S_POINT_VERSION_2 /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5T.c b/src/H5T.c
index 23993b3d639..dcf0a679fed 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -609,6 +609,7 @@ const unsigned H5O_dtype_ver_bounds[] = {
H5O_DTYPE_VERSION_3, /* H5F_LIBVER_V110 */
H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V112 */
H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V114 */
+ H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V116 */
H5O_DTYPE_VERSION_LATEST /* H5F_LIBVER_LATEST */
};
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index 8ceea058592..c3171ca0b81 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -344,7 +344,7 @@ typedef struct {
typedef herr_t (*H5T_operator_t)(H5T_t *dt, void *op_data /*in,out*/);
/* Array of versions for Datatype */
-H5_DLLVAR const unsigned H5O_dtype_ver_bounds[H5F_LIBVER_NBOUNDS];
+H5_DLLVAR const unsigned H5O_dtype_ver_bounds[H5F_LIBVER_NBOUNDS + 1];
/*
* Alignment constraints for HDF5 types. Accessing objects of these
diff --git a/src/H5VLcallback.c b/src/H5VLcallback.c
index 2d89d50e7af..196a559608f 100644
--- a/src/H5VLcallback.c
+++ b/src/H5VLcallback.c
@@ -739,7 +739,10 @@ H5VL_get_wrap_ctx(const H5VL_class_t *connector, void *obj, void **wrap_ctx)
/*---------------------------------------------------------------------------
* Function: H5VLget_wrap_ctx
*
- * Purpose: Get a VOL connector's object wrapping context
+ * Purpose: Get a VOL connector's object wrapping context. The output
+ * wrap context is stored in memory allocated by the VOL callback
+ * under *wrap_ctx and must be freed by the caller through
+ * H5VLfree_wrap_ctx().
*
* Return: Success: Non-negative
* Failure: Negative
diff --git a/src/H5VLconnector.h b/src/H5VLconnector.h
index 02d22314ebc..83a5b087133 100644
--- a/src/H5VLconnector.h
+++ b/src/H5VLconnector.h
@@ -845,7 +845,8 @@ typedef struct H5VL_info_class_t {
} H5VL_info_class_t;
/* VOL object wrap / retrieval callbacks */
-/* (These only need to be implemented by "pass through" VOL connectors) */
+/* (These must be implemented by "pass through" VOL connectors, and should not be implemented by terminal VOL
+ * connectors) */
typedef struct H5VL_wrap_class_t {
void *(*get_object)(const void *obj); /* Callback to retrieve underlying object */
herr_t (*get_wrap_ctx)(
diff --git a/src/H5VLint.c b/src/H5VLint.c
index 1aef656cf65..4c7b38af521 100644
--- a/src/H5VLint.c
+++ b/src/H5VLint.c
@@ -55,7 +55,16 @@
/* Local Typedefs */
/******************/
-/* Object wrapping context info */
+/* Object wrapping context info for passthrough VOL connectors.
+ * Passthrough VOL connectors must wrap objects returned from lower level(s) of the VOL connector stack
+ * so that they may be passed back up the stack to the library, and must unwrap objects
+ * passed down the stack before providing them to the next lower VOL connector.
+ * This is generally done individually within each VOL object callback. However, the library sometimes
+ * needs to wrap objects from places that don't pass through the VOL layer.
+ * In this case, the wrap callbacks defined in H5VL_wrap_class_t are used, and the VOL-defined wrap context
+ * (obj_wrap_ctx) provides necessary information - at a minimum, the object originally returned by the lower
+ * VOL connector, and the ID of the next VOL connector.
+ */
typedef struct H5VL_wrap_ctx_t {
unsigned rc; /* Ref. count for the # of times the context was set / reset */
H5VL_t *connector; /* VOL connector for "outermost" class to start wrap */
diff --git a/test/API/H5_api_attribute_test.c b/test/API/H5_api_attribute_test.c
index fd56be82989..7b8f33e8720 100644
--- a/test/API/H5_api_attribute_test.c
+++ b/test/API/H5_api_attribute_test.c
@@ -8814,15 +8814,11 @@ test_attribute_string_encodings(void)
PASSED();
}
PART_END(UTF8_cset);
-
- PASSED();
}
END_MULTIPART;
TESTING_2("test cleanup");
- if (H5Fclose(file_id) < 0)
- TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Dclose(dset_id1) < 0)
@@ -8837,6 +8833,8 @@ test_attribute_string_encodings(void)
TEST_ERROR;
if (H5Aclose(attr_id2) < 0)
TEST_ERROR;
+ if (H5Fclose(file_id) < 0)
+ TEST_ERROR;
if (write_buf)
free(write_buf);
if (read_buf)
@@ -8848,7 +8846,6 @@ test_attribute_string_encodings(void)
error:
H5E_BEGIN_TRY
{
- H5Fclose(file_id);
H5Gclose(container_group);
H5Dclose(dset_id1);
H5Dclose(dset_id2);
@@ -8856,6 +8853,7 @@ test_attribute_string_encodings(void)
H5Tclose(type_id2);
H5Aclose(attr_id1);
H5Aclose(attr_id2);
+ H5Fclose(file_id);
if (write_buf)
free(write_buf);
if (read_buf)
diff --git a/test/API/H5_api_group_test.c b/test/API/H5_api_group_test.c
index 0203ebe3af2..8858506d5a8 100644
--- a/test/API/H5_api_group_test.c
+++ b/test/API/H5_api_group_test.c
@@ -1473,15 +1473,17 @@ test_get_group_info(void)
PART_ERROR(H5Gget_info);
}
- /*
- * For the purpose of this test, the max creation order should match
- * the number of links in the group.
- */
- if (group_info.max_corder != GROUP_GET_INFO_TEST_GROUP_NUMB) {
- H5_FAILED();
- printf(" group's max creation order '%lld' doesn't match expected value '%lld'\n",
- (long long)group_info.max_corder, (long long)GROUP_GET_INFO_TEST_GROUP_NUMB);
- PART_ERROR(H5Gget_info);
+ if (vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER) {
+ /*
+ * For the purpose of this test, the max creation order should match
+ * the number of links in the group.
+ */
+ if (group_info.max_corder != GROUP_GET_INFO_TEST_GROUP_NUMB) {
+ H5_FAILED();
+ printf(" group's max creation order '%lld' doesn't match expected value '%lld'\n",
+ (long long)group_info.max_corder, (long long)GROUP_GET_INFO_TEST_GROUP_NUMB);
+ PART_ERROR(H5Gget_info);
+ }
}
/* Ensure that the storage_type field is at least set to a meaningful value */
@@ -1526,15 +1528,17 @@ test_get_group_info(void)
PART_ERROR(H5Gget_info_by_name);
}
- /*
- * For the purpose of this test, the max creation order should match
- * the number of links in the group.
- */
- if (group_info.max_corder != GROUP_GET_INFO_TEST_GROUP_NUMB) {
- H5_FAILED();
- printf(" group's max creation order '%lld' doesn't match expected value '%lld'\n",
- (long long)group_info.max_corder, (long long)GROUP_GET_INFO_TEST_GROUP_NUMB);
- PART_ERROR(H5Gget_info_by_name);
+ if (vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER) {
+ /*
+ * For the purpose of this test, the max creation order should match
+ * the number of links in the group.
+ */
+ if (group_info.max_corder != GROUP_GET_INFO_TEST_GROUP_NUMB) {
+ H5_FAILED();
+ printf(" group's max creation order '%lld' doesn't match expected value '%lld'\n",
+ (long long)group_info.max_corder, (long long)GROUP_GET_INFO_TEST_GROUP_NUMB);
+ PART_ERROR(H5Gget_info_by_name);
+ }
}
/* Ensure that the storage_type field is at least set to a meaningful value */
diff --git a/test/API/H5_api_link_test.c b/test/API/H5_api_link_test.c
index e6810846e3f..65527709904 100644
--- a/test/API/H5_api_link_test.c
+++ b/test/API/H5_api_link_test.c
@@ -3920,6 +3920,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on hard link by creation order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_hard_crt_order_increasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -4153,6 +4159,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on hard link by creation order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_hard_crt_order_decreasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -4386,6 +4398,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on hard link by alphabetical order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_hard_name_order_increasing);
+ }
+
if ((subgroup_id = H5Gcreate2(group_id, LINK_DELETE_TEST_SUBGROUP7_NAME, H5P_DEFAULT, gcpl_id,
H5P_DEFAULT)) < 0) {
H5_FAILED();
@@ -4613,6 +4631,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on hard link by alphabetical order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_hard_name_order_decreasing);
+ }
+
if ((subgroup_id = H5Gcreate2(group_id, LINK_DELETE_TEST_SUBGROUP8_NAME, H5P_DEFAULT, gcpl_id,
H5P_DEFAULT)) < 0) {
H5_FAILED();
@@ -4840,6 +4864,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on soft link by creation order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_soft_crt_order_increasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -5076,6 +5106,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on soft link by creation order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_soft_crt_order_decreasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -5312,6 +5348,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on soft link by alphabetical order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_soft_name_order_increasing);
+ }
+
if ((subgroup_id = H5Gcreate2(group_id, LINK_DELETE_TEST_SUBGROUP11_NAME, H5P_DEFAULT, gcpl_id,
H5P_DEFAULT)) < 0) {
H5_FAILED();
@@ -5542,6 +5584,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on soft link by alphabetical order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_soft_name_order_decreasing);
+ }
+
if ((subgroup_id = H5Gcreate2(group_id, LINK_DELETE_TEST_SUBGROUP12_NAME, H5P_DEFAULT, gcpl_id,
H5P_DEFAULT)) < 0) {
H5_FAILED();
@@ -5772,6 +5820,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on external link by creation order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_external_crt_order_increasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -6054,6 +6108,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on external link by creation order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_external_crt_order_decreasing);
+ }
+
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
SKIPPED();
printf(" creation order tracking isn't supported with this VOL connector\n");
@@ -6336,6 +6396,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on external link by alphabetical order in increasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_external_name_order_increasing);
+ }
+
/* Create file for external link to reference */
snprintf(ext_link_filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
EXTERNAL_LINK_TEST_FILE_NAME);
@@ -6612,6 +6678,12 @@ test_delete_link(void)
{
TESTING_2("H5Ldelete_by_idx on external link by alphabetical order in decreasing order");
+ if (!(vol_cap_flags_g & H5VL_CAP_FLAG_BY_IDX)) {
+ SKIPPED();
+ printf(" by index isn't supported with this VOL connector\n");
+ PART_EMPTY(H5Ldelete_by_idx_external_name_order_decreasing);
+ }
+
/* Create file for external link to reference */
snprintf(ext_link_filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
EXTERNAL_LINK_TEST_FILE_NAME);
diff --git a/test/API/H5_api_object_test.c b/test/API/H5_api_object_test.c
index 77af8c9cfc2..7d3de346c33 100644
--- a/test/API/H5_api_object_test.c
+++ b/test/API/H5_api_object_test.c
@@ -4196,6 +4196,7 @@ test_object_copy_between_files(void)
hid_t attr_space_id = H5I_INVALID_HID;
hid_t space_id = H5I_INVALID_HID;
hid_t ocpypl_id = H5I_INVALID_HID;
+ char filename[H5_API_TEST_FILENAME_MAX_LENGTH];
TESTING_MULTIPART("object copying between files");
@@ -4749,6 +4750,10 @@ test_object_copy_between_files(void)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
+ snprintf(filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
+ OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME);
+ if (H5Fdelete(filename, H5P_DEFAULT) < 0)
+ TEST_ERROR;
PASSED();
@@ -5067,6 +5072,7 @@ test_object_visit(void)
hssize_t num_elems = 0;
size_t elem_size = 0;
char visit_filename[H5_API_TEST_FILENAME_MAX_LENGTH];
+ char filename[H5_API_TEST_FILENAME_MAX_LENGTH];
TESTING_MULTIPART("object visiting");
@@ -5708,6 +5714,12 @@ test_object_visit(void)
TEST_ERROR;
if (H5Fclose(file_id2) < 0)
TEST_ERROR;
+ snprintf(filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
+ OBJECT_VISIT_TEST_FILE_NAME);
+ if (H5Fdelete(filename, H5P_DEFAULT) < 0)
+ TEST_ERROR;
+ if (H5Fdelete(visit_filename, H5P_DEFAULT) < 0)
+ TEST_ERROR;
PASSED();
@@ -7363,23 +7375,6 @@ object_visit_noop_callback(hid_t o_id, const char *name, const H5O_info2_t *obje
return 0;
}
-/*
- * Cleanup temporary test files
- */
-static void
-cleanup_files(void)
-{
- char filename[H5_API_TEST_FILENAME_MAX_LENGTH];
-
- snprintf(filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
- OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME);
- H5Fdelete(filename, H5P_DEFAULT);
-
- snprintf(filename, H5_API_TEST_FILENAME_MAX_LENGTH, "%s%s", test_path_prefix,
- OBJECT_VISIT_TEST_FILE_NAME);
- H5Fdelete(filename, H5P_DEFAULT);
-}
-
int
H5_api_object_test(void)
{
@@ -7398,8 +7393,5 @@ H5_api_object_test(void)
printf("\n");
- printf("Cleaning up testing files\n");
- cleanup_files();
-
return nerrors;
}
diff --git a/test/dtypes.c b/test/dtypes.c
index a457767a477..86cd27e3868 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -10115,7 +10115,7 @@ test_versionbounds(void)
hsize_t arr_dim[] = {ARRAY_LEN}; /* Length of the array */
int low, high; /* Indices for iterating over versions */
H5F_libver_t versions[] = {H5F_LIBVER_EARLIEST, H5F_LIBVER_V18, H5F_LIBVER_V110,
- H5F_LIBVER_V112, H5F_LIBVER_V114, H5F_LIBVER_V114};
+ H5F_LIBVER_V112, H5F_LIBVER_V114, H5F_LIBVER_V116};
int versions_count = 6; /* Number of version bounds in the array */
unsigned highest_version; /* Highest version in nested datatypes */
color_t enum_val; /* Enum type index */
diff --git a/test/h5test.c b/test/h5test.c
index 97e413ac4a8..c18efdc7dff 100644
--- a/test/h5test.c
+++ b/test/h5test.c
@@ -106,7 +106,8 @@ const char *LIBVER_NAMES[] = {"earliest", /* H5F_LIBVER_EARLIEST = 0 */
"v110", /* H5F_LIBVER_V110 = 2 */
"v112", /* H5F_LIBVER_V112 = 3 */
"v114", /* H5F_LIBVER_V114 = 4 */
- "latest", /* H5F_LIBVER_V116 = 5 */
+ "v116", /* H5F_LIBVER_V116 = 5 */
+ "latest", /* H5F_LIBVER_LATEST */
NULL};
/* Previous error reporting function */