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. @@ -696,7 +706,7 @@ Retrieves an underlying object. @@ -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:
\code - obj (IN): Object being unwrapped. + obj (IN): The object to be unwrapped. \endcode
@@ -721,7 +734,7 @@ Get a VOL connector's object wrapping context. @@ -729,7 +742,11 @@ Get a VOL connector's object wrapping context.
Signature:
\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
\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. @@ -747,7 +764,7 @@ Asks a connector to wrap an underlying object.
Signature:
\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. + @@ -774,14 +794,15 @@ Unwrap an object from connector.
Signature:
\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. 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 */
Signature: