summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Mainzer <mainzer@hdfgroup.org>2008-02-18 05:28:04 (GMT)
committerJohn Mainzer <mainzer@hdfgroup.org>2008-02-18 05:28:04 (GMT)
commitcd571e4a45e5af71ae608388141e6b28a16f8171 (patch)
tree27a6b76035cd03c2b13946730225b34f0f03d98d
parentd3e926b897b42d27e1c5f8533a8a413c448738e2 (diff)
downloadhdf5-cd571e4a45e5af71ae608388141e6b28a16f8171.zip
hdf5-cd571e4a45e5af71ae608388141e6b28a16f8171.tar.gz
hdf5-cd571e4a45e5af71ae608388141e6b28a16f8171.tar.bz2
[svn-r14594] Ported flash cache size increase code into the journaling branch --
note that both the H5C and H5C2 code have been updated. Also checked in code to track journaling status in the super block. Note that this code has not been tested -- but as best I can tell, it does not break the existing regression tests. Tested serial (debug and production) on Phoenix. Also tested parallel on kagiso. Note that regression test fails on kagiso (but not on phoenix) if the cache2 serial tests are configured to use the core file driver. Thus this code is check in with the core file driver optimization of the cache2 tests disabled. To turn it on, set the USE_CORE_DRIVER #define to TRUE.
-rw-r--r--MANIFEST1
-rwxr-xr-xconfigure2
-rw-r--r--src/H5AC.c23
-rw-r--r--src/H5AC2.c27
-rw-r--r--src/H5AC2private.h4
-rw-r--r--src/H5AC2public.h60
-rw-r--r--src/H5ACprivate.h4
-rw-r--r--src/H5ACpublic.h61
-rw-r--r--src/H5C.c993
-rw-r--r--src/H5C2.c599
-rw-r--r--src/H5C2journal.c519
-rw-r--r--src/H5C2pkg.h14
-rw-r--r--src/H5C2private.h104
-rw-r--r--src/H5C2public.h7
-rw-r--r--src/H5Cpkg.h22
-rw-r--r--src/H5Cprivate.h130
-rw-r--r--src/H5Cpublic.h6
-rw-r--r--src/H5Fpkg.h5
-rw-r--r--src/H5Fsuper.c105
-rw-r--r--src/H5O.c15
-rw-r--r--src/H5Opkg.h7
-rw-r--r--src/H5Oprivate.h59
-rwxr-xr-xsrc/Makefile.am2
-rw-r--r--src/Makefile.in78
-rw-r--r--test/cache.c1957
-rw-r--r--test/cache2.c1958
-rw-r--r--test/cache2_api.c785
-rw-r--r--test/cache2_common.c107
-rw-r--r--test/cache2_common.h5
-rw-r--r--test/cache_api.c416
-rw-r--r--test/cache_common.c107
-rw-r--r--test/cache_common.h5
-rw-r--r--test/tbogus.h5bin1944 -> 1944 bytes
-rw-r--r--testpar/t_cache.c2
-rw-r--r--testpar/t_cache2.c10
35 files changed, 7729 insertions, 470 deletions
diff --git a/MANIFEST b/MANIFEST
index 8086ca8..d9fbcda 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -452,6 +452,7 @@
./src/H5Cprivate.h
./src/H5Cpublic.h
./src/H5C2.c
+./src/H5C2journal.c
./src/H5C2pkg.h
./src/H5C2private.h
./src/H5C2public.h
diff --git a/configure b/configure
index 1eba2e2..1d4979a 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.in Id: configure.in 14270 2007-11-20 04:43:58Z acheng .
+# From configure.in Id: configure.in 14483 2008-02-01 06:51:09Z acheng .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.61 for HDF5 1.8.0-beta4post1.
#
diff --git a/src/H5AC.c b/src/H5AC.c
index 8f62095..cd79e6a 100644
--- a/src/H5AC.c
+++ b/src/H5AC.c
@@ -2546,6 +2546,10 @@ done:
* switches for functions that are only tenuously related
* to auto resize configuration.
*
+ * JRM - 1/2/08
+ * Added support for the new flash cache increment related
+ * fields.
+ *
*-------------------------------------------------------------------------
*/
@@ -2625,6 +2629,9 @@ H5AC_get_cache_auto_resize_config(H5AC_t * cache_ptr,
config_ptr->max_increment = internal_config.max_increment;
config_ptr->decr_mode = internal_config.decr_mode;
config_ptr->upper_hr_threshold = internal_config.upper_hr_threshold;
+ config_ptr->flash_incr_mode = internal_config.flash_incr_mode;
+ config_ptr->flash_multiple = internal_config.flash_multiple;
+ config_ptr->flash_threshold = internal_config.flash_threshold;
config_ptr->decrement = internal_config.decrement;
config_ptr->apply_max_decrement = internal_config.apply_max_decrement;
config_ptr->max_decrement = internal_config.max_decrement;
@@ -2816,6 +2823,10 @@ done:
* switches for functions that are only tenuously related
* to auto resize configuration.
*
+ * John Mainzer -- 1/3/07
+ * Updated trace file code to record the new flash cache
+ * size increase related fields.
+ *
*-------------------------------------------------------------------------
*/
@@ -2969,7 +2980,7 @@ done:
( trace_file_ptr != NULL ) ) {
HDfprintf(trace_file_ptr,
- "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %d %d %f %f %d %d %d %d %f %d %d\n",
+ "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %f %f %d %d %d %f %f %d %d %d %d %f %d %d\n",
"H5AC_set_cache_auto_resize_config",
trace_config.version,
(int)(trace_config.rpt_fcn_enabled),
@@ -2986,6 +2997,9 @@ done:
(int)(trace_config.incr_mode),
trace_config.lower_hr_threshold,
trace_config.increment,
+ (int)(trace_config.flash_incr_mode),
+ trace_config.flash_multiple,
+ trace_config.flash_threshold,
(int)(trace_config.apply_max_increment),
(int)(trace_config.max_increment),
(int)(trace_config.decr_mode),
@@ -3618,7 +3632,9 @@ done:
*
* Modifications:
*
- * None.
+ * Updated function for flash cache increment fields.
+ *
+ * JRM -- 1/2/08
*
*-------------------------------------------------------------------------
*/
@@ -3661,6 +3677,9 @@ H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
int_conf_ptr->increment = ext_conf_ptr->increment;
int_conf_ptr->apply_max_increment = ext_conf_ptr->apply_max_increment;
int_conf_ptr->max_increment = ext_conf_ptr->max_increment;
+ int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode;
+ int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple;
+ int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold;
int_conf_ptr->decr_mode = ext_conf_ptr->decr_mode;
int_conf_ptr->upper_hr_threshold = ext_conf_ptr->upper_hr_threshold;
diff --git a/src/H5AC2.c b/src/H5AC2.c
index a053b36..49e4934 100644
--- a/src/H5AC2.c
+++ b/src/H5AC2.c
@@ -2587,6 +2587,10 @@ done:
* Modified code in support of revised cache API needed
* to permit journaling.
*
+ * JRM - 1/2/08
+ * Added support for the new flash cache increment related
+ * fields.
+ *
*-------------------------------------------------------------------------
*/
@@ -2665,6 +2669,9 @@ H5AC2_get_cache_auto_resize_config(H5AC2_t * cache_ptr,
config_ptr->increment = internal_config.increment;
config_ptr->apply_max_increment = internal_config.apply_max_increment;
config_ptr->max_increment = internal_config.max_increment;
+ config_ptr->flash_incr_mode = internal_config.flash_incr_mode;
+ config_ptr->flash_multiple = internal_config.flash_multiple;
+ config_ptr->flash_threshold = internal_config.flash_threshold;
config_ptr->decr_mode = internal_config.decr_mode;
config_ptr->upper_hr_threshold = internal_config.upper_hr_threshold;
config_ptr->decrement = internal_config.decrement;
@@ -2868,6 +2875,10 @@ done:
* Modified code in support of revised cache API needed
* to permit journaling.
*
+ * John Mainzer -- 1/3/07
+ * Updated trace file code to record the new flash cache
+ * size increase related fields.
+ *
*-------------------------------------------------------------------------
*/
@@ -3021,7 +3032,7 @@ done:
( trace_file_ptr != NULL ) ) {
HDfprintf(trace_file_ptr,
- "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %d %d %f %f %d %d %d %d %f %d %d\n",
+ "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %d %d %f %f %d %f %f %d %d %d %d %f %d %d\n",
"H5AC2_set_cache_auto_resize_config",
trace_config.version,
(int)(trace_config.rpt_fcn_enabled),
@@ -3040,6 +3051,9 @@ done:
trace_config.increment,
(int)(trace_config.apply_max_increment),
(int)(trace_config.max_increment),
+ (int)(trace_config.flash_incr_mode),
+ trace_config.flash_multiple,
+ trace_config.flash_threshold,
(int)(trace_config.decr_mode),
trace_config.upper_hr_threshold,
trace_config.decrement,
@@ -3379,7 +3393,7 @@ H5AC2_open_trace_file(H5AC2_t * cache_ptr,
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.")
}
- HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 1 ###\n");
+ HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 2 ###\n");
if ( H5C2_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) {
@@ -3678,7 +3692,10 @@ done:
*
* Modifications:
*
- * None.
+ * Updated function for flash cache increment fields.
+ *
+ * JRM -- 1/2/08
+ *
*
*-------------------------------------------------------------------------
*/
@@ -3721,6 +3738,10 @@ H5AC2_ext_config_2_int_config(H5AC2_cache_config_t * ext_conf_ptr,
int_conf_ptr->increment = ext_conf_ptr->increment;
int_conf_ptr->apply_max_increment = ext_conf_ptr->apply_max_increment;
int_conf_ptr->max_increment = ext_conf_ptr->max_increment;
+ int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode;
+ int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple;
+ int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold;
+
int_conf_ptr->decr_mode = ext_conf_ptr->decr_mode;
int_conf_ptr->upper_hr_threshold = ext_conf_ptr->upper_hr_threshold;
diff --git a/src/H5AC2private.h b/src/H5AC2private.h
index de76b40..ca2522f 100644
--- a/src/H5AC2private.h
+++ b/src/H5AC2private.h
@@ -202,6 +202,10 @@ extern hid_t H5AC2_ind_dxpl_id;
/* double increment = */ 2.0, \
/* hbool_t apply_max_increment = */ TRUE, \
/* size_t max_increment = */ (4 * 1024 * 1024), \
+ /* enum H5C2_cache_flash_incr_mode */ \
+ /* flash_incr_mode = */ H5C2_flash_incr__add_space, \
+ /* double flash_multiple = */ 1.0, \
+ /* double flash_threshold = */ 0.25, \
/* enum H5C2_cache_decr_mode decr_mode = */ \
H5C2_decr__age_out_with_threshold, \
/* double upper_hr_threshold = */ 0.999, \
diff --git a/src/H5AC2public.h b/src/H5AC2public.h
index 3c88ef1..a16ad2a 100644
--- a/src/H5AC2public.h
+++ b/src/H5AC2public.h
@@ -15,7 +15,7 @@
/*-------------------------------------------------------------------------
*
- * Created: H5ACpublic.h
+ * Created: H5AC2public.h
* Jul 10 1997
* Robb Matzke <matzke@llnl.gov>
*
@@ -208,6 +208,60 @@ extern "C" {
* above, this field contains the maximum number of bytes by which the
* cache size can be increased in a single re-size.
*
+ * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated
+ * type whose value indicates whether and by which algorithm we should
+ * make flash increases in the size of the cache to accomodate insertion
+ * of large entries and large increases in the size of a single entry.
+ *
+ * The addition of the flash increment mode was occasioned by performance
+ * problems that appear when a local heap is increased to a size in excess
+ * of the current cache size. While the existing re-size code dealt with
+ * this eventually, performance was very bad for the remainder of the
+ * epoch.
+ *
+ * At present, there are two possible values for the flash_incr_mode:
+ *
+ * H5C_flash_incr__off: Don't perform flash increases in the size of
+ * the cache.
+ *
+ * H5C_flash_incr__add_space: Let x be either the size of a newly
+ * newly inserted entry, or the number of bytes by which the
+ * size of an existing entry has been increased.
+ *
+ * If
+ * x > flash_threshold * current max cache size,
+ *
+ * increase the current maximum cache size by x * flash_multiple
+ * less any free space in the cache, and star a new epoch. For
+ * now at least, pay no attention to the maximum increment.
+ *
+ * In both of the above cases, the flash increment pays no attention to
+ * the maximum increment (at least in this first incarnation), but DOES
+ * stay within max_size.
+ *
+ * With a little thought, it should be obvious that the above flash
+ * cache size increase algorithm is not sufficient for all circumstances
+ * -- for example, suppose the user round robins through
+ * (1/flash_threshold) +1 groups, adding one data set to each on each
+ * pass. Then all will increase in size at about the same time, requiring
+ * the max cache size to at least double to maintain acceptable
+ * performance, however the above flash increment algorithm will not be
+ * triggered.
+ *
+ * Hopefully, the add space algorithms detailed above will be sufficient
+ * for the performance problems encountered to date. However, we should
+ * expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ * H5C_flash_incr__add_space section of the discussion of the
+ * flash_incr_mode section. This field is ignored unless flash_incr_mode
+ * is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache
+ * size is multiplied to obtain the size threshold for the add_space flash
+ * increment algorithm. The field is ignored unless flash_incr_mode is
+ * H5C_flash_incr__add_space.
+ *
*
* Cache size decrease control fields:
*
@@ -364,6 +418,10 @@ typedef struct H5AC2_cache_config_t
hbool_t apply_max_increment;
size_t max_increment;
+ enum H5C2_cache_flash_incr_mode flash_incr_mode;
+ double flash_multiple;
+ double flash_threshold;
+
/* size decrease control fields: */
enum H5C2_cache_decr_mode decr_mode;
diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h
index 628a269..bbbcf11 100644
--- a/src/H5ACprivate.h
+++ b/src/H5ACprivate.h
@@ -213,6 +213,10 @@ extern hid_t H5AC_ind_dxpl_id;
/* double increment = */ 2.0, \
/* hbool_t apply_max_increment = */ TRUE, \
/* size_t max_increment = */ (4 * 1024 * 1024), \
+ /* enum H5C_cache_flash_incr_mode */ \
+ /* flash_incr_mode = */ H5C_flash_incr__add_space, \
+ /* double flash_multiple = */ 1.0, \
+ /* double flash_threshold = */ 0.25, \
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,\
/* double upper_hr_threshold = */ 0.999, \
/* double decrement = */ 0.9, \
diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h
index 0ddef92..0e75117 100644
--- a/src/H5ACpublic.h
+++ b/src/H5ACpublic.h
@@ -15,7 +15,7 @@
/*-------------------------------------------------------------------------
*
- * Created: H5ACproto.h
+ * Created: H5ACpublic.h
* Jul 10 1997
* Robb Matzke <matzke@llnl.gov>
*
@@ -208,6 +208,61 @@ extern "C" {
* above, this field contains the maximum number of bytes by which the
* cache size can be increased in a single re-size.
*
+ * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated
+ * type whose value indicates whether and by which algorithm we should
+ * make flash increases in the size of the cache to accomodate insertion
+ * of large entries and large increases in the size of a single entry.
+ *
+ * The addition of the flash increment mode was occasioned by performance
+ * problems that appear when a local heap is increased to a size in excess
+ * of the current cache size. While the existing re-size code dealt with
+ * this eventually, performance was very bad for the remainder of the
+ * epoch.
+ *
+ * At present, there are two possible values for the flash_incr_mode:
+ *
+ * H5C_flash_incr__off: Don't perform flash increases in the size of
+ * the cache.
+ *
+ * H5C_flash_incr__add_space: Let x be either the size of a newly
+ * newly inserted entry, or the number of bytes by which the
+ * size of an existing entry has been increased.
+ *
+ * If
+ * x > flash_threshold * current max cache size,
+ *
+ * increase the current maximum cache size by x * flash_multiple
+ * less any free space in the cache, and star a new epoch. For
+ * now at least, pay no attention to the maximum increment.
+ *
+ * In both of the above cases, the flash increment pays no attention to
+ * the maximum increment (at least in this first incarnation), but DOES
+ * stay within max_size.
+ *
+ * With a little thought, it should be obvious that the above flash
+ * cache size increase algorithm is not sufficient for all circumstances --
+ * for example, suppose the user round robins through
+ * (1/flash_threshold) +1 groups, adding one data set to each on each
+ * pass. Then all will increase in size at about the same time, requiring
+ * the max cache size to at least double to maintain acceptable
+ * performance, however the above flash increment algorithm will not be
+ * triggered.
+ *
+ * Hopefully, the add space algorithms detailed above will be sufficient
+ * for the performance problems encountered to date. However, we should
+ * expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ * H5C_flash_incr__add_space section of the discussion of the
+ * flash_incr_mode section. This field is ignored unless flash_incr_mode
+ * is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache size
+ * is multiplied to obtain the size threshold for the add_space flash
+ * increment algorithm. The field is ignored unless flash_incr_mode is
+ * H5C_flash_incr__add_space.
+ *
+ *
*
* Cache size decrease control fields:
*
@@ -364,6 +419,10 @@ typedef struct H5AC_cache_config_t
hbool_t apply_max_increment;
size_t max_increment;
+ enum H5C_cache_flash_incr_mode flash_incr_mode;
+ double flash_multiple;
+ double flash_threshold;
+
/* size decrease control fields: */
enum H5C_cache_decr_mode decr_mode;
diff --git a/src/H5C.c b/src/H5C.c
index 8ac9929..daa5c8b 100644
--- a/src/H5C.c
+++ b/src/H5C.c
@@ -2596,6 +2596,10 @@ static herr_t H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr);
static herr_t H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr);
+static herr_t H5C__flash_increase_cache_size(H5C_t * cache_ptr,
+ size_t old_entry_size,
+ size_t new_entry_size);
+
static herr_t H5C_flush_single_entry(H5F_t * f,
hid_t primary_dxpl_id,
hid_t secondary_dxpl_id,
@@ -2836,8 +2840,12 @@ done:
* ro_ref_count fields.
*
* JRM -- 7/27/07
-* Added initialization for the new evictions_enabled
-* field of H5C_t.
+ * Added initialization for the new evictions_enabled
+ * field of H5C_t.
+ *
+ * JRM -- 12/31/07
+ * Added initialization for the new flash cache size increase
+ * related fields of H5C_t.
*
*-------------------------------------------------------------------------
*/
@@ -2954,6 +2962,8 @@ H5C_create(size_t max_cache_size,
cache_ptr->dLRU_tail_ptr = NULL;
cache_ptr->size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_threshold = 0;
cache_ptr->size_decrease_possible = FALSE;
cache_ptr->resize_enabled = FALSE;
cache_ptr->cache_full = FALSE;
@@ -2974,6 +2984,11 @@ H5C_create(size_t max_cache_size,
(cache_ptr->resize_ctl).apply_max_increment = TRUE;
(cache_ptr->resize_ctl).max_increment = H5C__DEF_AR_MAX_INCREMENT;
+ (cache_ptr->resize_ctl).flash_incr_mode = H5C_flash_incr__off;
+ (cache_ptr->resize_ctl).flash_multiple = 1.0;
+ (cache_ptr->resize_ctl).flash_threshold = 0.25;
+
+
(cache_ptr->resize_ctl).decr_mode = H5C_decr__off;
(cache_ptr->resize_ctl).upper_hr_threshold = H5C__DEF_AR_UPPER_THRESHHOLD;
(cache_ptr->resize_ctl).decrement = H5C__DEF_AR_DECREMENT;
@@ -2993,7 +3008,10 @@ H5C_create(size_t max_cache_size,
for ( i = 0; i < H5C__MAX_EPOCH_MARKERS; i++ )
{
(cache_ptr->epoch_marker_active)[i] = FALSE;
-
+#ifndef NDEBUG
+ ((cache_ptr->epoch_markers)[i]).magic =
+ H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
((cache_ptr->epoch_markers)[i]).addr = (haddr_t)i;
((cache_ptr->epoch_markers)[i]).size = (size_t)0;
((cache_ptr->epoch_markers)[i]).type = &epoch_marker_class;
@@ -3079,6 +3097,9 @@ done:
* Updated function for display the new prefix field of
* H5C_t in output.
*
+ * JRM 12/31/07
+ * Updated function to handle flash size increases.
+ *
*-------------------------------------------------------------------------
*/
void
@@ -3125,6 +3146,24 @@ H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
new_min_clean_size);
break;
+ case flash_increase:
+ HDassert( old_max_cache_size < new_max_cache_size );
+
+ HDfprintf(stdout,
+ "%sflash cache resize(%d) -- size threshold = %Zu.\n",
+ cache_ptr->prefix,
+ (int)((cache_ptr->resize_ctl).flash_incr_mode),
+ cache_ptr->flash_size_increase_threshold);
+
+ HDfprintf(stdout,
+ "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n",
+ cache_ptr->prefix,
+ old_max_cache_size,
+ old_min_clean_size,
+ new_max_cache_size,
+ new_min_clean_size);
+ break;
+
case decrease:
HDassert( old_max_cache_size > new_max_cache_size );
@@ -3537,6 +3576,21 @@ done:
* callbacks. As a result, we may have to make multiple
* passes through the skip list before the cache is flushed.
*
+ * JRM -- 10/13/07
+ * Added code to detect and manage the case in which a
+ * flush callback changes the s-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -3558,6 +3612,7 @@ H5C_flush_cache(H5F_t * f,
int32_t protected_entries = 0;
H5SL_node_t * node_ptr = NULL;
H5C_cache_entry_t * entry_ptr = NULL;
+ H5C_cache_entry_t * next_entry_ptr = NULL;
#if H5C_DO_SANITY_CHECKS
int64_t flushed_entries_count;
size_t flushed_entries_size;
@@ -3620,6 +3675,28 @@ H5C_flush_cache(H5F_t * f,
{
flushed_entries_last_pass = FALSE;
node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+ if ( node_ptr != NULL ) {
+
+ next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+ if ( next_entry_ptr == NULL ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "next_entry_ptr == NULL 1 ?!?!");
+ }
+#ifndef NDEBUG
+ HDassert( next_entry_ptr->magic ==
+ H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+ HDassert( next_entry_ptr->is_dirty );
+ HDassert( next_entry_ptr->in_slist );
+
+ } else {
+
+ next_entry_ptr = NULL;
+
+ }
HDassert( node_ptr != NULL );
@@ -3667,13 +3744,76 @@ H5C_flush_cache(H5F_t * f,
while ( node_ptr != NULL )
{
- entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+ entry_ptr = next_entry_ptr;
+
+ /* With the advent of the fractal heap, it is possible
+ * that the flush callback will dirty and/or resize
+ * other entries in the cache. In particular, while
+ * Quincey has promised me that this will never happen,
+ * it is possible that the flush callback for an
+ * entry may protect an entry that is not in the cache,
+ * perhaps causing the cache to flush and possibly
+ * evict the entry associated with node_ptr to make
+ * space for the new entry.
+ *
+ * Thus we do a bit of extra sanity checking on entry_ptr,
+ * and break out of this scan of the skip list if we
+ * detect minor problems. We have a bit of leaway on the
+ * number of passes though the skip list, so this shouldn't
+ * be an issue in the flush in and of itself, as it should
+ * be all but impossible for this to happen more than once
+ * in any flush.
+ *
+ * Observe that that breaking out of the scan early
+ * shouldn't break the sanity checks just after the end
+ * of this while loop.
+ *
+ * If an entry has merely been marked clean and removed from
+ * the s-list, we simply break out of the scan.
+ *
+ * If the entry has been evicted, we flag an error and
+ * exit.
+ */
+#ifndef NDEBUG
+ if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "entry_ptr->magic invalid ?!?!");
+
+ } else
+#endif /* NDEBUG */
+ if ( ( ! entry_ptr->is_dirty ) ||
+ ( ! entry_ptr->in_slist ) ) {
+
+ /* the s-list has been modified out from under us.
+ * set node_ptr to NULL and break out of the loop.
+ */
+ node_ptr = NULL;
+ break;
+ }
/* increment node pointer now, before we delete its target
* from the slist.
*/
node_ptr = H5SL_next(node_ptr);
+ if ( node_ptr != NULL ) {
+ next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+ if ( next_entry_ptr == NULL ) {
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "next_entry_ptr == NULL 2 ?!?!");
+ }
+#ifndef NDEBUG
+ HDassert( next_entry_ptr->magic ==
+ H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+ HDassert( next_entry_ptr->is_dirty );
+ HDassert( next_entry_ptr->in_slist );
+ } else {
+ next_entry_ptr = NULL;
+ }
+
HDassert( entry_ptr != NULL );
HDassert( entry_ptr->in_slist );
@@ -3689,6 +3829,40 @@ H5C_flush_cache(H5F_t * f,
tried_to_flush_protected_entry = TRUE;
protected_entries++;
+ } else if ( entry_ptr->is_pinned ) {
+ /* Test to see if we are can flush the entry now.
+ * If we can, go ahead and flush. Note that we
+ * aren't trying to do a destroy here, so that
+ * is not an issue.
+ */
+ if ( TRUE ) { /* When we get to multithreaded cache,
+ * we will need either locking code,
+ * and/or a test to see if the entry
+ * is in flushable condition here.
+ */
+#if H5C_DO_SANITY_CHECKS
+ flushed_entries_count++;
+ flushed_entries_size += entry_ptr->size;
+#endif /* H5C_DO_SANITY_CHECKS */
+ status = H5C_flush_single_entry(f,
+ primary_dxpl_id,
+ secondary_dxpl_id,
+ cache_ptr,
+ NULL,
+ entry_ptr->addr,
+ flags,
+ &first_flush,
+ FALSE);
+ if ( status < 0 ) {
+
+ /* This shouldn't happen -- if it does, we are
+ * toast so just scream and die.
+ */
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+ "dirty pinned entry flush failed.")
+ }
+ flushed_entries_last_pass = TRUE;
+ }
} else {
#if H5C_DO_SANITY_CHECKS
flushed_entries_count++;
@@ -4434,6 +4608,9 @@ done:
* Added code to disable evictions when the new
* evictions_enabled field is FALSE.
*
+ * JRM -- 12/31/07
+ * Added code supporting flash cache size increases.
+ *
*-------------------------------------------------------------------------
*/
@@ -4447,6 +4624,7 @@ H5C_insert_entry(H5F_t * f,
void * thing,
unsigned int flags)
{
+ /* const char * fcn_name = "H5C_insert_entry()"; */
herr_t result;
herr_t ret_value = SUCCEED; /* Return value */
hbool_t first_flush = TRUE;
@@ -4486,7 +4664,9 @@ H5C_insert_entry(H5F_t * f,
insert_pinned = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
entry_ptr = (H5C_cache_entry_t *)thing;
-
+#ifndef NDEBUG
+ entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
entry_ptr->addr = addr;
entry_ptr->type = type;
@@ -4524,6 +4704,18 @@ H5C_insert_entry(H5F_t * f,
H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+ if ( ( cache_ptr->flash_size_increase_possible ) &&
+ ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+ result = H5C__flash_increase_cache_size(cache_ptr, 0, entry_ptr->size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+ "H5C__flash_increase_cache_size failed.")
+ }
+ }
+
if ( ( cache_ptr->evictions_enabled ) &&
( (cache_ptr->index_size + entry_ptr->size) >
cache_ptr->max_cache_size ) ) {
@@ -4999,7 +5191,9 @@ done:
*
* Modifications:
*
- * None
+ * Added code to do a flash cache size increase if
+ * appropriate.
+ * JRM -- 1/11/08
*
*-------------------------------------------------------------------------
*/
@@ -5010,6 +5204,8 @@ H5C_mark_pinned_entry_dirty(H5C_t * cache_ptr,
size_t new_size)
{
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
+ size_t size_increase;
H5C_cache_entry_t * entry_ptr;
FUNC_ENTER_NOAPI(H5C_mark_pinned_entry_dirty, FAIL)
@@ -5039,6 +5235,29 @@ H5C_mark_pinned_entry_dirty(H5C_t * cache_ptr,
/* update for change in entry size if necessary */
if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected entry list */
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
(cache_ptr->pel_size), \
@@ -5371,7 +5590,9 @@ done:
*
* Modifications:
*
- * None
+ * Added code to apply a flash cache size increment if
+ * appropriate.
+ * JRM -- 1/11/08
*
*-------------------------------------------------------------------------
*/
@@ -5380,8 +5601,11 @@ H5C_resize_pinned_entry(H5C_t * cache_ptr,
void * thing,
size_t new_size)
{
+ /* const char * fcn_name = "H5C_resize_pinned_entry()"; */
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
H5C_cache_entry_t * entry_ptr;
+ size_t size_increase;
FUNC_ENTER_NOAPI(H5C_resize_pinned_entry, FAIL)
@@ -5417,6 +5641,29 @@ H5C_resize_pinned_entry(H5C_t * cache_ptr,
/* update for change in entry size if necessary */
if ( entry_ptr->size != new_size ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected entry list */
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
(cache_ptr->pel_size), \
@@ -5604,9 +5851,13 @@ done:
* of cache entries.
*
* JRM -- 7/27/07
- * Added code supporting the new evictions_enabled fieled
+ * Added code supporting the new evictions_enabled field
* in H5C_t.
*
+ * JRM -- 1/3/08
+ * Added to do a flash cache size increase if appropriate
+ * when a large entry is loaded.
+ *
*-------------------------------------------------------------------------
*/
@@ -5621,6 +5872,7 @@ H5C_protect(H5F_t * f,
void * udata2,
unsigned flags)
{
+ /* const char * fcn_name = "H5C_protect()"; */
hbool_t hit;
hbool_t first_flush;
hbool_t have_write_permitted = FALSE;
@@ -5678,7 +5930,25 @@ H5C_protect(H5F_t * f,
entry_ptr = (H5C_cache_entry_t *)thing;
- /* try to free up some space if necessary and if evictions are permitted */
+ /* If the entry is very large, and we are configured to allow it,
+ * we may wish to perform a flash cache size increase.
+ */
+ if ( ( cache_ptr->flash_size_increase_possible ) &&
+ ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+ result = H5C__flash_increase_cache_size(cache_ptr, 0,
+ entry_ptr->size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+ "H5C__flash_increase_cache_size failed.")
+ }
+ }
+
+ /* try to free up some space if necessary and if evictions are
+ * permitted
+ */
if ( ( cache_ptr->evictions_enabled ) &&
( (cache_ptr->index_size + entry_ptr->size) >
cache_ptr->max_cache_size ) ) {
@@ -5978,6 +6248,10 @@ done:
* if the new configuration forces an immediate reduction
* in cache size.
*
+ * JRM -- 12/31/07
+ * Added code supporting the new flash cache size increase
+ * code.
+ *
*-------------------------------------------------------------------------
*/
@@ -5985,6 +6259,7 @@ herr_t
H5C_set_cache_auto_resize_config(H5C_t * cache_ptr,
H5C_auto_size_ctl_t *config_ptr)
{
+ /* const char *fcn_name = "H5C_set_cache_auto_resize_config()"; */
herr_t ret_value = SUCCEED; /* Return value */
herr_t result;
size_t new_max_cache_size;
@@ -6039,8 +6314,10 @@ H5C_set_cache_auto_resize_config(H5C_t * cache_ptr,
"conflicting threshold fields in new config.")
}
- cache_ptr->size_increase_possible = TRUE; /* will set to FALSE if needed */
- cache_ptr->size_decrease_possible = TRUE; /* will set to FALSE if needed */
+ /* will set the increase possible fields to FALSE later if needed */
+ cache_ptr->size_increase_possible = TRUE;
+ cache_ptr->flash_size_increase_possible = TRUE;
+ cache_ptr->size_decrease_possible = TRUE;
switch ( config_ptr->incr_mode )
{
@@ -6062,6 +6339,11 @@ H5C_set_cache_auto_resize_config(H5C_t * cache_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.")
}
+ /* logically, this is were configuration for flash cache size increases
+ * should go. However, this configuration depends on max_cache_size, so
+ * we wait until the end of the function, when this field is set.
+ */
+
switch ( config_ptr->decr_mode )
{
case H5C_decr__off:
@@ -6106,9 +6388,13 @@ H5C_set_cache_auto_resize_config(H5C_t * cache_ptr,
if ( config_ptr->max_size == config_ptr->min_size ) {
cache_ptr->size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_possible = FALSE;
cache_ptr->size_decrease_possible = FALSE;
}
+ /* flash_size_increase_possible is intentionally omitted from the
+ * following:
+ */
cache_ptr->resize_enabled = cache_ptr->size_increase_possible ||
cache_ptr->size_decrease_possible;
@@ -6196,6 +6482,37 @@ H5C_set_cache_auto_resize_config(H5C_t * cache_ptr,
}
}
+ /* configure flash size increase facility. We wait until the
+ * end of the function, as we need the max_cache_size set before
+ * we start to keep things simple.
+ *
+ * If we haven't already ruled out flash cache size increases above,
+ * go ahead and configure it.
+ */
+
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ switch ( config_ptr->flash_incr_mode )
+ {
+ case H5C_flash_incr__off:
+ cache_ptr->flash_size_increase_possible = FALSE;
+ break;
+
+ case H5C_flash_incr__add_space:
+ cache_ptr->flash_size_increase_possible = TRUE;
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+ }
+
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -7095,6 +7412,9 @@ done:
* Also added sanity checks using the new is_read_only and
* ro_ref_count parameters.
*
+ * JRM -- 12/31/07
+ * Modified funtion to support flash cache resizes.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -7108,6 +7428,7 @@ H5C_unprotect(H5F_t * f,
unsigned int flags,
size_t new_size)
{
+ /* const char * fcn_name = "H5C_unprotect()"; */
hbool_t deleted;
hbool_t dirtied;
hbool_t set_flush_marker;
@@ -7118,6 +7439,8 @@ H5C_unprotect(H5F_t * f,
hbool_t clear_entry = FALSE;
#endif /* H5_HAVE_PARALLEL */
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
+ size_t size_increase = 0;
H5C_cache_entry_t * entry_ptr;
H5C_cache_entry_t * test_entry_ptr;
@@ -7265,6 +7588,29 @@ H5C_unprotect(H5F_t * f,
/* update for change in entry size if necessary */
if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected list */
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \
(cache_ptr->pl_size), \
@@ -7458,7 +7804,9 @@ done:
*
* Modifications:
*
- * None.
+ * Added validation for the flash increment fields.
+ *
+ * JRM -- 12/31/07
*
*-------------------------------------------------------------------------
*/
@@ -7560,7 +7908,7 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
( config_ptr->apply_max_increment != FALSE ) ) {
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
- "apply_max_increment must be either TRUE or FALSE");
+ "apply_max_increment must be either TRUE or FALSE");
}
/* no need to check max_increment, as it is a size_t,
@@ -7568,6 +7916,33 @@ H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
*/
} /* H5C_incr__threshold */
+ switch ( config_ptr->flash_incr_mode )
+ {
+ case H5C_flash_incr__off:
+ /* nothing to do here */
+ break;
+
+ case H5C_flash_incr__add_space:
+ if ( ( config_ptr->flash_multiple < 0.1 ) ||
+ ( config_ptr->flash_multiple > 10.0 ) ) {
+
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "flash_multiple must be in the range [0.1, 10.0]");
+ }
+
+ if ( ( config_ptr->flash_threshold < 0.1 ) ||
+ ( config_ptr->flash_threshold > 1.0 ) ) {
+
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "flash_threshold must be in the range [0.1, 1.0]");
+ }
+ break;
+
+ default:
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "Invalid flash_incr_mode");
+ break;
+ }
} /* H5C_RESIZE_CFG__VALIDATE_INCREMENT */
@@ -7707,6 +8082,9 @@ done:
* reduction, and to adjust to changes in the
* H5C_auto_size_ctl_t structure.
*
+ * JRM -- 1/5/08
+ * Added support for flash cache size increases.
+ *
*-------------------------------------------------------------------------
*/
@@ -7990,6 +8368,30 @@ H5C__auto_adjust_cache_size(H5C_t * cache_ptr,
cache_ptr->size_decreased = TRUE;
}
+
+ /* update flash cache size increase fields as appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C_flash_incr__off:
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C_flash_incr__off?!")
+ break;
+
+ case H5C_flash_incr__add_space:
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+ }
}
if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
@@ -8308,7 +8710,20 @@ done:
*
* Modifications:
*
- * None.
+ * JRM -- 10/13/07
+ * Added code to detect and manage the case in which a
+ * flush callback changes the LRU-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
*
*-------------------------------------------------------------------------
*/
@@ -8325,7 +8740,9 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
herr_t result;
size_t eviction_size_limit;
size_t bytes_evicted = 0;
+ hbool_t prev_is_dirty = FALSE;
H5C_cache_entry_t * entry_ptr;
+ H5C_cache_entry_t * next_ptr;
H5C_cache_entry_t * prev_ptr;
FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__evict_aged_out_entries)
@@ -8358,8 +8775,14 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
{
HDassert( ! (entry_ptr->is_protected) );
+ next_ptr = entry_ptr->next;
prev_ptr = entry_ptr->prev;
+ if ( prev_ptr != NULL ) {
+
+ prev_is_dirty = prev_ptr->is_dirty;
+ }
+
if ( entry_ptr->is_dirty ) {
result = H5C_flush_single_entry(f,
@@ -8392,8 +8815,41 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
"unable to flush entry")
}
- entry_ptr = prev_ptr;
+ if ( prev_ptr != NULL ) {
+#ifndef NDEBUG
+ if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+ /* something horrible has happened to *prev_ptr --
+ * scream and die.
+ */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "*prev_ptr corrupt")
+
+ } else
+#endif /* NDEBUG */
+ if ( ( prev_ptr->is_dirty != prev_is_dirty )
+ ||
+ ( prev_ptr->next != next_ptr )
+ ||
+ ( prev_ptr->is_protected )
+ ||
+ ( prev_ptr->is_pinned ) ) {
+
+ /* something has happened to the LRU -- start over
+ * from the tail.
+ */
+ entry_ptr = cache_ptr->LRU_tail_ptr;
+
+ } else {
+
+ entry_ptr = prev_ptr;
+ }
+ } else {
+
+ entry_ptr = NULL;
+
+ }
} /* end while */
/* for now at least, don't bother to maintain the minimum clean size,
@@ -8741,6 +9197,173 @@ done:
} /* H5C__autoadjust__ageout__remove_excess_markers() */
+/*-------------------------------------------------------------------------
+ *
+ * Function: H5C__flash_increase_cache_size
+ *
+ * Purpose: If there is not at least new_entry_size - old_entry_size
+ * bytes of free space in the cache and the current
+ * max_cache_size is less than (cache_ptr->resize_ctl).max_size,
+ * perform a flash increase in the cache size and then reset
+ * the full cache hit rate statistics, and exit.
+ *
+ * Return: Non-negative on success/Negative on failure.
+ *
+ * Programmer: John Mainzer, 12/31/07
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+H5C__flash_increase_cache_size(H5C_t * cache_ptr,
+ size_t old_entry_size,
+ size_t new_entry_size)
+{
+ /* const char * fcn_name = "H5C__flash_increase_cache_size()";*/
+ herr_t ret_value = SUCCEED; /* Return value */
+ size_t new_max_cache_size = 0;
+ size_t old_max_cache_size = 0;
+ size_t new_min_clean_size = 0;
+ size_t old_min_clean_size = 0;
+ size_t space_needed;
+ enum H5C_resize_status status = flash_increase; /* may change */
+ double hit_rate;
+
+ FUNC_ENTER_NOAPI_NOINIT(H5C__flash_increase_cache_size)
+ HDassert( cache_ptr );
+ HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+ HDassert( cache_ptr->flash_size_increase_possible );
+ HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold );
+ HDassert( old_entry_size < new_entry_size );
+
+ if ( old_entry_size >= new_entry_size ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "old_entry_size >= new_entry_size")
+ }
+
+ space_needed = new_entry_size - old_entry_size;
+
+ if ( ( (cache_ptr->index_size + space_needed) >
+ cache_ptr->max_cache_size ) &&
+ ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).max_size ) ) {
+
+ /* we have work to do */
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C_flash_incr__off:
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C_flash_incr__off?!")
+ break;
+
+ case H5C_flash_incr__add_space:
+ if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+
+ HDassert( (cache_ptr->max_cache_size - cache_ptr->index_size)
+ < space_needed );
+ space_needed -= cache_ptr->max_cache_size - cache_ptr->index_size;
+ }
+ space_needed =
+ (size_t)(((double)space_needed) *
+ (cache_ptr->resize_ctl).flash_multiple);
+
+ new_max_cache_size = cache_ptr->max_cache_size + space_needed;
+
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+
+ if ( new_max_cache_size > (cache_ptr->resize_ctl).max_size ) {
+
+ new_max_cache_size = (cache_ptr->resize_ctl).max_size;
+ }
+
+ HDassert( new_max_cache_size > cache_ptr->max_cache_size );
+
+ new_min_clean_size = (size_t)
+ ((double)new_max_cache_size *
+ ((cache_ptr->resize_ctl).min_clean_fraction));
+
+ HDassert( new_min_clean_size <= new_max_cache_size );
+
+ old_max_cache_size = cache_ptr->max_cache_size;
+ old_min_clean_size = cache_ptr->min_clean_size;
+
+ cache_ptr->max_cache_size = new_max_cache_size;
+ cache_ptr->min_clean_size = new_min_clean_size;
+
+ /* update flash cache size increase fields as appropriate */
+ HDassert ( cache_ptr->flash_size_increase_possible );
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C_flash_incr__off:
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C_flash_incr__off?!")
+ break;
+
+ case H5C_flash_incr__add_space:
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+
+ /* note that we don't cycle the epoch markers. We can
+ * argue either way as to whether we should, but for now
+ * we don't.
+ */
+
+ if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
+
+ /* get the hit rate for the reporting function. Should still
+ * be good as we havent reset the hit rate statistics.
+ */
+ if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
+ }
+
+ (*((cache_ptr->resize_ctl).rpt_fcn))
+ (cache_ptr,
+ H5C__CURR_AUTO_RESIZE_RPT_FCN_VER,
+ hit_rate,
+ status,
+ old_max_cache_size,
+ new_max_cache_size,
+ old_min_clean_size,
+ new_min_clean_size);
+ }
+
+ if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+ /* this should be impossible... */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C_reset_cache_hit_rate_stats failed.")
+ }
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C__flash_increase_cache_size() */
+
/*-------------------------------------------------------------------------
* Function: H5C_flush_invalidate_cache
@@ -8779,12 +9402,28 @@ done:
*
* Modifications:
*
- * To support the fractal heap, the cache must now deal with
- * entries being dirtied, resized, and/or renamed inside
- * flush callbacks. Updated function to support this.
+ * To support the fractal heap, the cache must now deal with
+ * entries being dirtied, resized, and/or renamed inside
+ * flush callbacks. Updated function to support this.
*
* -- JRM 8/27/06
*
+ * Added code to detect and manage the case in which a
+ * flush callback changes the s-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
+ *
+ * -- JRM 10/13/07
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -8895,6 +9534,23 @@ H5C_flush_invalidate_cache(H5F_t * f,
node_ptr = H5SL_first(cache_ptr->slist_ptr);
+ if ( node_ptr == NULL ) {
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "slist_len != 0 && node_ptr == NULL");
+ }
+
+ next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+ if ( next_entry_ptr == NULL ) {
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "next_entry_ptr == NULL 1 ?!?!");
+ }
+#ifndef NDEBUG
+ HDassert( next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+ HDassert( next_entry_ptr->is_dirty );
+ HDassert( next_entry_ptr->in_slist );
+
}
#if H5C_DO_SANITY_CHECKS
/* Depending on circumstances, H5C_flush_single_entry() will
@@ -8927,23 +9583,88 @@ H5C_flush_invalidate_cache(H5F_t * f,
while ( node_ptr != NULL )
{
- /* Note that we now remove nodes from the slist as we flush
- * the associated entries, instead of leaving them there
- * until we are done, and then destroying all nodes in
- * the slist.
+ entry_ptr = next_entry_ptr;
+
+ /* With the advent of the fractal heap, it is possible
+ * that the flush callback will dirty and/or resize
+ * other entries in the cache. In particular, while
+ * Quincey has promised me that this will never happen,
+ * it is possible that the flush callback for an
+ * entry may protect an entry that is not in the cache,
+ * perhaps causing the cache to flush and possibly
+ * evict the entry associated with node_ptr to make
+ * space for the new entry.
*
- * While this optimization used to be easy, with the possibility
- * of new entries being added to the slist in the midst of the
- * flush, we must keep the slist in cannonical form at all
- * times.
+ * Thus we do a bit of extra sanity checking on entry_ptr,
+ * and break out of this scan of the skip list if we
+ * detect major problems. We have a bit of leaway on the
+ * number of passes though the skip list, so this shouldn't
+ * be an issue in the flush in and of itself, as it should
+ * be all but impossible for this to happen more than once
+ * in any flush.
+ *
+ * Observe that that breaking out of the scan early
+ * shouldn't break the sanity checks just after the end
+ * of this while loop.
+ *
+ * If an entry has merely been marked clean and removed from
+ * the s-list, we simply break out of the scan.
+ *
+ * If the entry has been evicted, we flag an error and
+ * exit.
*/
+#ifndef NDEBUG
+ if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "entry_ptr->magic is invalid ?!?!");
+
+ } else
+#endif /* NDEBUG */
+ if ( ( ! entry_ptr->is_dirty ) ||
+ ( ! entry_ptr->in_slist ) ) {
- entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+ /* the s-list has been modified out from under us.
+ * break out of the loop.
+ */
+ break;
+ }
/* increment node pointer now, before we delete its target
* from the slist.
*/
+
node_ptr = H5SL_next(node_ptr);
+ if ( node_ptr != NULL ) {
+
+ next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+ if ( next_entry_ptr == NULL ) {
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "next_entry_ptr == NULL 2 ?!?!");
+ }
+#ifndef NDEBUG
+ HDassert( next_entry_ptr->magic ==
+ H5C__H5C_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
+ HDassert( next_entry_ptr->is_dirty );
+ HDassert( next_entry_ptr->in_slist );
+
+ } else {
+
+ next_entry_ptr = NULL;
+ }
+
+ /* Note that we now remove nodes from the slist as we flush
+ * the associated entries, instead of leaving them there
+ * until we are done, and then destroying all nodes in
+ * the slist.
+ *
+ * While this optimization used to be easy, with the possibility
+ * of new entries being added to the slist in the midst of the
+ * flush, we must keep the slist in cannonical form at all
+ * times.
+ */
HDassert( entry_ptr != NULL );
HDassert( entry_ptr->in_slist );
@@ -9030,12 +9751,19 @@ H5C_flush_invalidate_cache(H5F_t * f,
/* It is possible that entries were added to the slist during
* the scan, either before or after scan pointer. The following
* asserts take this into account.
- */
+ *
+ * Don't bother with the sanity checks if node_ptr != NULL, as
+ * in this case we broke out of the loop because it got changed
+ * out from under us.
+ */
+
+ if ( node_ptr == NULL ) {
- HDassert( (actual_slist_len + cache_ptr->slist_len) ==
- (initial_slist_len + cache_ptr->slist_len_increase) );
- HDassert( (actual_slist_size + cache_ptr->slist_size) ==
- (initial_slist_size + cache_ptr->slist_size_increase) );
+ HDassert( (actual_slist_len + cache_ptr->slist_len) ==
+ (initial_slist_len + cache_ptr->slist_len_increase) );
+ HDassert( (actual_slist_size + cache_ptr->slist_size) ==
+ (initial_slist_size + cache_ptr->slist_size_increase) );
+ }
#endif /* H5C_DO_SANITY_CHECKS */
/* Since we are doing a destroy, we must make a pass through
@@ -9056,8 +9784,13 @@ H5C_flush_invalidate_cache(H5F_t * f,
while ( next_entry_ptr != NULL )
{
entry_ptr = next_entry_ptr;
- next_entry_ptr = entry_ptr->ht_next;
+ next_entry_ptr = entry_ptr->ht_next;
+#ifndef NDEBUG
+ HDassert ( ( next_entry_ptr == NULL ) ||
+ ( next_entry_ptr->magic ==
+ H5C__H5C_CACHE_ENTRY_T_MAGIC ) );
+#endif /* NDEBUG */
if ( entry_ptr->is_protected ) {
/* we have major problems -- but lets flush and destroy
@@ -9099,6 +9832,28 @@ H5C_flush_invalidate_cache(H5F_t * f,
* of pinned entries from pass to pass. If it stops
* shrinking before it hits zero, we scream and die.
*/
+ /* if the flush function on the entry we last evicted
+ * loaded an entry into cache (as Quincey has promised me
+ * it never will), and if the cache was full, it is
+ * possible that *next_entry_ptr was flushed or evicted.
+ *
+ * Test to see if this happened here. Note that if this
+ * test is triggred, we are accessing a deallocated piece
+ * of dynamically allocated memory, so we just scream and
+ * die.
+ */
+#ifndef NDEBUG
+ if ( ( next_entry_ptr != NULL ) &&
+ ( next_entry_ptr->magic !=
+ H5C__H5C_CACHE_ENTRY_T_MAGIC ) ) {
+
+ /* Something horrible has happened to
+ * *next_entry_ptr -- scream and die.
+ */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "next_entry_ptr->magic is invalid?!?!?.")
+ }
+#endif /* NDEBUG */
} /* end while loop scanning hash table bin */
} /* end for loop scanning hash table */
@@ -9541,6 +10296,17 @@ H5C_flush_single_entry(H5F_t * f,
/* Clear the dirty flag only, if requested */
if ( clear_only ) {
+#ifndef NDEBUG
+ if ( destroy ) {
+ /* we are about to call the clear callback with the
+ * destroy flag set -- this will result in *entry_ptr
+ * being freed. Set the magic field to bad magic
+ * so we can detect a freed cache entry if we see
+ * one.
+ */
+ entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
+ }
+#endif /* NDEBUG */
/* Call the callback routine to clear all dirty flags for object */
if ( (entry_ptr->type->clear)(f, entry_ptr, destroy) < 0 ) {
@@ -9558,6 +10324,18 @@ H5C_flush_single_entry(H5F_t * f,
}
#endif /* H5C_DO_SANITY_CHECKS */
+#ifndef NDEBUG
+ if ( destroy ) {
+ /* we are about to call the flush callback with the
+ * destroy flag set -- this will result in *entry_ptr
+ * being freed. Set the magic field to bad magic
+ * so we can detect a freed cache entry if we see
+ * one.
+ */
+ entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
+ }
+#endif /* NDEBUG */
+
/* Only block for all the processes on the first piece of metadata
*/
@@ -9816,7 +10594,9 @@ H5C_load_entry(H5F_t * f,
*/
HDassert( ( entry_ptr->is_dirty == FALSE ) || ( type->id == 4 ) );
-
+#ifndef NDEBUG
+ entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
entry_ptr->addr = addr;
entry_ptr->type = type;
entry_ptr->is_protected = FALSE;
@@ -9914,6 +10694,21 @@ done:
* Added sanity checks using the new is_read_only and
* ro_ref_count fields.
*
+ * JRM -- 10/13/07
+ * Added code to detect and manage the case in which a
+ * flush callback changes the LRU-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
+ *
*-------------------------------------------------------------------------
*/
@@ -9933,7 +10728,10 @@ H5C_make_space_in_cache(H5F_t * f,
#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
size_t empty_space;
#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+ hbool_t prev_is_dirty = FALSE;
+ hbool_t entry_is_epoch_maker = FALSE;
H5C_cache_entry_t * entry_ptr;
+ H5C_cache_entry_t * next_ptr;
H5C_cache_entry_t * prev_ptr;
FUNC_ENTER_NOAPI_NOINIT(H5C_make_space_in_cache)
@@ -9962,10 +10760,18 @@ H5C_make_space_in_cache(H5F_t * f,
HDassert( ! (entry_ptr->is_read_only) );
HDassert( (entry_ptr->ro_ref_count) == 0 );
- prev_ptr = entry_ptr->prev;
+ next_ptr = entry_ptr->next;
+ prev_ptr = entry_ptr->prev;
+
+ if ( prev_ptr != NULL ) {
+
+ prev_is_dirty = prev_ptr->is_dirty;
+ }
if ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) {
+ entry_is_epoch_maker = FALSE;
+
if ( entry_ptr->is_dirty ) {
result = H5C_flush_single_entry(f,
@@ -9994,6 +10800,7 @@ H5C_make_space_in_cache(H5F_t * f,
/* Skip epoch markers. Set result to SUCCEED to avoid
* triggering the error code below.
*/
+ entry_is_epoch_maker = TRUE;
result = SUCCEED;
}
@@ -10003,11 +10810,54 @@ H5C_make_space_in_cache(H5F_t * f,
"unable to flush entry")
}
- entry_ptr = prev_ptr;
- }
+ if ( prev_ptr != NULL ) {
+#ifndef NDEBUG
+ if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
+
+ /* something horrible has happened to *prev_ptr --
+ * scream and die.
+ */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "*prev_ptr corrupt 1")
+
+ }
+#endif /* NDEBUG */
+ if ( entry_is_epoch_maker ) {
+
+ entry_ptr = prev_ptr;
+
+ } else if ( ( prev_ptr->is_dirty != prev_is_dirty )
+ ||
+ ( prev_ptr->next != next_ptr )
+ ||
+ ( prev_ptr->is_protected )
+ ||
+ ( prev_ptr->is_pinned ) ) {
+
+ /* something has happened to the LRU -- start over
+ * from the tail.
+ */
+
+ entry_ptr = cache_ptr->LRU_tail_ptr;
+
+ } else {
+
+ entry_ptr = prev_ptr;
+
+ }
+ } else {
+
+ entry_ptr = NULL;
+
+ }
+
+ entries_examined++;
+
+ }
#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+ entries_examined = 0;
initial_list_len = cache_ptr->dLRU_list_len;
entry_ptr = cache_ptr->dLRU_tail_ptr;
@@ -10034,6 +10884,13 @@ H5C_make_space_in_cache(H5F_t * f,
prev_ptr = entry_ptr->aux_prev;
+ next_ptr = entry_ptr->aux_next;
+
+ if ( prev_ptr != NULL ) {
+
+ HDassert( prev_ptr->is_dirty );
+ }
+
result = H5C_flush_single_entry(f,
primary_dxpl_id,
secondary_dxpl_id,
@@ -10050,7 +10907,66 @@ H5C_make_space_in_cache(H5F_t * f,
"unable to flush entry")
}
- entry_ptr = prev_ptr;
+ if ( prev_ptr != NULL ) {
+#ifndef NDEBUG
+ if (prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC) {
+
+ /* something horrible has happened to *prev_ptr --
+ * scream and die.
+ */
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "*prev_ptr corrupt 2")
+
+ } else
+#endif /* #ifndef NDEBUG */
+ if ( ( ! ( prev_ptr->is_dirty ) )
+ ||
+ ( prev_ptr->aux_next != next_ptr )
+ ||
+ ( prev_ptr->is_protected )
+ ||
+ ( prev_ptr->is_pinned ) ) {
+
+ /* something has happened to the dirty LRU -- start over
+ * from the tail.
+ */
+
+#if 0 /* This debuging code may be useful in the future -- keep it for now. */
+ if ( ! ( prev_ptr->is_dirty ) ) {
+ HDfprintf(stdout, "%s: ! prev_ptr->is_dirty\n",
+ fcn_name);
+ }
+ if ( prev_ptr->aux_next != next_ptr ) {
+ HDfprintf(stdout, "%s: prev_ptr->next != next_ptr\n",
+ fcn_name);
+ }
+ if ( prev_ptr->is_protected ) {
+ HDfprintf(stdout, "%s: prev_ptr->is_protected\n",
+ fcn_name);
+ }
+ if ( prev_ptr->is_pinned ) {
+ HDfprintf(stdout, "%s:prev_ptr->is_pinned\n",
+ fcn_name);
+ }
+
+ HDfprintf(stdout, "%s: re-starting scan of dirty list\n",
+ fcn_name);
+#endif /* JRM */
+ entry_ptr = cache_ptr->dLRU_tail_ptr;
+
+ } else {
+
+ entry_ptr = prev_ptr;
+
+ }
+ } else {
+
+ entry_ptr = NULL;
+
+ }
+
+ entries_examined++;
}
#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
@@ -10096,6 +11012,7 @@ H5C_make_space_in_cache(H5F_t * f,
}
entry_ptr = prev_ptr;
+ entries_examined++;
}
}
diff --git a/src/H5C2.c b/src/H5C2.c
index 373191f..b485faf 100644
--- a/src/H5C2.c
+++ b/src/H5C2.c
@@ -2588,6 +2588,10 @@ static herr_t H5C2__autoadjust__ageout__remove_all_markers(H5C2_t * cache_ptr);
static herr_t H5C2__autoadjust__ageout__remove_excess_markers(H5C2_t * cache_ptr);
+static herr_t H5C2__flash_increase_cache_size(H5C2_t * cache_ptr,
+ size_t old_entry_size,
+ size_t new_entry_size);
+
static herr_t H5C2_flush_single_entry(H5F_t * f,
hid_t dxpl_id,
H5C2_t * cache_ptr,
@@ -2850,6 +2854,11 @@ done:
* Added initialization for the new is_read_only and
* ro_ref_count fields.
*
+ * JRM -- 12/31/07
+ * Added initialization for the new flash cache size increase
+ * related fields of H5C2_t.
+ *
+ *
*-------------------------------------------------------------------------
*/
@@ -2969,6 +2978,8 @@ H5C2_create(const H5F_t * f,
cache_ptr->dLRU_tail_ptr = NULL;
cache_ptr->size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_threshold = 0;
cache_ptr->size_decrease_possible = FALSE;
cache_ptr->resize_enabled = FALSE;
cache_ptr->cache_full = FALSE;
@@ -2989,6 +3000,10 @@ H5C2_create(const H5F_t * f,
(cache_ptr->resize_ctl).apply_max_increment = TRUE;
(cache_ptr->resize_ctl).max_increment = H5C2__DEF_AR_MAX_INCREMENT;
+ (cache_ptr->resize_ctl).flash_incr_mode = H5C2_flash_incr__off;
+ (cache_ptr->resize_ctl).flash_multiple = 1.0;
+ (cache_ptr->resize_ctl).flash_threshold = 0.25;
+
(cache_ptr->resize_ctl).decr_mode = H5C2_decr__off;
(cache_ptr->resize_ctl).upper_hr_threshold = H5C2__DEF_AR_UPPER_THRESHHOLD;
(cache_ptr->resize_ctl).decrement = H5C2__DEF_AR_DECREMENT;
@@ -3008,9 +3023,10 @@ H5C2_create(const H5F_t * f,
for ( i = 0; i < H5C2__MAX_EPOCH_MARKERS; i++ )
{
(cache_ptr->epoch_marker_active)[i] = FALSE;
-
+#ifndef NDEBUG
((cache_ptr->epoch_markers)[i]).magic =
H5C2__H5C2_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
((cache_ptr->epoch_markers)[i]).addr = (haddr_t)i;
((cache_ptr->epoch_markers)[i]).size = (size_t)0;
((cache_ptr->epoch_markers)[i]).type = &epoch_marker_class_2;
@@ -3096,6 +3112,9 @@ done:
* Updated function for display the new prefix field of
* H5C2_t in output.
*
+ * JRM 12/31/07
+ * Updated function to handle flash size increases.
+ *
*-------------------------------------------------------------------------
*/
void
@@ -3142,6 +3161,25 @@ H5C2_def_auto_resize_rpt_fcn(H5C2_t * cache_ptr,
new_min_clean_size);
break;
+ case flash_increase2:
+ HDassert( old_max_cache_size < new_max_cache_size );
+
+ HDfprintf(stdout,
+ "%sflash cache resize(%d) -- size threshold = %Zu.\n",
+ cache_ptr->prefix,
+ (int)((cache_ptr->resize_ctl).flash_incr_mode),
+ cache_ptr->flash_size_increase_threshold);
+
+ HDfprintf(stdout,
+ "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n",
+ cache_ptr->prefix,
+ old_max_cache_size,
+ old_min_clean_size,
+ new_max_cache_size,
+ new_min_clean_size);
+ break;
+
+
case decrease2:
HDassert( old_max_cache_size > new_max_cache_size );
@@ -3571,6 +3609,21 @@ done:
* handle the situation, but one can argue that I should
* just scream and die if I ever detect the condidtion.
*
+ * JRM -- 10/13/07
+ * Added code to detect and manage the case in which a
+ * flush callback changes the s-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -3651,19 +3704,27 @@ H5C2_flush_cache(H5C2_t * cache_ptr,
{
flushed_entries_last_pass = FALSE;
node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
if ( node_ptr != NULL ) {
+
next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr);
if ( next_entry_ptr == NULL ) {
+
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"next_entry_ptr == NULL 1 ?!?!");
}
+#ifndef NDEBUG
HDassert( next_entry_ptr->magic ==
H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
HDassert( next_entry_ptr->is_dirty );
HDassert( next_entry_ptr->in_slist );
+
} else {
+
next_entry_ptr = NULL;
+
}
HDassert( node_ptr != NULL );
@@ -3742,14 +3803,16 @@ H5C2_flush_cache(H5C2_t * cache_ptr,
* If the entry has been evicted, we flag an error and
* exit.
*/
-
+#ifndef NDEBUG
if ( entry_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) {
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"entry_ptr->magic invalid ?!?!");
- } else if ( ( ! entry_ptr->is_dirty ) ||
- ( ! entry_ptr->in_slist ) ) {
+ } else
+#endif /* NDEBUG */
+ if ( ( ! entry_ptr->is_dirty ) ||
+ ( ! entry_ptr->in_slist ) ) {
/* the s-list has been modified out from under us.
* set node_ptr to NULL and break out of the loop.
@@ -3762,15 +3825,20 @@ H5C2_flush_cache(H5C2_t * cache_ptr,
* from the slist.
*/
node_ptr = H5SL_next(node_ptr);
+
if ( node_ptr != NULL ) {
+
next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr);
if ( next_entry_ptr == NULL ) {
+
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"next_entry_ptr == NULL 2 ?!?!");
}
+#ifndef NDEBUG
HDassert( next_entry_ptr->magic ==
H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
HDassert( next_entry_ptr->is_dirty );
HDassert( next_entry_ptr->in_slist );
} else {
@@ -3823,6 +3891,7 @@ H5C2_flush_cache(H5C2_t * cache_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
"dirty pinned entry flush failed.")
}
+ flushed_entries_last_pass = TRUE;
}
} else {
#if H5C2_DO_SANITY_CHECKS
@@ -4580,6 +4649,9 @@ done:
* JRM -- 10/12/07
* Added initialization for the new magic field.
*
+ * JRM -- 12/31/07
+ * Added code supporting flash cache size increases.
+ *
*-------------------------------------------------------------------------
*/
@@ -4592,6 +4664,7 @@ H5C2_insert_entry(H5C2_t * cache_ptr,
void * thing,
unsigned int flags)
{
+ /* const char * fcn_name = "H5C2_insert_entry()"; */
herr_t result;
herr_t ret_value = SUCCEED; /* Return value */
hbool_t insert_pinned;
@@ -4628,9 +4701,9 @@ H5C2_insert_entry(H5C2_t * cache_ptr,
insert_pinned = ( (flags & H5C2__PIN_ENTRY_FLAG) != 0 );
entry_ptr = (H5C2_cache_entry_t *)thing;
-
+#ifndef NDEBUG
entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_MAGIC;
-
+#endif /* NDEBUG */
entry_ptr->addr = addr;
entry_ptr->type = type;
@@ -4664,6 +4737,19 @@ H5C2_insert_entry(H5C2_t * cache_ptr,
H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr)
+ if ( ( cache_ptr->flash_size_increase_possible ) &&
+ ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+ result = H5C2__flash_increase_cache_size(cache_ptr, 0,
+ entry_ptr->size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
+ "H5C2__flash_increase_cache_size failed.")
+ }
+ }
+
if ( ( cache_ptr->evictions_enabled ) &&
( (cache_ptr->index_size + entry_ptr->size) >
cache_ptr->max_cache_size ) ) {
@@ -5151,10 +5237,13 @@ done:
*
* Modifications:
*
- * None
+ * Added code to do a flash cache size increase if
+ * appropriate.
+ * JRM -- 1/11/08
*
*-------------------------------------------------------------------------
*/
+
herr_t
H5C2_mark_pinned_entry_dirty(H5C2_t * cache_ptr,
void * thing,
@@ -5162,6 +5251,8 @@ H5C2_mark_pinned_entry_dirty(H5C2_t * cache_ptr,
size_t new_size)
{
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
+ size_t size_increase;
H5C2_cache_entry_t * entry_ptr;
FUNC_ENTER_NOAPI(H5C2_mark_pinned_entry_dirty, FAIL)
@@ -5191,10 +5282,33 @@ H5C2_mark_pinned_entry_dirty(H5C2_t * cache_ptr,
/* update for change in entry size if necessary */
if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C2__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C2__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected entry list */
H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
- (cache_ptr->pel_size), \
- (entry_ptr->size), (new_size));
+ (cache_ptr->pel_size), \
+ (entry_ptr->size), (new_size));
/* update the hash table */
H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\
@@ -5528,7 +5642,9 @@ done:
*
* Modifications:
*
- * None
+ * Added code to apply a flash cache size increment if
+ * appropriate.
+ * JRM -- 1/11/08
*
*-------------------------------------------------------------------------
*/
@@ -5537,8 +5653,11 @@ H5C2_resize_pinned_entry(H5C2_t * cache_ptr,
void * thing,
size_t new_size)
{
+ /* const char * fcn_name = "H5C2_resize_pinned_entry()"; */
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
H5C2_cache_entry_t * entry_ptr;
+ size_t size_increase;
FUNC_ENTER_NOAPI(H5C2_resize_pinned_entry, FAIL)
@@ -5574,6 +5693,29 @@ H5C2_resize_pinned_entry(H5C2_t * cache_ptr,
/* update for change in entry size if necessary */
if ( entry_ptr->size != new_size ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C2__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C2__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected entry list */
H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \
(cache_ptr->pel_size), \
@@ -5761,7 +5903,7 @@ done:
* of cache entries.
*
* JRM -- 7/27/07
- * Added code supporting the new evictions_enabled fieled
+ * Added code supporting the new evictions_enabled field
* in H5C2_t.
*
* JRM -- 7/11/07
@@ -5771,6 +5913,10 @@ done:
* fields. Gained the len parameter. Also internal
* changes supporting the revised API.
*
+ * JRM -- 1/3/08
+ * Added to do a flash cache size increase if appropriate
+ * when a large entry is loaded.
+ *
*-------------------------------------------------------------------------
*/
@@ -5848,6 +5994,22 @@ H5C2_protect(H5C2_t * cache_ptr,
entry_ptr = (H5C2_cache_entry_t *)thing;
+ /* If the entry is very large, and we are configured to allow it,
+ * we may wish to perform a flash cache size increase.
+ */
+ if ( ( cache_ptr->flash_size_increase_possible ) &&
+ ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
+
+ result = H5C2__flash_increase_cache_size(cache_ptr, 0,
+ entry_ptr->size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
+ "H5C2__flash_increase_cache_size failed.")
+ }
+ }
+
/* try to free up some space if necessary and if
* evictions are permitted
*/
@@ -6149,6 +6311,10 @@ done:
* if the new configuration forces an immediate reduction
* in cache size.
*
+ * JRM -- 12/31/07
+ * Added code supporting the new flash cache size increase
+ * code.
+ *
*-------------------------------------------------------------------------
*/
@@ -6156,6 +6322,7 @@ herr_t
H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr,
H5C2_auto_size_ctl_t *config_ptr)
{
+ /* const char *fcn_name = "H5C2_set_cache_auto_resize_config()"; */
herr_t ret_value = SUCCEED; /* Return value */
herr_t result;
size_t new_max_cache_size;
@@ -6210,8 +6377,10 @@ H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr,
"conflicting threshold fields in new config.")
}
- cache_ptr->size_increase_possible = TRUE; /* will set to FALSE if needed */
- cache_ptr->size_decrease_possible = TRUE; /* will set to FALSE if needed */
+ /* will set the increase possible fields to FALSE later if needed */
+ cache_ptr->size_increase_possible = TRUE;
+ cache_ptr->flash_size_increase_possible = TRUE;
+ cache_ptr->size_decrease_possible = TRUE;
switch ( config_ptr->incr_mode )
{
@@ -6233,6 +6402,11 @@ H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.")
}
+ /* logically, this is were configuration for flash cache size increases
+ * should go. However, this configuration depends on max_cache_size, so
+ * we wait until the end of the function, when this field is set.
+ */
+
switch ( config_ptr->decr_mode )
{
case H5C2_decr__off:
@@ -6277,9 +6451,14 @@ H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr,
if ( config_ptr->max_size == config_ptr->min_size ) {
cache_ptr->size_increase_possible = FALSE;
+ cache_ptr->flash_size_increase_possible = FALSE;
cache_ptr->size_decrease_possible = FALSE;
}
+ /* flash_size_increase_possible is intentionally omitted from the
+ * following:
+ */
+
cache_ptr->resize_enabled = cache_ptr->size_increase_possible ||
cache_ptr->size_decrease_possible;
@@ -6367,6 +6546,37 @@ H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr,
}
}
+ /* configure flash size increase facility. We wait until the
+ * end of the function, as we need the max_cache_size set before
+ * we start to keep things simple.
+ *
+ * If we haven't already ruled out flash cache size increases above,
+ * go ahead and configure it.
+ */
+
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ switch ( config_ptr->flash_incr_mode )
+ {
+ case H5C2_flash_incr__off:
+ cache_ptr->flash_size_increase_possible = FALSE;
+ break;
+
+ case H5C2_flash_incr__add_space:
+ cache_ptr->flash_size_increase_possible = TRUE;
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+ }
+
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -7272,6 +7482,9 @@ done:
* *cache_ptr), and one of its dxpl ids. Also internal
* changes supporting the revised API.
*
+ * JRM -- 12/31/07
+ * Modified funtion to support flash cache resizes.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -7294,6 +7507,8 @@ H5C2_unprotect(H5C2_t * cache_ptr,
hbool_t clear_entry = FALSE;
#endif /* H5_HAVE_PARALLEL */
herr_t ret_value = SUCCEED; /* Return value */
+ herr_t result;
+ size_t size_increase = 0;
H5C2_cache_entry_t * entry_ptr;
H5C2_cache_entry_t * test_entry_ptr;
@@ -7439,6 +7654,29 @@ H5C2_unprotect(H5C2_t * cache_ptr,
/* update for change in entry size if necessary */
if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) {
+ /* do a flash cache size increase if appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ if ( new_size > entry_ptr->size ) {
+
+ size_increase = new_size - entry_ptr->size;
+
+ if ( size_increase >=
+ cache_ptr->flash_size_increase_threshold ) {
+
+ result = H5C2__flash_increase_cache_size(cache_ptr,
+ entry_ptr->size,
+ new_size);
+
+ if ( result < 0 ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
+ "H5C2__flash_increase_cache_size failed.")
+ }
+ }
+ }
+ }
+
/* update the protected list */
H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \
(cache_ptr->pl_size), \
@@ -7614,7 +7852,9 @@ done:
*
* Modifications:
*
- * None.
+ * Added validation for the flash increment fields.
+ *
+ * JRM -- 12/31/07
*
*-------------------------------------------------------------------------
*/
@@ -7724,6 +7964,33 @@ H5C2_validate_resize_config(H5C2_auto_size_ctl_t * config_ptr,
*/
} /* H5C2_incr__threshold */
+ switch ( config_ptr->flash_incr_mode )
+ {
+ case H5C2_flash_incr__off:
+ /* nothing to do here */
+ break;
+
+ case H5C2_flash_incr__add_space:
+ if ( ( config_ptr->flash_multiple < 0.1 ) ||
+ ( config_ptr->flash_multiple > 10.0 ) ) {
+
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "flash_multiple must be in the range [0.1, 10.0]");
+ }
+
+ if ( ( config_ptr->flash_threshold < 0.1 ) ||
+ ( config_ptr->flash_threshold > 1.0 ) ) {
+
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "flash_threshold must be in the range [0.1, 1.0]");
+ }
+ break;
+
+ default:
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
+ "Invalid flash_incr_mode");
+ break;
+ }
} /* H5C2_RESIZE_CFG__VALIDATE_INCREMENT */
@@ -7870,6 +8137,9 @@ done:
* passed through to other calls, and are no longer
* needed.
*
+ * JRM -- 1/5/08
+ * Added support for flash cache size increases.
+ *
*-------------------------------------------------------------------------
*/
@@ -8147,6 +8417,31 @@ H5C2__auto_adjust_cache_size(H5C2_t * cache_ptr,
cache_ptr->size_decreased = TRUE;
}
+
+ /* update flash cache size increase fields as appropriate */
+ if ( cache_ptr->flash_size_increase_possible ) {
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C2_flash_incr__off:
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C2_flash_incr__off?!")
+ break;
+
+ case H5C2_flash_incr__add_space:
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+ }
}
if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
@@ -8568,7 +8863,7 @@ H5C2__autoadjust__ageout__evict_aged_out_entries(hid_t dxpl_id,
}
if ( prev_ptr != NULL ) {
-
+#ifndef NDEBUG
if ( prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) {
/* something horrible has happened to *prev_ptr --
@@ -8577,13 +8872,15 @@ H5C2__autoadjust__ageout__evict_aged_out_entries(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"*prev_ptr corrupt")
- } else if ( ( prev_ptr->is_dirty != prev_is_dirty )
- ||
- ( prev_ptr->next != next_ptr )
- ||
- ( prev_ptr->is_protected )
- ||
- ( prev_ptr->is_pinned ) ) {
+ } else
+#endif /* NDEBUG */
+ if ( ( prev_ptr->is_dirty != prev_is_dirty )
+ ||
+ ( prev_ptr->next != next_ptr )
+ ||
+ ( prev_ptr->is_protected )
+ ||
+ ( prev_ptr->is_pinned ) ) {
/* something has happened to the LRU -- start over
* from the tail.
@@ -8951,6 +9248,177 @@ done:
/*-------------------------------------------------------------------------
+ *
+ * Function: H5C2__flash_increase_cache_size
+ *
+ * Purpose: If there is not at least new_entry_size - old_entry_size
+ * bytes of free space in the cache and the current
+ * max_cache_size is less than (cache_ptr->resize_ctl).max_size,
+ * perform a flash increase in the cache size and then reset
+ * the full cache hit rate statistics, and exit.
+ *
+ * Return: Non-negative on success/Negative on failure.
+ *
+ * Programmer: John Mainzer, 12/31/07
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+H5C2__flash_increase_cache_size(H5C2_t * cache_ptr,
+ size_t old_entry_size,
+ size_t new_entry_size)
+{
+ /* const char * fcn_name = "H5C2__flash_increase_cache_size()";*/
+ herr_t ret_value = SUCCEED; /* Return value */
+ size_t new_max_cache_size = 0;
+ size_t old_max_cache_size = 0;
+ size_t new_min_clean_size = 0;
+ size_t old_min_clean_size = 0;
+ size_t space_needed;
+ enum H5C2_resize_status status = flash_increase2; /* may change */
+ double hit_rate;
+
+ FUNC_ENTER_NOAPI_NOINIT(H5C2__flash_increase_cache_size)
+ HDassert( cache_ptr );
+ HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC );
+ HDassert( cache_ptr->flash_size_increase_possible );
+ HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold );
+ HDassert( old_entry_size < new_entry_size );
+
+ if ( old_entry_size >= new_entry_size ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "old_entry_size >= new_entry_size")
+ }
+
+ space_needed = new_entry_size - old_entry_size;
+
+ if ( ( (cache_ptr->index_size + space_needed) >
+ cache_ptr->max_cache_size ) &&
+ ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).max_size ) ) {
+
+ /* we have work to do */
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C2_flash_incr__off:
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C2_flash_incr__off?!")
+ break;
+
+ case H5C2_flash_incr__add_space:
+ if ( cache_ptr->index_size < cache_ptr->max_cache_size ) {
+
+ HDassert( (cache_ptr->max_cache_size -
+ cache_ptr->index_size)
+ < space_needed );
+ space_needed -= cache_ptr->max_cache_size -
+ cache_ptr->index_size;
+ }
+ space_needed =
+ (size_t)(((double)space_needed) *
+ (cache_ptr->resize_ctl).flash_multiple);
+
+ new_max_cache_size = cache_ptr->max_cache_size + space_needed;
+
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+
+ if ( new_max_cache_size > (cache_ptr->resize_ctl).max_size ) {
+
+ new_max_cache_size = (cache_ptr->resize_ctl).max_size;
+ }
+
+ HDassert( new_max_cache_size > cache_ptr->max_cache_size );
+
+ new_min_clean_size = (size_t)
+ ((double)new_max_cache_size *
+ ((cache_ptr->resize_ctl).min_clean_fraction));
+
+ HDassert( new_min_clean_size <= new_max_cache_size );
+
+ old_max_cache_size = cache_ptr->max_cache_size;
+ old_min_clean_size = cache_ptr->min_clean_size;
+
+ cache_ptr->max_cache_size = new_max_cache_size;
+ cache_ptr->min_clean_size = new_min_clean_size;
+
+ /* update flash cache size increase fields as appropriate */
+ HDassert ( cache_ptr->flash_size_increase_possible );
+
+ switch ( (cache_ptr->resize_ctl).flash_incr_mode )
+ {
+ case H5C2_flash_incr__off:
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "flash_size_increase_possible but H5C2_flash_incr__off?!")
+ break;
+
+ case H5C2_flash_incr__add_space:
+ cache_ptr->flash_size_increase_threshold =
+ (size_t)
+ (((double)(cache_ptr->max_cache_size)) *
+ ((cache_ptr->resize_ctl).flash_threshold));
+ break;
+
+ default: /* should be unreachable */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "Unknown flash_incr_mode?!?!?.")
+ break;
+ }
+
+ /* note that we don't cycle the epoch markers. We can
+ * argue either way as to whether we should, but for now
+ * we don't.
+ */
+
+ if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) {
+
+ /* get the hit rate for the reporting function. Should still
+ * be good as we havent reset the hit rate statistics.
+ */
+ if ( H5C2_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
+ }
+
+ (*((cache_ptr->resize_ctl).rpt_fcn))
+ (cache_ptr,
+ H5C2__CURR_AUTO_RESIZE_RPT_FCN_VER,
+ hit_rate,
+ status,
+ old_max_cache_size,
+ new_max_cache_size,
+ old_min_clean_size,
+ new_min_clean_size);
+ }
+
+ if ( H5C2_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
+
+ /* this should be impossible... */
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+ "H5C2_reset_cache_hit_rate_stats failed.")
+ }
+ }
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C2__flash_increase_cache_size() */
+
+
+
+/*-------------------------------------------------------------------------
* Function: H5C2_flush_invalidate_cache
*
* Purpose: Flush and destroy the entries contained in the target
@@ -8991,12 +9459,27 @@ done:
* entries being dirtied, resized, and/or renamed inside
* flush callbacks. Updated function to support this.
*
- * -- JRM 8/27/06
- *
* Reworked argument list and code to reflect the
* removal of the secondary dxpl id, and the decision
* to store f in H5C2_t, removing the need to pass it
* in all the time.
+ * -- JRM 8/27/06
+ *
+ * Added code to detect and manage the case in which a
+ * flush callback changes the s-list out from under
+ * the function. The only way I can think of in which this
+ * can happen is if a flush function loads an entry
+ * into the cache that isn't there already. Quincey tells
+ * me that this will never happen, but I'm not sure I
+ * believe him.
+ *
+ * Note that this is a pretty bad scenario if it ever
+ * happens. The code I have added should allow us to
+ * handle the situation under all but the worst conditions,
+ * but one can argue that I should just scream and die if I
+ * ever detect the condidtion.
+ *
+ * -- JRM 10/13/07
*
*-------------------------------------------------------------------------
*/
@@ -9112,8 +9595,10 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"next_entry_ptr == NULL 1 ?!?!");
}
-
- HDassert( next_entry_ptr->magic == H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
+#ifndef NDEBUG
+ HDassert( next_entry_ptr->magic ==
+ H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
HDassert( next_entry_ptr->is_dirty );
HDassert( next_entry_ptr->in_slist );
@@ -9180,14 +9665,16 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
* If the entry has been evicted, we flag an error and
* exit.
*/
-
+#ifndef NDEBUG
if ( entry_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) {
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"entry_ptr->magic is invalid ?!?!");
- } else if ( ( ! entry_ptr->is_dirty ) ||
- ( ! entry_ptr->in_slist ) ) {
+ } else
+#endif /* NDEBUG */
+ if ( ( ! entry_ptr->is_dirty ) ||
+ ( ! entry_ptr->in_slist ) ) {
/* the s-list has been modified out from under us.
* break out of the loop.
@@ -9208,9 +9695,10 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"next_entry_ptr == NULL 2 ?!?!");
}
-
+#ifndef NDEBUG
HDassert( next_entry_ptr->magic ==
H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
+#endif /* NDEBUG */
HDassert( next_entry_ptr->is_dirty );
HDassert( next_entry_ptr->in_slist );
@@ -9345,15 +9833,15 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
while ( next_entry_ptr != NULL )
{
entry_ptr = next_entry_ptr;
-
+#ifndef NDEBUG
HDassert( entry_ptr->magic == H5C2__H5C2_CACHE_ENTRY_T_MAGIC );
-
+#endif /* NDEBUG */
next_entry_ptr = entry_ptr->ht_next;
-
+#ifndef NDEBUG
HDassert ( ( next_entry_ptr == NULL ) ||
( next_entry_ptr->magic ==
H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) );
-
+#endif /* NDEBUG */
if ( entry_ptr->is_protected ) {
/* we have major problems -- but lets flush and destroy
@@ -9405,6 +9893,7 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
* we are accessing a deallocated piece of dynamically
* allocated memory, so we just scream and die.
*/
+#ifndef NDEBUG
if ( ( next_entry_ptr != NULL ) &&
( next_entry_ptr->magic !=
H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) ) {
@@ -9415,6 +9904,7 @@ H5C2_flush_invalidate_cache(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"next_entry_ptr->magic is invalid?!?!?.")
}
+#endif /* NDEBUG */
} /* end while loop scanning hash table bin */
} /* end for loop scanning hash table */
@@ -10203,8 +10693,9 @@ H5C2_flush_single_entry(H5F_t * f,
* set the magic field to bad magic so we can detect a
* freed entry if we see one.
*/
+#ifndef NDEBUG
entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_BAD_MAGIC;
-
+#endif /* NDEBUG */
if ( type_ptr->free_icr(entry_ptr->addr, entry_ptr->size,
(void *)entry_ptr) != SUCCEED )
{
@@ -10423,8 +10914,9 @@ H5C2_load_entry(H5F_t * f,
HDassert( ( dirty == FALSE ) || ( type->id == 4 ) );
HDassert( entry_ptr->size < H5C2_MAX_ENTRY_SIZE );
-
+#ifndef NDEBUG
entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_MAGIC;
+#endif /* NDEBUG */
entry_ptr->addr = addr;
entry_ptr->size = len;
entry_ptr->image_ptr = image_ptr;
@@ -10547,6 +11039,7 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
size_t empty_space;
#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
hbool_t prev_is_dirty = FALSE;
+ hbool_t entry_is_epoch_maker = FALSE;
H5C2_cache_entry_t * entry_ptr;
H5C2_cache_entry_t * prev_ptr;
H5C2_cache_entry_t * next_ptr;
@@ -10585,6 +11078,8 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
if ( (entry_ptr->type)->id != H5C2__EPOCH_MARKER_TYPE ) {
+ entry_is_epoch_maker = FALSE;
+
if ( entry_ptr->is_dirty ) {
result = H5C2_flush_single_entry(cache_ptr->f,
@@ -10610,6 +11105,7 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
/* Skip epoch markers. Set result to SUCCEED to avoid
* triggering the error code below.
*/
+ entry_is_epoch_maker = TRUE;
result = SUCCEED;
}
@@ -10620,7 +11116,7 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
}
if ( prev_ptr != NULL ) {
-
+#ifndef NDEBUG
if ( prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) {
/* something horrible has happened to *prev_ptr --
@@ -10629,6 +11125,16 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"*prev_ptr corrupt 1")
+ } else
+#endif /* NDEBUG */
+ if ( entry_is_epoch_maker ) {
+
+ /* epoch markers don't get flushed, so the sanity checks
+ * on normal entries will fail -- thus just set entry_ptr
+ * to prev_ptr and go on.
+ */
+ entry_ptr = prev_ptr;
+
} else if ( ( prev_ptr->is_dirty != prev_is_dirty )
||
( prev_ptr->next != next_ptr )
@@ -10659,6 +11165,7 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+ entries_examined = 0;
initial_list_len = cache_ptr->dLRU_list_len;
entry_ptr = cache_ptr->dLRU_tail_ptr;
@@ -10707,7 +11214,7 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
}
if ( prev_ptr != NULL ) {
-
+#ifndef NDEBUG
if (prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC) {
/* something horrible has happened to *prev_ptr --
@@ -10717,13 +11224,15 @@ H5C2_make_space_in_cache(hid_t dxpl_id,
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
"*prev_ptr corrupt 2")
- } else if ( ( ! ( prev_ptr->is_dirty ) )
- ||
- ( prev_ptr->aux_next != next_ptr )
- ||
- ( prev_ptr->is_protected )
- ||
- ( prev_ptr->is_pinned ) ) {
+ } else
+#endif /* #ifndef NDEBUG */
+ if ( ( ! ( prev_ptr->is_dirty ) )
+ ||
+ ( prev_ptr->aux_next != next_ptr )
+ ||
+ ( prev_ptr->is_protected )
+ ||
+ ( prev_ptr->is_pinned ) ) {
/* something has happened to the dirty LRU -- start over
* from the tail.
diff --git a/src/H5C2journal.c b/src/H5C2journal.c
new file mode 100644
index 0000000..bb64f7f
--- /dev/null
+++ b/src/H5C2journal.c
@@ -0,0 +1,519 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created: H5C2journal.c
+ * Dec 6 2007
+ * John Mainzer
+ *
+ * Purpose: This file is a general catchall for functions supporting
+ * metadata journaling. Note that journaling must be tighly
+ * integrated with the metadata cache, and thus this file only
+ * contains only that code that can be easily separated from
+ * the rest of the cache code.
+ *
+ * Observe also that to minimize overhead, it is quite possible
+ * that many of the functions in this file will be converted
+ * into macros at some point in the future.
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define H5O_PACKAGE /*suppress error about including H5Opkg */
+#define H5C2_PACKAGE /*suppress error about including H5C2pkg */
+
+#include "H5private.h" /* Generic Functions */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Opkg.h" /* Object headers */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5C2pkg.h" /* Cache */
+
+/**************************************************************************/
+/********************** super block message support ***********************/
+/**************************************************************************/
+
+static void * H5O_mdj_conf_decode(H5F_t UNUSED *f,
+ hid_t UNUSED dxpl_id,
+ unsigned UNUSED mesg_flags,
+ const uint8_t *p);
+
+static herr_t H5O_mdj_conf_encode(H5F_t *f,
+ hbool_t UNUSED disable_shared,
+ uint8_t *p,
+ const void *_mesg);
+
+static void * H5O_mdj_conf_copy(const void *_mesg,
+ void *_dest);
+
+static size_t H5O_mdj_conf_size(const H5F_t UNUSED *f,
+ hbool_t UNUSED disable_shared,
+ const void *_mesg);
+
+static herr_t H5O_mdj_conf_reset(void *_mesg);
+
+static herr_t H5O_mdj_conf_debug(H5F_t UNUSED *f,
+ hid_t UNUSED dxpl_id,
+ const void *_mesg,
+ FILE *stream,
+ int indent,
+ int fwidth);
+
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_MDJ_CONF[1] = {{
+ H5O_MDJ_CONF_ID, /* message id number */
+ "metadata journaling config", /* message name for debugging */
+ sizeof(H5O_mdj_conf_t), /* native message size */
+ 0, /* messages are sharable? */
+ H5O_mdj_conf_decode, /* decode message */
+ H5O_mdj_conf_encode, /* encode message */
+ H5O_mdj_conf_copy, /* copy the native value */
+ H5O_mdj_conf_size, /* raw message size */
+ H5O_mdj_conf_reset, /* free internal memory */
+ NULL, /* free method */
+ NULL, /* file delete method */
+ NULL, /* link method */
+ NULL, /* set share method */
+ NULL, /* can share method */
+ NULL, /* pre copy native value to file */
+ NULL, /* copy native value to file */
+ NULL, /* post copy native value to file */
+ NULL, /* get creation index */
+ NULL, /* set creation index */
+ H5O_mdj_conf_debug /* debug the message */
+}};
+
+
+/* Current version of the metadata journaling configuration information */
+#define H5O_MDJ_CONF_VERSION 0
+
+#define MDJ_CONF__JOURNALING_ENABLED_FLAG 0x0001
+#define MDJ_CONF__JOURNAL_IS_EXTERNAL_FLAG 0x0002
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_decode
+ *
+ * Purpose: Decode a journaling configuration message and return a
+ * pointer to a newly allocated H5O_mdj_conf_t struct.
+ *
+ * Return: Success: Ptr to new message in native struct.
+ * Failure: NULL
+ *
+ * Programmer: John Mainzer
+ * Dec. 14, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void *
+H5O_mdj_conf_decode(H5F_t *f,
+ hid_t UNUSED dxpl_id,
+ unsigned UNUSED mesg_flags,
+ const uint8_t *p)
+{
+ const char * fcn_name = "H5O_mdj_conf_decode()";
+ uint16_t flags = 0; /* packed boolean fields */
+ H5O_mdj_conf_t *mesg; /* Native message */
+ void *ret_value; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_btreek_decode)
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* Sanity check */
+ HDassert(f);
+ HDassert(p);
+
+ /* Version of message */
+ if ( *p++ != H5O_MDJ_CONF_VERSION ) {
+
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, \
+ "bad version number for message")
+ }
+
+ /* Allocate space for message */
+
+ if( NULL == ( mesg = H5MM_calloc(sizeof(H5O_mdj_conf_t)))) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
+ "memory allocation failed for metadata journaling config message.");
+
+ }
+
+ /* retrieve packed boolean flags, upack and load them. */
+ UINT16DECODE(p, flags);
+
+ if ( (flags & MDJ_CONF__JOURNALING_ENABLED_FLAG) != 0 ) {
+
+ mesg->journaling_enabled = TRUE;
+
+ } else {
+
+ mesg->journaling_enabled = FALSE;
+
+ }
+
+ if ( (flags & MDJ_CONF__JOURNAL_IS_EXTERNAL_FLAG) != 0 ) {
+
+ mesg->journal_is_external = TRUE;
+
+ } else {
+
+ mesg->journal_is_external = FALSE;
+
+ }
+
+
+ /* retrieve the internal journal location */
+
+ H5F_addr_decode(f, &p, &(mesg->internal_journal_loc));
+
+
+ /* retrieve the size of the external journal path buffer */
+
+ UINT16DECODE(p, mesg->path_len);
+
+ if ( ( ! mesg->journal_is_external ) &&
+ ( mesg->path_len != 0 ) ) {
+
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, \
+ "internal journal and positive path len?!?");
+
+ }
+
+ if ( mesg->path_len > 0 ) {
+
+ /* Allocate space for buffer */
+ if ( NULL ==
+ (mesg->external_journal_file_path_ptr =
+ H5MM_malloc(mesg->path_len + 1)) ) {
+
+ mesg = H5MM_xfree(mesg);
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
+ "memory allocation failed for journal file path buffer")
+
+ } /* end if */
+
+ /* Copy encoded journal file path info into buffer */
+ HDmemcpy(mesg->external_journal_file_path_ptr, p, mesg->path_len);
+
+ } else {
+
+ mesg->external_journal_file_path_ptr = NULL;
+
+ }
+
+ /* Set return value */
+ ret_value = (void *)mesg;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O_mdj_conf_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_encode
+ *
+ * Purpose: Encode metadata journaling configuration message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: John Mainzer
+ * Dec. 6, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+H5O_mdj_conf_encode(H5F_t *f,
+ hbool_t UNUSED disable_shared,
+ uint8_t *p,
+ const void *_mesg)
+{
+ const char * fcn_name = "H5O_mdj_conf_encode()";
+ const H5O_mdj_conf_t *mesg = (const H5O_mdj_conf_t *)_mesg;
+ uint16_t flags = 0;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_mdj_conf_encode)
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* Sanity check */
+ HDassert(f);
+ HDassert(p);
+ HDassert(mesg);
+
+ /* setup the flags */
+ if ( mesg->journaling_enabled ) {
+
+ flags |= MDJ_CONF__JOURNALING_ENABLED_FLAG;
+
+ }
+
+ if ( mesg->journal_is_external ) {
+
+ flags |= MDJ_CONF__JOURNAL_IS_EXTERNAL_FLAG;
+
+ }
+
+ /* Store version, flags, internal_loc, path_len, & path buffer */
+
+ *p++ = H5O_MDJ_CONF_VERSION;
+
+ UINT16ENCODE(p, flags);
+
+ H5F_addr_encode(f, &p, mesg->internal_journal_loc);
+
+ HDassert(mesg->path_len <= 65535);
+
+ UINT16ENCODE(p, mesg->path_len);
+
+ if ( mesg->path_len > 0 ) {
+
+ HDmemcpy(p, mesg->external_journal_file_path_ptr, mesg->path_len);
+
+ }
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+
+} /* H5O_mdj_conf_encode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_copy
+ *
+ * Purpose: Copies a message from _MESG to _DEST, allocating _DEST if
+ * necessary.
+ *
+ * Return: Success: Ptr to _DEST
+ * Failure: NULL
+ *
+ * Programmer: Quincey Koziol
+ * Mar 1, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void *
+H5O_mdj_conf_copy(const void *_mesg, void *_dest)
+{
+ const char * fcn_name = "H5O_mdj_conf_copy()";
+ const H5O_mdj_conf_t *mesg = (const H5O_mdj_conf_t *)_mesg;
+ H5O_mdj_conf_t *dest = (H5O_mdj_conf_t *)_dest;
+ void *ret_value;
+
+ FUNC_ENTER_NOAPI_NOINIT(H5O_mdj_conf_copy)
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* Sanity check */
+ HDassert(mesg);
+
+ if ( ( dest == NULL ) &&
+ ( ( NULL == (dest = H5MM_malloc(sizeof(H5O_mdj_conf_t))) ) ||
+ ( ( mesg->path_len > 0 ) &&
+ ( ( NULL == (dest->external_journal_file_path_ptr =
+ H5MM_malloc(mesg->path_len + 1)) ) ) ) ) ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
+ "memory allocation failed for metadata journaling conf message")
+
+ }
+
+ /* now copy the message */
+ dest->journaling_enabled = mesg->journaling_enabled;
+ dest->journal_is_external = mesg->journal_is_external;
+ dest->internal_journal_loc = mesg->internal_journal_loc;
+ dest->path_len = mesg->path_len;
+
+ if ( dest->path_len > 0 ) {
+
+ HDmemcpy(dest->external_journal_file_path_ptr,
+ mesg->external_journal_file_path_ptr,
+ mesg->path_len);
+
+ } else {
+
+ dest->external_journal_file_path_ptr = NULL;
+ }
+
+
+ /* Set return value */
+ ret_value = dest;
+
+done:
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O_mdj_conf_copy() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_size
+ *
+ * Purpose: Returns the size of the raw message in bytes not counting the
+ * message type or size fields, but only the data fields.
+ *
+ * Return: Success: Message data size in bytes w/o alignment.
+ * Failure: 0
+ *
+ * Programmer: John Mainzer
+ * Dec. 12, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_mdj_conf_size(const H5F_t *f,
+ hbool_t UNUSED disable_shared,
+ const void *_mesg)
+{
+ const char * fcn_name = "H5O_mdj_conf_size()";
+ const H5O_mdj_conf_t * mesg = (const H5O_mdj_conf_t *)_mesg;
+ size_t ret_value;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_mdj_conf_size)
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* Sanity check */
+ HDassert(f);
+ HDassert(mesg);
+
+ ret_value = 1 + /* Version number */
+ 2 + /* flags */
+ H5F_SIZEOF_ADDR(f) + /* addr of internal journal */
+ 2 + /* length of external journal path */
+ mesg->path_len; /* external journal path buffer */
+
+ FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O_mdj_conf_size() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_reset
+ *
+ * Purpose: Frees internal pointers and resets the message to an
+ * initial state.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: John Mainzer
+ * Dec. 13, 2007
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+H5O_mdj_conf_reset(void *_mesg)
+{
+ const char * fcn_name = "H5O_mdj_conf_reset()";
+ H5O_mdj_conf_t *mesg = (H5O_mdj_conf_t *) _mesg;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_mdj_conf_reset);
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* check args */
+ assert(mesg);
+
+ /* reset */
+ if ( mesg->external_journal_file_path_ptr != NULL )
+ {
+ HDassert( mesg->path_len > 0 );
+ HDassert( mesg->journal_is_external );
+ mesg->external_journal_file_path_ptr =
+ H5MM_xfree(mesg->external_journal_file_path_ptr);
+ mesg->path_len = 0;
+ }
+
+ FUNC_LEAVE_NOAPI(SUCCEED);
+
+} /* H5O_mdj_conf_reset() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mdj_conf_debug
+ *
+ * Purpose: Prints debugging info for the message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: John Mainzer
+ * Dec. 7, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static herr_t
+H5O_mdj_conf_debug(H5F_t UNUSED *f,
+ hid_t UNUSED dxpl_id,
+ const void *_mesg,
+ FILE *stream,
+ int indent,
+ int fwidth)
+{
+ const char * fcn_name = "H5O_mdj_conf_debug()";
+ const H5O_mdj_conf_t *mesg = (const H5O_mdj_conf_t *)_mesg;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_btreek_debug)
+
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ /* Sanity check */
+ HDassert(f);
+ HDassert(mesg);
+ HDassert(stream);
+ HDassert(indent >= 0);
+ HDassert(fwidth >= 0);
+
+ HDfprintf(stream, "%*s%-*s %d\n", indent, "", fwidth,
+ "journaling_enabled:",
+ (int)(mesg->journaling_enabled));
+
+ HDfprintf(stream, "%*s%-*s %d\n", indent, "", fwidth,
+ "journal_is_external:",
+ (int)(mesg->journal_is_external));
+
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+ "internal_journal_loc:",
+ mesg->internal_journal_loc);
+
+ HDfprintf(stream, "%*s%-*s %d\n", indent, "", fwidth,
+ "path_len:",
+ (int)(mesg->path_len));
+
+ if ( mesg->path_len > 0 ) {
+
+ HDfprintf(stream, "%*s%-*s \"%s\"\n", indent, "", fwidth,
+ "external_journal_file_path_ptr:",
+ (char *)(mesg->external_journal_file_path_ptr));
+
+ }
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+
+} /* end H5O_mdj_conf_debug() */
diff --git a/src/H5C2pkg.h b/src/H5C2pkg.h
index a1753b4..71c8e15 100644
--- a/src/H5C2pkg.h
+++ b/src/H5C2pkg.h
@@ -471,6 +471,18 @@
* all the ways this can happen, we simply set this flag when
* we receive a new configuration.
*
+ * flash_size_increase_possible: Depending on the configuration data given
+ * in the resize_ctl field, it may or may not be possible
+ * for a flash size increase to occur. We set this flag
+ * whenever we receive a new configuration so as to avoid
+ * repeated calculations.
+ *
+ * flash_size_increase_threshold: If a flash cache size increase is possible,
+ * this field is used to store the minimum size of a new entry
+ * or size increase needed to trigger a flash cache size
+ * increase. Note that this field must be updated whenever
+ * the size of the cache is changed.
+ *
* size_decrease_possible: Depending on the configuration data given
* in the resize_ctl field, it may or may not be possible
* to decrease the size of the cache. Rather than test for
@@ -863,6 +875,8 @@ struct H5C2_t
H5C2_cache_entry_t * dLRU_tail_ptr;
hbool_t size_increase_possible;
+ hbool_t flash_size_increase_possible;
+ size_t flash_size_increase_threshold;
hbool_t size_decrease_possible;
hbool_t resize_enabled;
hbool_t cache_full;
diff --git a/src/H5C2private.h b/src/H5C2private.h
index a949f6d..b70e968 100644
--- a/src/H5C2private.h
+++ b/src/H5C2private.h
@@ -804,12 +804,16 @@ typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr,
*
****************************************************************************/
+#ifndef NDEBUG
#define H5C2__H5C2_CACHE_ENTRY_T_MAGIC 0x005CAC0A
#define H5C2__H5C2_CACHE_ENTRY_T_BAD_MAGIC 0xDeadBeef
+#endif /* NDEBUG */
typedef struct H5C2_cache_entry_t
{
+#ifndef NDEBUG
uint32_t magic;
+#endif /* NDEBUG */
haddr_t addr;
size_t size;
void * image_ptr;
@@ -954,6 +958,57 @@ typedef struct H5C2_cache_entry_t
* above, this field contains the maximum number of bytes by which the
* cache size can be increased in a single re-size.
*
+ * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated
+ * type whose value indicates whether and by what algorithm we should
+ * make flash increases in the size of the cache to accomodate insertion
+ * of large entries and large increases in the size of a single entry.
+ *
+ * The addition of the flash increment mode was occasioned by performance
+ * problems that appear when a local heap is increased to a size in excess
+ * of the current cache size. While the existing re-size code dealt with
+ * this eventually, performance was very bad for the remainder of the
+ * epoch.
+ *
+ * At present, there are two possible values for the flash_incr_mode:
+ *
+ * H5C_flash_incr__off: Don't perform flash increases in the size of
+ * the cache.
+ *
+ * H5C_flash_incr__add_space: Let x be either the size of a newly
+ * newly inserted entry, or the number of bytes by which the
+ * size of an existing entry has been increased.
+ *
+ * If
+ * x > flash_threshold * current max cache size,
+ *
+ * increase the current maximum cache size by x * flash_multiple
+ * less any free space in the cache, and start a new epoch. For
+ * now at least, pay no attention to the maximum increment.
+ *
+ *
+ * With a little thought, it should be obvious that the above flash
+ * cache size increase algorithm is not sufficient for all
+ * circumstances -- for example, suppose the user round robins through
+ * (1/flash_threshold) +1 groups, adding one data set to each on each
+ * pass. Then all will increase in size at about the same time, requiring
+ * the max cache size to at least double to maintain acceptable
+ * performance, however the above flash increment algorithm will not be
+ * triggered.
+ *
+ * Hopefully, the add space algorithm detailed above will be sufficient
+ * for the performance problems encountered to date. However, we should
+ * expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ * H5C_flash_incr__add_space section of the discussion of the
+ * flash_incr_mode section. This field is ignored unless flash_incr_mode
+ * is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache
+ * size is multiplied to obtain the size threshold for the add_space
+ * flash increment algorithm. The field is ignored unless
+ * flash_incr_mode is H5C2_flash_incr__add_space.
+ *
*
* Cache size decrease control fields:
*
@@ -1068,6 +1123,8 @@ typedef struct H5C2_cache_entry_t
#define H5C2__DEF_AR_MIN_CLEAN_FRAC 0.5
#define H5C2__DEF_AR_INCREMENT 2.0
#define H5C2__DEF_AR_MAX_INCREMENT ((size_t)( 2 * 1024 * 1024))
+#define H5C2__DEF_AR_FLASH_MULTIPLE 1.0
+#define H5C2__DEV_AR_FLASH_THRESHOLD 0.25
#define H5C2__DEF_AR_DECREMENT 0.9
#define H5C2__DEF_AR_MAX_DECREMENT ((size_t)( 1 * 1024 * 1024))
#define H5C2__DEF_AR_EPCHS_B4_EVICT 3
@@ -1080,6 +1137,7 @@ enum H5C2_resize_status
{
in_spec2,
increase2,
+ flash_increase2,
decrease2,
at_max_size2,
at_min_size2,
@@ -1100,45 +1158,49 @@ typedef void (*H5C2_auto_resize_rpt_fcn)(H5C2_t * cache_ptr,
typedef struct H5C2_auto_size_ctl_t
{
/* general configuration fields: */
- int32_t version;
- H5C2_auto_resize_rpt_fcn rpt_fcn;
+ int32_t version;
+ H5C2_auto_resize_rpt_fcn rpt_fcn;
- hbool_t set_initial_size;
- size_t initial_size;
+ hbool_t set_initial_size;
+ size_t initial_size;
- double min_clean_fraction;
+ double min_clean_fraction;
- size_t max_size;
- size_t min_size;
+ size_t max_size;
+ size_t min_size;
- int64_t epoch_length;
+ int64_t epoch_length;
/* size increase control fields: */
- enum H5C2_cache_incr_mode incr_mode;
+ enum H5C2_cache_incr_mode incr_mode;
+
+ double lower_hr_threshold;
- double lower_hr_threshold;
+ double increment;
- double increment;
+ hbool_t apply_max_increment;
+ size_t max_increment;
- hbool_t apply_max_increment;
- size_t max_increment;
+ enum H5C2_cache_flash_incr_mode flash_incr_mode;
+ double flash_multiple;
+ double flash_threshold;
/* size decrease control fields: */
- enum H5C2_cache_decr_mode decr_mode;
+ enum H5C2_cache_decr_mode decr_mode;
- double upper_hr_threshold;
+ double upper_hr_threshold;
- double decrement;
+ double decrement;
- hbool_t apply_max_decrement;
- size_t max_decrement;
+ hbool_t apply_max_decrement;
+ size_t max_decrement;
- int32_t epochs_before_eviction;
+ int32_t epochs_before_eviction;
- hbool_t apply_empty_reserve;
- double empty_reserve;
+ hbool_t apply_empty_reserve;
+ double empty_reserve;
} H5C2_auto_size_ctl_t;
diff --git a/src/H5C2public.h b/src/H5C2public.h
index e1adff3..d293ccb 100644
--- a/src/H5C2public.h
+++ b/src/H5C2public.h
@@ -41,6 +41,13 @@ enum H5C2_cache_incr_mode
H5C2_incr__threshold
};
+enum H5C2_cache_flash_incr_mode
+{
+ H5C2_flash_incr__off,
+ H5C2_flash_incr__add_space
+};
+
+
enum H5C2_cache_decr_mode
{
H5C2_decr__off,
diff --git a/src/H5Cpkg.h b/src/H5Cpkg.h
index 949f923..7c04ea2 100644
--- a/src/H5Cpkg.h
+++ b/src/H5Cpkg.h
@@ -465,6 +465,18 @@
* all the ways this can happen, we simply set this flag when
* we receive a new configuration.
*
+ * flash_size_increase_possible: Depending on the configuration data given
+ * in the resize_ctl field, it may or may not be possible
+ * for a flash size increase to occur. We set this flag
+ * whenever we receive a new configuration so as to avoid
+ * repeated calculations.
+ *
+ * flash_size_increase_threshold: If a flash cache size increase is possible,
+ * this field is used to store the minimum size of a new entry
+ * or size increase needed to trigger a flash cache size
+ * increase. Note that this field must be updated whenever
+ * the size of the cache is changed.
+ *
* size_decrease_possible: Depending on the configuration data given
* in the resize_ctl field, it may or may not be possible
* to decrease the size of the cache. Rather than test for
@@ -580,10 +592,10 @@
* equal to the array index has not been in cache when
* requested in the current epoch.
*
- * write_protects: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. The cells
- * are used to record the number of times an entry with type id
- * equal to the array index has been write protected in the
- * current epoch.
+ * write_protects: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. The
+ * cells are used to record the number of times an entry with
+ * type id equal to the array index has been write protected
+ * in the current epoch.
*
* Observe that (hits + misses) = (write_protects + read_protects).
*
@@ -855,6 +867,8 @@ struct H5C_t
H5C_cache_entry_t * dLRU_tail_ptr;
hbool_t size_increase_possible;
+ hbool_t flash_size_increase_possible;
+ size_t flash_size_increase_threshold;
hbool_t size_decrease_possible;
hbool_t resize_enabled;
hbool_t cache_full;
diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h
index d365755..53dcf0d 100644
--- a/src/H5Cprivate.h
+++ b/src/H5Cprivate.h
@@ -202,6 +202,27 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
*
* JRM - 4/26/04
*
+ * magic: Unsigned 32 bit integer that must always be set to
+ * H5C__H5C_CACHE_ENTRY_T_MAGIC when the entry is valid.
+ * The field must be set to H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC
+ * just before the entry is freed.
+ *
+ * This is necessary, as the LRU list can be changed out
+ * from under H5C_make_space_in_cache() by the flush
+ * callback which may change the size of an existing entry,
+ * and/or load a new entry while serializing the target entry.
+ *
+ * This in turn can cause a recursive call to
+ * H5C_make_space_in_cache() which may either flush or evict
+ * the next entry that the first invocation of that function
+ * was about to examine.
+ *
+ * The magic field allows H5C_make_space_in_cache() to
+ * detect this case, and re-start its scan from the bottom
+ * of the LRU when this situation occurs.
+ *
+ * This field is only compiled in debug mode.
+ *
* addr: Base address of the cache entry on disk.
*
* size: Length of the cache entry on disk. Note that unlike normal
@@ -442,8 +463,16 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
*
****************************************************************************/
+#ifndef NDEBUG
+#define H5C__H5C_CACHE_ENTRY_T_MAGIC 0x005CAC0A
+#define H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC 0xDeadBeef
+#endif /* NDEBUG */
+
typedef struct H5C_cache_entry_t
{
+#ifndef NDEBUG
+ uint32_t magic;
+#endif /* NDEBUG */
haddr_t addr;
size_t size;
const H5C_class_t * type;
@@ -587,7 +616,58 @@ typedef struct H5C_cache_entry_t
* above, this field contains the maximum number of bytes by which the
* cache size can be increased in a single re-size.
*
- *
+ * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated
+ * type whose value indicates whether and by what algorithm we should
+ * make flash increases in the size of the cache to accomodate insertion
+ * of large entries and large increases in the size of a single entry.
+ *
+ * The addition of the flash increment mode was occasioned by performance
+ * problems that appear when a local heap is increased to a size in excess
+ * of the current cache size. While the existing re-size code dealt with
+ * this eventually, performance was very bad for the remainder of the
+ * epoch.
+ *
+ * At present, there are two possible values for the flash_incr_mode:
+ *
+ * H5C_flash_incr__off: Don't perform flash increases in the size of
+ * the cache.
+ *
+ * H5C_flash_incr__add_space: Let x be either the size of a newly
+ * newly inserted entry, or the number of bytes by which the
+ * size of an existing entry has been increased.
+ *
+ * If
+ * x > flash_threshold * current max cache size,
+ *
+ * increase the current maximum cache size by x * flash_multiple
+ * less any free space in the cache, and start a new epoch. For
+ * now at least, pay no attention to the maximum increment.
+ *
+ *
+ * With a little thought, it should be obvious that the above flash
+ * cache size increase algorithm is not sufficient for all circumstances --
+ * for example, suppose the user round robins through
+ * (1/flash_threshold) +1 groups, adding one data set to each on each
+ * pass. Then all will increase in size at about the same time, requiring
+ * the max cache size to at least double to maintain acceptable
+ * performance, however the above flash increment algorithm will not be
+ * triggered.
+ *
+ * Hopefully, the add space algorithm detailed above will be sufficient
+ * for the performance problems encountered to date. However, we should
+ * expect to revisit the issue.
+ *
+ * flash_multiple: Double containing the multiple described above in the
+ * H5C_flash_incr__add_space section of the discussion of the
+ * flash_incr_mode section. This field is ignored unless flash_incr_mode
+ * is H5C_flash_incr__add_space.
+ *
+ * flash_threshold: Double containing the factor by which current max cache size
+ * is multiplied to obtain the size threshold for the add_space flash
+ * increment algorithm. The field is ignored unless flash_incr_mode is
+ * H5C_flash_incr__add_space.
+ *
+ *
* Cache size decrease control fields:
*
* decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose
@@ -701,6 +781,8 @@ typedef struct H5C_cache_entry_t
#define H5C__DEF_AR_MIN_CLEAN_FRAC 0.5
#define H5C__DEF_AR_INCREMENT 2.0
#define H5C__DEF_AR_MAX_INCREMENT ((size_t)( 2 * 1024 * 1024))
+#define H5C__DEF_AR_FLASH_MULTIPLE 1.0
+#define H5C__DEV_AR_FLASH_THRESHOLD 0.25
#define H5C__DEF_AR_DECREMENT 0.9
#define H5C__DEF_AR_MAX_DECREMENT ((size_t)( 1 * 1024 * 1024))
#define H5C__DEF_AR_EPCHS_B4_EVICT 3
@@ -713,6 +795,7 @@ enum H5C_resize_status
{
in_spec,
increase,
+ flash_increase,
decrease,
at_max_size,
at_min_size,
@@ -733,45 +816,48 @@ typedef void (*H5C_auto_resize_rpt_fcn)(H5C_t * cache_ptr,
typedef struct H5C_auto_size_ctl_t
{
/* general configuration fields: */
- int32_t version;
- H5C_auto_resize_rpt_fcn rpt_fcn;
+ int32_t version;
+ H5C_auto_resize_rpt_fcn rpt_fcn;
- hbool_t set_initial_size;
- size_t initial_size;
+ hbool_t set_initial_size;
+ size_t initial_size;
- double min_clean_fraction;
+ double min_clean_fraction;
- size_t max_size;
- size_t min_size;
+ size_t max_size;
+ size_t min_size;
- int64_t epoch_length;
+ int64_t epoch_length;
/* size increase control fields: */
- enum H5C_cache_incr_mode incr_mode;
+ enum H5C_cache_incr_mode incr_mode;
- double lower_hr_threshold;
+ double lower_hr_threshold;
- double increment;
+ double increment;
- hbool_t apply_max_increment;
- size_t max_increment;
+ hbool_t apply_max_increment;
+ size_t max_increment;
+ enum H5C_cache_flash_incr_mode flash_incr_mode;
+ double flash_multiple;
+ double flash_threshold;
/* size decrease control fields: */
- enum H5C_cache_decr_mode decr_mode;
+ enum H5C_cache_decr_mode decr_mode;
- double upper_hr_threshold;
+ double upper_hr_threshold;
- double decrement;
+ double decrement;
- hbool_t apply_max_decrement;
- size_t max_decrement;
+ hbool_t apply_max_decrement;
+ size_t max_decrement;
- int32_t epochs_before_eviction;
+ int32_t epochs_before_eviction;
- hbool_t apply_empty_reserve;
- double empty_reserve;
+ hbool_t apply_empty_reserve;
+ double empty_reserve;
} H5C_auto_size_ctl_t;
diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h
index 082d512..7ef959a 100644
--- a/src/H5Cpublic.h
+++ b/src/H5Cpublic.h
@@ -41,6 +41,12 @@ enum H5C_cache_incr_mode
H5C_incr__threshold
};
+enum H5C_cache_flash_incr_mode
+{
+ H5C_flash_incr__off,
+ H5C_flash_incr__add_space
+};
+
enum H5C_cache_decr_mode
{
H5C_decr__off,
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 3e13b0d..5c54fdd 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -113,6 +113,11 @@ typedef struct H5F_file_t {
struct H5G_t *root_grp; /* Open root group */
H5FO_t *open_objs; /* Open objects in file */
H5RC_t *grp_btree_shared; /* Ref-counted group B-tree node info */
+ hbool_t journaling_enabled; /* metadata journaling configuration */
+ hbool_t journal_is_external; /* fields. All fields as per those */
+ haddr_t internal_journal_loc;/* of the same name in M5O_mdj_conf_t. */
+ size_t path_len;
+ uint8_t * external_journal_file_path_ptr;
} H5F_file_t;
/* A record of the mount table */
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index cbc5f72..ed3395e 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -33,6 +33,8 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Pprivate.h" /* Property lists */
#include "H5SMprivate.h" /* Shared Object Header Messages */
+#include "H5MMprivate.h" /* Memory management */
+
/****************/
@@ -226,6 +228,12 @@ done:
* wendling@ncsa.uiuc.edu
* Sept 12, 2003
*
+ * Changes: Johm Mainzer
+ * 12/14/07
+ * Added code to read in the metadata journaling config
+ * if it is present, and to initialize
+ * f->shared->journaling_enabled to FALSE if it isn't.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -251,6 +259,14 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc)
shared = f->shared;
lf = shared->lf;
+ /* initialize the metadata journaling configuration sections of the
+ * super block to indicate that journaling is not turned on at
+ * present. These initialization may be overridden shortly.
+ */
+ shared->journaling_enabled = FALSE;
+ shared->path_len = 0;
+ shared->external_journal_file_path_ptr = NULL;
+
/* Get the shared file creation property list */
if(NULL == (c_plist = H5I_object(shared->fcpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
@@ -553,6 +569,9 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc)
H5O_loc_t ext_loc; /* "Object location" for superblock extension */
H5O_btreek_t btreek; /* v1 B-tree 'K' value message from superblock extension */
H5O_drvinfo_t drvinfo; /* Driver info message from superblock extension */
+ H5O_mdj_conf_t mdj_conf;/* metadata journaling config message
+ * from superblock extension
+ */
/* Sanity check - superblock extension should only be defined for
* superblock version >= 2.
@@ -617,6 +636,48 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc)
H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo);
} /* end else */
+ /* Read in the metadata journaling configuration message,
+ * if it exists.
+ */
+ if(NULL == H5O_msg_read(&ext_loc, H5O_MDJ_CONF_ID, &mdj_conf, dxpl_id)) {
+ /* Reset error from "failed" message read */
+ H5E_clear_stack(NULL);
+ } /* end if */
+ else {
+
+ shared->journaling_enabled = mdj_conf.journaling_enabled;
+
+ if ( shared->journaling_enabled ) {
+
+ shared->journal_is_external = mdj_conf.journal_is_external;
+ shared->internal_journal_loc = mdj_conf.internal_journal_loc;
+ shared->path_len = mdj_conf.path_len;
+ shared->external_journal_file_path_ptr =
+ mdj_conf.external_journal_file_path_ptr;
+
+ /* for now at least, the journal file must always be
+ * external -- hence the following asserts. Remove them
+ * if we ever support an internal journal.
+ */
+ HDassert( shared->journal_is_external );
+ HDassert( shared->path_len > 0 );
+ HDassert( shared->external_journal_file_path_ptr != NULL );
+
+ /* if there is a an external journal file,
+ * H5O_mdj_conf_decode() will allocate a buffer to
+ * store it in. Rather than allocate our own buffer,
+ * we will use the one created by H5O_mdj_conf_decode(),
+ * and modify mdj_conf so that H5O_mdj_conf_reset() will
+ * not discard it.
+ */
+ mdj_conf.path_len = 0;
+ mdj_conf.external_journal_file_path_ptr = NULL;
+ }
+
+ /* Reset metadata journaling config message */
+ H5O_msg_reset(H5O_MDJ_CONF_ID, &mdj_conf);
+ }
+
/* Close the extension. Twiddle the number of open objects to avoid
* closing the file (since this will be the only open object).
*/
@@ -645,6 +706,13 @@ done:
* koziol@ncsa.uiuc.edu
* Sept 15, 2003
*
+ * Changes: John Mainzer
+ * Dec. 14, 2007
+ * Added initialization for the metadata journaling
+ * configuration fields. By default, these fields are
+ * initialized to indicate that we are not journaling
+ * metadata.
+ *
*-------------------------------------------------------------------------
*/
herr_t
@@ -802,6 +870,43 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update driver info header message")
} /* end if */
+ /* check for journaling config data to store */
+ if ( f->shared->journaling_enabled ) {
+
+ struct H5O_mdj_conf_t mdj_conf;
+
+ mdj_conf.journaling_enabled = f->shared->journaling_enabled;
+ mdj_conf.journal_is_external = f->shared->journal_is_external;
+ mdj_conf.internal_journal_loc = f->shared->internal_journal_loc;
+ mdj_conf.path_len = f->shared->path_len;
+
+ if ( f->shared->external_journal_file_path_ptr == NULL ) {
+
+ mdj_conf.external_journal_file_path_ptr = NULL;
+
+ } else {
+
+ if ( ( NULL == (mdj_conf.external_journal_file_path_ptr =
+ H5MM_malloc(mdj_conf.path_len + 1)) ) ) {
+
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
+ "memory alloc failed for mdj path")
+
+ }
+ HDmemcpy(mdj_conf.external_journal_file_path_ptr,
+ f->shared->external_journal_file_path_ptr,
+ f->shared->path_len);
+ }
+
+ if ( H5O_msg_create(&ext_loc, H5O_MDJ_CONF_ID,
+ H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE,
+ H5O_UPDATE_TIME, &mdj_conf, dxpl_id) < 0 ) {
+
+ HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, \
+ "unable to update metadata journal conf header message")
+ }
+ }
+
/* Twiddle the number of open objects to avoid closing the file
* (since this will be the only open object currently).
*/
diff --git a/src/H5O.c b/src/H5O.c
index 94435f5..021b69e 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -77,6 +77,10 @@ static herr_t H5O_obj_type_real(H5O_t *oh, H5O_type_t *obj_type);
/*********************/
/* Header message ID to class mapping */
+
+/* Remember to increment H5O_MSG_TYPES in H5Opkg.h when adding a new
+ * message.
+ */
const H5O_msg_class_t *const H5O_msg_class_g[] = {
H5O_MSG_NULL, /*0x0000 Null */
H5O_MSG_SDSPACE, /*0x0001 Dataspace */
@@ -105,9 +109,12 @@ const H5O_msg_class_t *const H5O_msg_class_g[] = {
H5O_MSG_DRVINFO, /*0x0014 Driver info settings */
H5O_MSG_AINFO, /*0x0015 Attribute information */
H5O_MSG_REFCOUNT, /*0x0016 Object's ref. count */
- H5O_MSG_UNKNOWN, /*0x0017 Placeholder for unknown message */
+ H5O_MSG_MDJ_CONF, /*0x0017 Metadata journaling config */
+ H5O_MSG_UNKNOWN, /*0x0018 Placeholder for unknown message */
};
+/* HDassert(H5O_UNKNOWN_ID < H5O_MSG_TYPES); */
+
/* Header object ID to class mapping */
/*
* Initialize the object class info table. Begin with the most general types
@@ -157,6 +164,10 @@ H5FL_EXTERN(time_t);
* Programmer: Quincey Koziol
* Thursday, January 18, 2007
*
+ * Changes: JRM -- 12/12/07
+ * Added santity check verifying that H5O_msg_class_g
+ * is big enough.
+ *
*-------------------------------------------------------------------------
*/
static herr_t
@@ -168,6 +179,8 @@ H5O_init_interface(void)
HDassert(H5O_MSG_TYPES == NELMTS(H5O_msg_class_g));
HDassert(sizeof(H5O_fheap_id_t) == H5O_FHEAP_ID_LEN);
+ HDassert(H5O_UNKNOWN_ID < H5O_MSG_TYPES);
+
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5O_init_interface() */
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index c90ff0a..94af802 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -30,7 +30,7 @@
#define H5O_NMESGS 8 /*initial number of messages */
#define H5O_NCHUNKS 2 /*initial number of chunks */
#define H5O_MIN_SIZE 22 /* Min. obj header data size (must be big enough for a message prefix and a continuation message) */
-#define H5O_MSG_TYPES 24 /* # of types of messages */
+#define H5O_MSG_TYPES 25 /* # of types of messages */
#define H5O_MAX_CRT_ORDER_IDX 65535 /* Max. creation order index value */
/* Versions of object header structure */
@@ -431,7 +431,10 @@ H5_DLLVAR const H5O_msg_class_t H5O_MSG_AINFO[1];
/* Reference Count Message. (0x0016) */
H5_DLLVAR const H5O_msg_class_t H5O_MSG_REFCOUNT[1];
-/* Placeholder for unknown message. (0x0017) */
+/* Metadata Journaling Config Message. (0x0017) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_MDJ_CONF[1];
+
+/* Placeholder for unknown message. (0x0018) */
H5_DLLVAR const H5O_msg_class_t H5O_MSG_UNKNOWN[1];
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 31738a9..3188468 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -62,6 +62,8 @@ typedef struct H5O_t H5O_t;
#define H5O_FHEAP_MAX_MAN_SIZE (4 * 1024)
#define H5O_FHEAP_ID_LEN 8
+/* #define H5O_ENABLE_BOGUS 1 */
+
/* Object header macros */
#define H5O_MESG_MAX_SIZE 65536 /*max obj header message size */
#define H5O_ALL (-1) /* Operate on all messages of type */
@@ -160,7 +162,8 @@ typedef struct H5O_copy_t {
#define H5O_DRVINFO_ID 0x0014 /* Driver info message. */
#define H5O_AINFO_ID 0x0015 /* Attribute info message. */
#define H5O_REFCOUNT_ID 0x0016 /* Reference count message. */
-#define H5O_UNKNOWN_ID 0x0017 /* Placeholder message ID for unknown message. */
+#define H5O_MDJ_CONF_ID 0x0017 /* Metadata journaling config message */
+#define H5O_UNKNOWN_ID 0x0018 /* Placeholder message ID for unknown message. */
/* (this should never exist in a file) */
@@ -491,6 +494,60 @@ typedef struct H5O_ainfo_t {
*/
typedef uint32_t H5O_refcount_t; /* Contains # of links to object, if >1 */
+
+/*
+ * Metadata journaling configuration message
+ *
+ * Information on whether and how metadata changes are being journaled,
+ * so as to reconstruct consistent metadata in the file in the event of
+ * a crash, stored in a superblock extension
+ * (Data structure in memory)
+ *
+ * The fields of the H5O_mdj_conf_t structure are discussed individually
+ * below:
+ *
+ * journaling_enabled: Boolean flag indicating whether metadata journaling
+ * is currently enabled.
+ *
+ * journal_is_external: Boolean flag indicating whether the journal is
+ * stored in an external file, or within the HDF5 file.
+ *
+ * If the field is TRUE, external_journal_file_path points to a
+ * buffer containing the path to the external journal file, and
+ * internal_journal_loc is undefined.
+ *
+ * If the field is FALSE, internal_journal_loc contains the base
+ * address of the journal within the hdf5 file, and
+ * external_journal_file_path_ptr must be NULL.
+ *
+ * At least for the initial implementation, journal_is_external
+ * will always be TRUE.
+ *
+ * internal_journal_loc: haddr_t containing the base address of the
+ * interal journal -- if there is one, or undefined if there
+ * isn't (see discussion of journal_is_external above).
+ *
+ * path_len: size_t containing the size of the buffer needed to
+ * contain the path to the external journal file. This field
+ * must contain 0 if the journal is internal.
+ *
+ * external_journal_file_path_ptr: Pointer to uint8_t. If the
+ * journal is stored in an external file, this field points to
+ * a buffer containing the path to this file.
+ *
+ * If the journal is internal, this field must be NULL.
+ */
+typedef struct H5O_mdj_conf_t {
+
+ hbool_t journaling_enabled;
+ hbool_t journal_is_external;
+ haddr_t internal_journal_loc;
+ size_t path_len;
+ uint8_t * external_journal_file_path_ptr;
+
+} H5O_mdj_conf_t;
+
+
/*
* "Unknown" Message.
* (Data structure in memory)
diff --git a/src/Makefile.am b/src/Makefile.am
index 7319c1c..19fde87 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -45,7 +45,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
H5AC.c H5AC2.c H5B.c H5Bcache.c \
H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
- H5C.c H5C2.c H5CS.c \
+ H5C.c H5C2.c H5C2journal.c H5CS.c \
H5D.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \
H5Dio.c \
diff --git a/src/Makefile.in b/src/Makefile.in
index 61bcbd8..a65324e 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -82,43 +82,44 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
H5timer.lo H5trace.lo H5A.lo H5Abtree2.lo H5Adense.lo \
H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5AC2.lo H5B.lo \
H5Bcache.lo H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2int.lo \
- H5B2stat.lo H5B2test.lo H5C.lo H5C2.lo H5CS.lo H5D.lo \
- H5Dcompact.lo H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo H5Defl.lo \
- H5Dfill.lo H5Dint.lo H5Dio.lo H5Distore.lo H5Dmpio.lo H5Doh.lo \
- H5Dselect.lo H5Dtest.lo H5E.lo H5Edeprec.lo H5Eint.lo H5F.lo \
- H5Fdbg.lo H5Ffake.lo H5Fmount.lo H5Fsfile.lo H5Fsuper.lo \
- H5Ftest.lo H5FD.lo H5FDcore.lo H5FDdirect.lo H5FDfamily.lo \
- H5FDlog.lo H5FDmpi.lo H5FDmpio.lo H5FDmpiposix.lo H5FDmulti.lo \
- H5FDsec2.lo H5FDstdio.lo H5FL.lo H5FO.lo H5FS.lo H5FScache.lo \
- H5FSdbg.lo H5FSsection.lo H5G.lo H5Gbtree2.lo H5Gcompact.lo \
- H5Gdense.lo H5Gdeprec.lo H5Gent.lo H5Gint.lo H5Glink.lo \
- H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo H5Goh.lo H5Gstab.lo \
- H5Gtest.lo H5Gtraverse.lo H5HF.lo H5HFbtree2.lo H5HFcache.lo \
- H5HFdbg.lo H5HFdblock.lo H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo \
- H5HFiblock.lo H5HFiter.lo H5HFman.lo H5HFsection.lo \
- H5HFspace.lo H5HFstat.lo H5HFtest.lo H5HFtiny.lo H5HG.lo \
- H5HGdbg.lo H5HL.lo H5HLdbg.lo H5HP.lo H5I.lo H5L.lo \
- H5Lexternal.lo H5MF.lo H5MM.lo H5MP.lo H5MPtest.lo H5O.lo \
- H5Oainfo.lo H5Oalloc.lo H5Oattr.lo H5Oattribute.lo H5Obogus.lo \
- H5Obtreek.lo H5Ocache.lo H5Ocont.lo H5Ocopy.lo H5Odbg.lo \
- H5Odrvinfo.lo H5Odtype.lo H5Oefl.lo H5Ofill.lo H5Oginfo.lo \
- H5Olayout.lo H5Olinfo.lo H5Olink.lo H5Omessage.lo H5Omtime.lo \
- H5Oname.lo H5Onull.lo H5Opline.lo H5Orefcount.lo H5Osdspace.lo \
- H5Oshared.lo H5Ostab.lo H5Oshmesg.lo H5Otest.lo H5Ounknown.lo \
- H5P.lo H5Pacpl.lo H5Pdcpl.lo H5Pdeprec.lo H5Pdxpl.lo \
- H5Pfapl.lo H5Pfcpl.lo H5Pfmpl.lo H5Pgcpl.lo H5Pint.lo \
- H5Plapl.lo H5Plcpl.lo H5Pocpl.lo H5Pocpypl.lo H5Pstrcpl.lo \
- H5Ptest.lo H5R.lo H5Rdeprec.lo H5RC.lo H5RS.lo H5S.lo \
- H5Sall.lo H5Sdbg.lo H5Shyper.lo H5Smpio.lo H5Snone.lo \
- H5Spoint.lo H5Sselect.lo H5Stest.lo H5SL.lo H5SM.lo \
- H5SMbtree2.lo H5SMcache.lo H5SMtest.lo H5ST.lo H5T.lo \
- H5Tarray.lo H5Tbit.lo H5Tcommit.lo H5Tcompound.lo H5Tconv.lo \
- H5Tcset.lo H5Tdbg.lo H5Tdeprec.lo H5Tenum.lo H5Tfields.lo \
- H5Tfixed.lo H5Tfloat.lo H5Tinit.lo H5Tnative.lo H5Toffset.lo \
- H5Toh.lo H5Topaque.lo H5Torder.lo H5Tpad.lo H5Tprecis.lo \
- H5Tstrpad.lo H5Tvisit.lo H5Tvlen.lo H5TS.lo H5V.lo H5WB.lo \
- H5Z.lo H5Zdeflate.lo H5Zfletcher32.lo H5Znbit.lo H5Zshuffle.lo \
- H5Zszip.lo H5Zscaleoffset.lo H5Ztrans.lo
+ H5B2stat.lo H5B2test.lo H5C.lo H5C2.lo H5C2journal.lo H5CS.lo \
+ H5D.lo H5Dcompact.lo H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo \
+ H5Defl.lo H5Dfill.lo H5Dint.lo H5Dio.lo H5Distore.lo \
+ H5Dmpio.lo H5Doh.lo H5Dselect.lo H5Dtest.lo H5E.lo \
+ H5Edeprec.lo H5Eint.lo H5F.lo H5Fdbg.lo H5Ffake.lo H5Fmount.lo \
+ H5Fsfile.lo H5Fsuper.lo H5Ftest.lo H5FD.lo H5FDcore.lo \
+ H5FDdirect.lo H5FDfamily.lo H5FDlog.lo H5FDmpi.lo H5FDmpio.lo \
+ H5FDmpiposix.lo H5FDmulti.lo H5FDsec2.lo H5FDstdio.lo H5FL.lo \
+ H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo H5FSsection.lo H5G.lo \
+ H5Gbtree2.lo H5Gcompact.lo H5Gdense.lo H5Gdeprec.lo H5Gent.lo \
+ H5Gint.lo H5Glink.lo H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo \
+ H5Goh.lo H5Gstab.lo H5Gtest.lo H5Gtraverse.lo H5HF.lo \
+ H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo H5HFdblock.lo \
+ H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo H5HFiblock.lo H5HFiter.lo \
+ H5HFman.lo H5HFsection.lo H5HFspace.lo H5HFstat.lo H5HFtest.lo \
+ H5HFtiny.lo H5HG.lo H5HGdbg.lo H5HL.lo H5HLdbg.lo H5HP.lo \
+ H5I.lo H5L.lo H5Lexternal.lo H5MF.lo H5MM.lo H5MP.lo \
+ H5MPtest.lo H5O.lo H5Oainfo.lo H5Oalloc.lo H5Oattr.lo \
+ H5Oattribute.lo H5Obogus.lo H5Obtreek.lo H5Ocache.lo \
+ H5Ocont.lo H5Ocopy.lo H5Odbg.lo H5Odrvinfo.lo H5Odtype.lo \
+ H5Oefl.lo H5Ofill.lo H5Oginfo.lo H5Olayout.lo H5Olinfo.lo \
+ H5Olink.lo H5Omessage.lo H5Omtime.lo H5Oname.lo H5Onull.lo \
+ H5Opline.lo H5Orefcount.lo H5Osdspace.lo H5Oshared.lo \
+ H5Ostab.lo H5Oshmesg.lo H5Otest.lo H5Ounknown.lo H5P.lo \
+ H5Pacpl.lo H5Pdcpl.lo H5Pdeprec.lo H5Pdxpl.lo H5Pfapl.lo \
+ H5Pfcpl.lo H5Pfmpl.lo H5Pgcpl.lo H5Pint.lo H5Plapl.lo \
+ H5Plcpl.lo H5Pocpl.lo H5Pocpypl.lo H5Pstrcpl.lo H5Ptest.lo \
+ H5R.lo H5Rdeprec.lo H5RC.lo H5RS.lo H5S.lo H5Sall.lo H5Sdbg.lo \
+ H5Shyper.lo H5Smpio.lo H5Snone.lo H5Spoint.lo H5Sselect.lo \
+ H5Stest.lo H5SL.lo H5SM.lo H5SMbtree2.lo H5SMcache.lo \
+ H5SMtest.lo H5ST.lo H5T.lo H5Tarray.lo H5Tbit.lo H5Tcommit.lo \
+ H5Tcompound.lo H5Tconv.lo H5Tcset.lo H5Tdbg.lo H5Tdeprec.lo \
+ H5Tenum.lo H5Tfields.lo H5Tfixed.lo H5Tfloat.lo H5Tinit.lo \
+ H5Tnative.lo H5Toffset.lo H5Toh.lo H5Topaque.lo H5Torder.lo \
+ H5Tpad.lo H5Tprecis.lo H5Tstrpad.lo H5Tvisit.lo H5Tvlen.lo \
+ H5TS.lo H5V.lo H5WB.lo H5Z.lo H5Zdeflate.lo H5Zfletcher32.lo \
+ H5Znbit.lo H5Zshuffle.lo H5Zszip.lo H5Zscaleoffset.lo \
+ H5Ztrans.lo
libhdf5_la_OBJECTS = $(am_libhdf5_la_OBJECTS)
libhdf5_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -402,7 +403,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
H5AC.c H5AC2.c H5B.c H5Bcache.c \
H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \
- H5C.c H5C2.c H5CS.c \
+ H5C.c H5C2.c H5C2journal.c H5CS.c \
H5D.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \
H5Dio.c \
@@ -601,6 +602,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Bcache.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C2journal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5CS.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5D.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Dcompact.Plo@am__quote@
diff --git a/test/cache.c b/test/cache.c
index a0bc5b1..6ea92ef 100644
--- a/test/cache.c
+++ b/test/cache.c
@@ -965,6 +965,11 @@ smoke_check_5(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -1200,6 +1205,11 @@ smoke_check_6(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -1435,6 +1445,11 @@ smoke_check_7(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (8 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */
H5C_decr__age_out_with_threshold,
@@ -1671,6 +1686,11 @@ smoke_check_8(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */
H5C_decr__age_out_with_threshold,
@@ -17295,6 +17315,10 @@ check_check_evictions_enabled_err(void)
*
* Modifications:
*
+ * John Mainzer 1/8/08
+ * Added a basic set of tests for the flash cache size
+ * increment code.
+ *
*-------------------------------------------------------------------------
*/
@@ -17304,7 +17328,7 @@ enum H5C_resize_status rpt_status;
static void test_rpt_fcn(UNUSED H5C_t * cache_ptr,
UNUSED int32_t version,
UNUSED double hit_rate,
- UNUSED enum H5C_resize_status status,
+ enum H5C_resize_status status,
UNUSED size_t old_max_cache_size,
UNUSED size_t new_max_cache_size,
UNUSED size_t old_min_clean_size,
@@ -17348,6 +17372,11 @@ check_auto_cache_resize(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -17708,7 +17737,7 @@ check_auto_cache_resize(void)
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
- /* the current cache configuration is unconvenient for testing cache
+ /* the current cache configuration is inconvenient for testing cache
* size reduction, so lets change it some something easier to work
* with.
*/
@@ -17738,6 +17767,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1000 * 1000);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -18088,6 +18121,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -18276,6 +18313,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -18699,6 +18740,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -19239,6 +19284,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -19663,6 +19712,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -19929,6 +19982,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -20465,6 +20522,1110 @@ check_auto_cache_resize(void)
takedown_cache(cache_ptr, FALSE, FALSE);
}
+ /* now test the flash cache size increment code. At least at present,
+ * there should be no interaction between the regular auto-resize
+ * code and the flash cache size increment code other than a reset
+ * of the counter and stats collection used by the regular auto-resize
+ * code. Thus we do only limited tests of the two pieces of code
+ * operating together.
+ *
+ * Start with simple test to verify that the flash cache increment
+ * code increases the cache size when and as expected.
+ */
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* allocate a cache, enable the flash cache size increase code, and
+ * then force the flash size increase code through all its operational
+ * modes. Verify that all performs as expected.
+ */
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* now repeat the above tests using the add space flash cache size
+ * increment algorithm.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 64 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 1024 * 1024;
+ auto_size_ctl.min_size = 5 * 1024;
+
+ auto_size_ctl.epoch_length = 100;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (32 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__add_space;
+ auto_size_ctl.flash_multiple = 1.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1000 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (0).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a huge entry into the cache */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (1).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now load a monster entry. Since a monster entry is larger than
+ * half the size of the cache, and there is not sufficient space
+ * for a monster entry in the cache, we will add space to the
+ * cache to make room for the entry.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (40 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (HUGE_ENTRY_SIZE +
+ MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (2).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a second moster entry. Since the monster entry is larger
+ * than half the size of the cache yet again, and there is not
+ * sufficient space for the monster entry in the cache, we again
+ * add space to the cache to make space for the entry.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1);
+
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) +
+ HUGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (3).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a third moster entry. Should be no cache size increase this
+ * time.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2);
+
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (4).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* delete existing entries to prepare for next test, and reset
+ * the size of the cache.
+ */
+ if ( pass ) {
+
+ expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1);
+ expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2);
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
+ }
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (5).\n";
+ }
+ }
+
+ /* repeat the above basic test, only this time, use inserts to add
+ * entries to the cache, not protects.
+ */
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* insert a huge entry into the cache */
+ if ( pass ) {
+
+ insert_entry(cache_ptr, HUGE_ENTRY_TYPE, 1, TRUE,
+ H5C__NO_FLAGS_SET);
+ /* protect and unprotect a couple times to increment cache_accesses */
+ protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1);
+ unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+ protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1);
+ unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (6).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now insert a monster entry. Since a monster entry is larger than
+ * half the size of the cache, and there is not sufficient space
+ * for a monster entry in the cache, we will add space to the
+ * cache to make room for the entry.
+ */
+ if ( pass ) {
+
+ insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 4, TRUE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (40 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (7).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Insert a second monster entry. Cache size should increase again.
+ */
+ if ( pass ) {
+
+ insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size !=
+ 2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (8).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Insert a third monster entry. Should be no cache size increase this
+ * time.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6);
+
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (9).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* delete existing entries to prepare for next test, and reset
+ * the size of the cache. We must also change the size of the needed
+ * variable entries before we run the test, so will protect and
+ * unprotect them now so as to get the correct initial size.
+ */
+ if ( pass ) {
+
+ expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5);
+ expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 13,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024);
+
+ flush_cache(cache_ptr, TRUE, FALSE, FALSE);
+
+
+ if ( pass ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
+ }
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (10).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now load the variable entries into the cache */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (11).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a variable entry, and re-size it to 3K. Should be
+ * no effect on the size of the cache.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 3 * 1024);
+
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 6 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 5 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (12).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect the variable entry again, and re-size it to 10K. Should
+ * resize the cache to 13 KB. Note that cache_accesses will be 0
+ * in this case, since cache_accesses is incremented on the protect.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (13).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a second variable entry, and re-size it to 10K. Should
+ * resize to 22 KB.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (14).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a third variable entry, and re-size it to 10K. Should
+ * be no change in cache size.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (15).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* re-size the variable entries back down to their initial size, and
+ * restore the cache to its initial size as well, in preparation
+ * for the next test.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+
+ if ( pass ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n";
+ }
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (16).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now test flash cache resizes with pinned entries...
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 5 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (17).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (18).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (19).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (20).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Unpin the entries. Note that no entries are evicted as we don't
+ * load any entries.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (21).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* re-size the variable entries back down to their initial size, and
+ * restore the cache to its initial size as well, in preparation
+ * for the next test.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024);
+
+ if ( pass ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
+ }
+ }
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (22).\n";
+ }
+ }
+
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 5 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (23).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (24).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (25).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C__PIN_ENTRY_FLAG);
+ resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (26).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Unpin the entries. Note that no entries are evicted as we don't
+ * load any entries.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C__UNPIN_ENTRY_FLAG);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (27).\n";
+ }
+ }
+
+ /* We have finished a basic check of the flash cache size increment
+ * code. Tidy up for a more extensive test...
+ */
+ if ( pass ) {
+
+ expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (28).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* ...and then reconfigure. Note that we change the flash_multiple
+ * and flash_threshold just to make sure that such changed perform
+ * as expected.
+ */
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 20 * 1024;
+ auto_size_ctl.min_size = 4 * 1024;
+
+ auto_size_ctl.epoch_length = 100;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__add_space;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.4;
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (2 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 512) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache after initialization 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect a large entry -- no change in cache size since
+ * a large entry will just fill the available space in the cache.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 512) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called == TRUE ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (29).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect another a large entry -- should trigger a
+ * flash cache size increase to 12 KB (remember that flash_multiple is
+ * set to 2.0).
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (12 * 512) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called != TRUE ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (30).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect two more large entries -- shouldnt trigger a
+ * flash cache size increase.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (12 * 512) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 3 ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (31).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* do many accesses of a single entry to talk the cache into reducing
+ * its size to the minimum.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, TINY_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, TINY_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (32).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Force another flash increase */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE,
+ H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called == FALSE ) ||
+ ( rpt_status != flash_increase ) ) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (33).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force regular size increase up to maximum */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 500 ) )
+ {
+ protect_entry(cache_ptr, TINY_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, TINY_ENTRY_TYPE, i,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+ }
+ i++;
+ }
+
+ if ( ( cache_ptr->max_cache_size != (20 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (10 * 1024) ) ||
+ ( rpt_fcn_called == FALSE ) ||
+ ( rpt_status != at_max_size ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache config (34).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
if ( pass ) { PASSED(); } else { H5_FAILED(); }
@@ -20493,6 +21654,10 @@ check_auto_cache_resize(void)
*
* Modifications:
*
+ * Added code to include the flash cache size increment
+ * code in this test.
+ * JRM -- 1/10/08
+ *
*-------------------------------------------------------------------------
*/
@@ -20530,6 +21695,11 @@ check_auto_cache_resize_disable(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 1.0,
+ /* double flash_threshold = */ 0.25,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -20621,6 +21791,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -20778,6 +21952,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -20935,6 +22113,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -21091,6 +22273,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -21247,6 +22433,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -21402,6 +22592,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__off;
@@ -21559,6 +22753,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -21783,6 +22981,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -22014,6 +23216,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -22249,6 +23455,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -22374,6 +23584,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -22499,6 +23713,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -22624,6 +23842,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -22749,6 +23971,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -22875,6 +24101,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__off;
@@ -22976,6 +24206,175 @@ check_auto_cache_resize_disable(void)
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+ /* Now test the flash cache size increment code to verify that it
+ * is disabled when it should be.
+ *
+ * Since the flash size increase code doesn't look at hit rate, or
+ * use epochs (other than to start a new epoch if a flash cache size
+ * increase is triggered), we go about these tests somewhat differently
+ * than the rest of the tests in this function.
+ *
+ * As of this writing, there is only one flash cache size increment
+ * mode (add space), which is triggered whenever the size of a newly
+ * loaded or inserted entry, or the delta between old and new entry
+ * sizes exceeds some fraction of the current maximum cache size, and
+ * the cache doesn't have enough free space to accomodate the new/
+ * resize entry without performing evictions. The range of permissible
+ * values for the flash_threshold (0.1 to 1.0 as of this writing), and
+ * for the flash_multiple (0.1 to 10.0) do not permit the facility to
+ * be turned off by configuration. Thus, flash cache size increases
+ * can be disabled only via the flash_incr_mode, and by setting the
+ * current max_cache_size equal to max_size.
+ *
+ * We have already tested the latter in check_auto_cache_resize(), so
+ * we need only thest the former here. Do this by disabling flash
+ * cache size increments via the flash_incr_mode, and then creating
+ * situations that would trigger flash cache size increases were that
+ * code enabled.
+ */
+
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 64 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 256 * 1024;
+ auto_size_ctl.min_size = 32 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 1.0;
+ auto_size_ctl.flash_threshold = 0.25;
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 17.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 16.\n";
+ }
+ }
+
+ /* We have reduced the max cache size to well below the current index
+ * size. Protect and unprotect an entry to allow the cache to evict
+ * entries and get within bounds
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
+ (long)(cache_ptr->max_cache_size));
+ HDfprintf(stdout, "min_clean_size = %ld.\n",
+ (long)(cache_ptr->min_clean_size));
+ HDfprintf(stdout, "index_len = %ld.\n",
+ (long)(cache_ptr->index_len));
+ HDfprintf(stdout, "index_size = %ld.\n",
+ (long)(cache_ptr->index_size));
+ HDfprintf(stdout, "rpt_fcn_called = %ld.\n",
+ (long)(rpt_fcn_called));
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 46.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now protect and unprotect a monster entry. If the flash cache
+ * size increment code was active, this would trigger an increase.
+ * Verify that it doesn't.
+ *
+ * This finishes the additional tests needed for the flash cache
+ * size increase code.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C__NO_FLAGS_SET);
+
+ if ( ( pass ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != MONSTER_ENTRY_SIZE ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
+ (long)(cache_ptr->max_cache_size));
+ HDfprintf(stdout, "min_clean_size = %ld.\n",
+ (long)(cache_ptr->min_clean_size));
+ HDfprintf(stdout, "index_len = %ld.\n",
+ (long)(cache_ptr->index_len));
+ HDfprintf(stdout, "index_size = %ld.\n",
+ (long)(cache_ptr->index_size));
+ HDfprintf(stdout, "rpt_fcn_called = %ld.\n",
+ (long)(rpt_fcn_called));
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 47.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
if ( pass ) {
takedown_cache(cache_ptr, FALSE, FALSE);
@@ -23047,6 +24446,11 @@ check_auto_cache_resize_epoch_markers(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -23129,6 +24533,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -23302,6 +24710,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -23420,6 +24832,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -23495,6 +24911,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -23605,6 +25025,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C_decr__off;
@@ -23692,6 +25116,11 @@ check_auto_cache_resize_epoch_markers(void)
*
* Modifications:
*
+ * Added code to verify that errors in the flash cache size
+ * increment related fields are caught as well.
+ *
+ * JRM -- 1/17/08
+ *
*-------------------------------------------------------------------------
*/
@@ -23711,8 +25140,14 @@ check_auto_cache_resize_epoch_markers(void)
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decrement == (b).decrement ) && \
( (a).apply_max_decrement == (b).apply_max_decrement ) && \
( (a).max_decrement == (b).max_decrement ) && \
@@ -23751,6 +25186,11 @@ check_auto_cache_resize_input_errs(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
@@ -23853,6 +25293,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -23925,6 +25369,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -23998,6 +25446,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24068,6 +25520,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24140,6 +25596,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24209,6 +25669,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24282,6 +25746,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24351,6 +25819,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24420,6 +25892,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24492,6 +25968,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24561,6 +26041,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24634,6 +26118,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24704,6 +26192,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24776,6 +26268,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24845,6 +26341,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24914,6 +26414,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -24986,6 +26490,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -25032,6 +26540,382 @@ check_auto_cache_resize_input_errs(void)
}
+ /* test for bad flash_incr_mode rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ (enum H5C_cache_flash_incr_mode) -1; /* INVALID */
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad flash_incr_mode.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 19.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 19.";
+ }
+ }
+
+ /* test for bad flash_multiple rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 0.09; /* INVALID */
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad flash_multiple(1).\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 20.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 20.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 10.01; /* INVALID */
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad flash_multiple(2).\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 21.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 21.";
+ }
+ }
+
+ /* test for bad flash_threshold rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 1.0;
+ invalid_auto_size_ctl.flash_threshold = 0.09; /* INVALID */
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad flash_threshold(1).\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 22.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 22.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 1.0;
+ invalid_auto_size_ctl.flash_threshold = 1.001; /* INVALID */
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad flash_threshold(2).\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 23.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 23.";
+ }
+ }
+
/* test for bad decr_mode rejection */
if ( pass ) {
@@ -25059,6 +26943,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode =
(enum H5C_cache_decr_mode) -1; /* INVALID */
@@ -25094,13 +26982,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 19.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 24.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 19.";
+ failure_mssg = "Unexpected auto resize config 24.";
}
}
@@ -25129,6 +27017,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode =
(enum H5C_cache_decr_mode) 4; /* INVALID */
@@ -25164,13 +27056,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 20.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 25.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 20.";
+ failure_mssg = "Unexpected auto resize config 25.";
}
}
@@ -25202,6 +27094,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -25236,13 +27132,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 21.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 26.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 21.";
+ failure_mssg = "Unexpected auto resize config 26.";
}
}
@@ -25271,6 +27167,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
@@ -25305,13 +27205,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 22.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 27.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 22.";
+ failure_mssg = "Unexpected auto resize config 27.";
}
}
@@ -25343,6 +27243,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -25376,13 +27280,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 23.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 28.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 23.";
+ failure_mssg = "Unexpected auto resize config 28.";
}
}
@@ -25411,6 +27315,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -25445,13 +27353,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 24.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 29.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 24.";
+ failure_mssg = "Unexpected auto resize config 29.";
}
}
@@ -25483,6 +27391,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__age_out;
@@ -25516,13 +27428,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 25.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 30.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 25.";
+ failure_mssg = "Unexpected auto resize config 30.";
}
}
@@ -25551,6 +27463,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
@@ -25585,13 +27501,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass = FALSE;
- failure_mssg = "H5C_get_cache_auto_resize_config failed 26.";
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 31.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass = FALSE;
- failure_mssg = "Unexpected auto resize config 26.";
+ failure_mssg = "Unexpected auto resize config 31.";
}
}
@@ -25716,6 +27632,11 @@ check_auto_cache_resize_aux_fcns(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
diff --git a/test/cache2.c b/test/cache2.c
index 118838b..32ca9b4 100644
--- a/test/cache2.c
+++ b/test/cache2.c
@@ -965,6 +965,11 @@ smoke_check_5(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -1200,6 +1205,11 @@ smoke_check_6(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -1435,6 +1445,11 @@ smoke_check_7(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (8 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */
H5C2_decr__age_out_with_threshold,
@@ -1671,6 +1686,11 @@ smoke_check_8(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */
H5C2_decr__age_out_with_threshold,
@@ -9343,7 +9363,7 @@ check_flush_cache__flush_op_test(H5C2_t * cache_ptr,
int check_size,
struct fo_flush_entry_check check[])
{
- const char * fcn_name = "check_flush_cache__flush_op_test";
+ /* const char * fcn_name = "check_flush_cache__flush_op_test"; */
static char msg[128];
herr_t result;
int i;
@@ -9836,7 +9856,7 @@ check_flush_cache__flush_op_test(H5C2_t * cache_ptr,
static void
check_flush_cache__flush_op_eviction_test(H5C2_t * cache_ptr)
{
- const char * fcn_name = "check_flush_cache__flush_op_eviction_test";
+ /* const char * fcn_name = "check_flush_cache__flush_op_eviction_test"; */
int i;
int num_variable_entries = 10;
int num_monster_entries = 31;
@@ -16856,7 +16876,7 @@ check_pin_entry_errs(void)
*
* Modifications:
*
- * - Modified call to H5C2_protect() to pass H5C2__NO_FLAGS_SET in the
+ * - Modified call to H5C2_protect() to pass2 H5C2__NO_FLAGS_SET in the
* the new flags parameter.
*
* JRM -- 3/28/07
@@ -17747,6 +17767,10 @@ check_check_evictions_enabled_err(void)
*
* Modifications:
*
+ * John Mainzer 1/8/08
+ * Added a basic set of tests for the flash cache size
+ * increment code.
+ *
*-------------------------------------------------------------------------
*/
@@ -17756,7 +17780,7 @@ enum H5C2_resize_status rpt_status;
static void test_rpt_fcn(UNUSED H5C2_t * cache_ptr,
UNUSED int32_t version,
UNUSED double hit_rate,
- UNUSED enum H5C2_resize_status status,
+ enum H5C2_resize_status status,
UNUSED size_t old_max_cache_size,
UNUSED size_t new_max_cache_size,
UNUSED size_t old_min_clean_size,
@@ -17800,6 +17824,11 @@ check_auto_cache_resize(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -18160,7 +18189,7 @@ check_auto_cache_resize(void)
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
- /* the current cache configuration is unconvenient for testing cache
+ /* the current cache configuration is inconvenient for testing cache
* size reduction, so lets change it some something easier to work
* with.
*/
@@ -18190,6 +18219,9 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1000 * 1000);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -18540,6 +18572,9 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -18728,6 +18763,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -19000,7 +19039,7 @@ check_auto_cache_resize(void)
}
}
- if ( show_progress ) HDfprintf(stderr, "*check point %d\n", checkpoint++);
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
/* now just bang on one entry -- after three epochs, this should
* get all entries other than the one evicted, and the cache size
@@ -19151,6 +19190,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -19691,6 +19734,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -20115,6 +20162,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -20381,6 +20432,10 @@ check_auto_cache_resize(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -20912,6 +20967,1105 @@ check_auto_cache_resize(void)
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* now test the flash cache size increment code. At least at present,
+ * there should be no interaction between the regular auto-resize
+ * code and the flash cache size increment code other than a reset
+ * of the counter and stats collection used by the regular auto-resize
+ * code. Thus we do only limited tests of the two pieces of code
+ * operating together.
+ *
+ * Start with simple test to verify that the flash cache increment
+ * code increases the cache size when and as expected.
+ */
+
+ /* Place the cache in a know state via a flush destroy on the cache
+ * to clear out all entries, and then a reset on all the entries.
+ * Then configure the cache for the flash cache size increase tests,
+ * and force the flash size increase code through all its operational
+ * modes. Verify that all perform as expected.
+ */
+
+ if ( pass2 ) {
+
+ flush_cache2(cache_ptr, TRUE, FALSE, FALSE);
+
+ reset_entries2();
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 64 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 1024 * 1024;
+ auto_size_ctl.min_size = 5 * 1024;
+
+ auto_size_ctl.epoch_length = 100;
+
+
+ auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (32 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__add_space;
+ auto_size_ctl.flash_multiple = 1.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
+
+ auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1000 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (0).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a huge entry into the cache */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 0);
+
+ if ( pass2 ) {
+ unprotect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (1).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now load a monster entry. Since a monster entry is larger than
+ * half the size of the cache, and there is not sufficient space
+ * for a monster entry in the cache, we will add space to the
+ * cache to make room for the entry.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass2 ) {
+ unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (40 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (HUGE_ENTRY_SIZE +
+ MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (2).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a second monster entry. Since the monster entry is larger
+ * than half the size of the cache yet again, and there is not
+ * sufficient space for the monster entry in the cache, we again
+ * add space to the cache to make space for the entry.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 1);
+
+ unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) +
+ HUGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (3).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load a third moster entry. Should be no cache size increase this
+ * time.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2);
+
+ unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (4).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* delete existing entries to prepare for next test, and reset
+ * the size of the cache.
+ */
+ if ( pass2 ) {
+
+ expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 1);
+ expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2);
+
+ if ( pass2 ) {
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config failed 13.\n";
+ }
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (5).\n";
+ }
+ }
+
+ /* repeat the above basic test, only this time, use inserts to add
+ * entries to the cache, not protects.
+ */
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* insert a huge entry into the cache */
+ if ( pass2 ) {
+
+ insert_entry2(cache_ptr, HUGE_ENTRY_TYPE, 1, TRUE,
+ H5C2__NO_FLAGS_SET);
+ /* protect and unprotect a couple times to increment cache_accesses */
+ protect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 1);
+ unprotect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+ protect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 1);
+ unprotect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 1,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 2 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (6).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now insert a monster entry. Since a monster entry is larger than
+ * half the size of the cache, and there is not sufficient space
+ * for a monster entry in the cache, we will add space to the
+ * cache to make room for the entry.
+ */
+ if ( pass2 ) {
+
+ insert_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 4, TRUE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (40 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (7).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Insert a second monster entry. Cache size should increase again.
+ */
+ if ( pass2 ) {
+
+ insert_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size !=
+ 2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (8).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Insert a third monster entry. Should be no cache size increase this
+ * time.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6);
+
+ unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 72 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (9).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* delete existing entries to prepare for next test, and reset
+ * the size of the cache. We must also change the size of the needed
+ * variable entries before we run the test, so will protect and
+ * unprotect them now so as to get the correct initial size.
+ */
+ if ( pass2 ) {
+
+ expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 5);
+ expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 13,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024);
+
+ flush_cache2(cache_ptr, TRUE, FALSE, FALSE);
+
+
+ if ( pass2 ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config failed 13.\n";
+ }
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (10).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now load the variable entries into the cache */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (11).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a variable entry, and re-size it to 3K. Should be
+ * no effect on the size of the cache.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 3 * 1024);
+
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 6 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 5 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (12).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect the variable entry again, and re-size it to 10K. Should
+ * resize the cache to 13 KB. Note that cache_accesses will be 0
+ * in this case, since cache_accesses is incremented on the protect.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (13).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a second variable entry, and re-size it to 10K. Should
+ * resize to 22 KB.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (14).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect a third variable entry, and re-size it to 10K. Should
+ * be no change in cache size.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024);
+
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (15).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* re-size the variable entries back down to their initial size, and
+ * restore the cache to its initial size as well, in preparation
+ * for the next test.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+
+ if ( pass2 ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config failed 14.\n";
+ }
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (16).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now test flash cache resizes with pinned entries...
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 5 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (17).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ resize_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (18).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (19).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (20).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Unpin the entries. Note that no entries are evicted as we don't
+ * load any entries.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (21).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* re-size the variable entries back down to their initial size, and
+ * restore the cache to its initial size as well, in preparation
+ * for the next test.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 10,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 11,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry_with_size_change2(cache_ptr, VARIABLE_ENTRY_TYPE, 12,
+ H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024);
+
+ if ( pass2 ) {
+
+ auto_size_ctl.initial_size = 6 * 1024;
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config failed 15.\n";
+ }
+ }
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 4 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (22).\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_pinned_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 5 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (23).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ resize_pinned_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (13 * 512) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 13 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (24).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_pinned_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 22 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (25).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C2__PIN_ENTRY_FLAG);
+ resize_pinned_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 1 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (26).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Unpin the entries. Note that no entries are evicted as we don't
+ * load any entries.
+ */
+ if ( pass2 ) {
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE,
+ H5C2__UNPIN_ENTRY_FLAG);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 4 ) ||
+ ( cache_ptr->index_size != 31 * 1024 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (27).\n";
+ }
+ }
+
+ /* We have finished a basic check of the flash cache size increment
+ * code. Tidy up for a more extensive test...
+ */
+ if ( pass2 ) {
+
+ expunge_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10);
+ expunge_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 11);
+ expunge_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 12);
+ expunge_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (11 * 1024) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 4 ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (28).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* ...and then reconfigure. Note that we change the flash_multiple
+ * and flash_threshold just to make sure that such changed perform
+ * as expected.
+ */
+ if ( pass2 ) {
+
+ auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 20 * 1024;
+ auto_size_ctl.min_size = 4 * 1024;
+
+ auto_size_ctl.epoch_length = 100;
+
+
+ auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__add_space;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.4;
+
+
+ auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (2 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass2 ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 512) ) ||
+ ( cache_ptr->index_len != 0 ) ||
+ ( cache_ptr->index_size != 0 ) ||
+ ( cache_ptr->cache_accesses != 0 ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "bad cache after initialization 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect a large entry -- no change in cache size since
+ * a large entry will just fill the available space in the cache.
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 512) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called == TRUE ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (29).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect another a large entry -- should trigger a
+ * flash cache size increase to 12 KB (remember that flash_multiple is
+ * set to 2.0).
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 1);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (12 * 512) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called != TRUE ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (30).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* protect and unprotect two more large entries -- shouldnt trigger a
+ * flash cache size increase.
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 2);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 3);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (12 * 512) ) ||
+ ( cache_ptr->index_len != 3 ) ||
+ ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 3 ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (31).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* do many accesses of a single entry to talk the cache into reducing
+ * its size to the minimum.
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass2 ) && ( i < 1000 ) )
+ {
+ protect_entry2(cache_ptr, TINY_ENTRY_TYPE, 0);
+
+ if ( pass2 ) {
+ unprotect_entry2(cache_ptr, TINY_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (32).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Force another flash increase */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE,
+ H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE ) ||
+ ( cache_ptr->cache_accesses != 1 ) ||
+ ( rpt_fcn_called == FALSE ) ||
+ ( rpt_status != flash_increase ) ) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (33).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force regular size increase up to maximum */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass2 ) && ( i < 500 ) )
+ {
+ protect_entry2(cache_ptr, TINY_ENTRY_TYPE, i);
+
+ if ( pass2 ) {
+ unprotect_entry2(cache_ptr, TINY_ENTRY_TYPE, i,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+ }
+ i++;
+ }
+
+ if ( ( cache_ptr->max_cache_size != (20 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (10 * 1024) ) ||
+ ( rpt_fcn_called == FALSE ) ||
+ ( rpt_status != at_max_size ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache config (34).\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
if ( pass2 ) {
takedown_cache2(cache_ptr, FALSE, FALSE);
@@ -20945,6 +22099,10 @@ check_auto_cache_resize(void)
*
* Modifications:
*
+ * Added code to include the flash cache size increment
+ * code in this test.
+ * JRM -- 1/10/08
+ *
*-------------------------------------------------------------------------
*/
@@ -20982,6 +22140,11 @@ check_auto_cache_resize_disable(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -21073,6 +22236,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -21230,11 +22397,14 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
auto_size_ctl.upper_hr_threshold = 0.995;
-
auto_size_ctl.decrement = 0.5;
auto_size_ctl.apply_max_decrement = FALSE;
@@ -21387,6 +22557,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = FALSE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -21543,6 +22717,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -21699,6 +22877,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -21854,6 +23036,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__off;
@@ -22011,6 +23197,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -22235,6 +23425,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -22466,6 +23660,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -22701,6 +23899,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -22826,6 +24028,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -22951,6 +24157,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -23076,6 +24286,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -23201,6 +24415,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -23327,6 +24545,10 @@ check_auto_cache_resize_disable(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__off;
@@ -23428,6 +24650,175 @@ check_auto_cache_resize_disable(void)
if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now test the flash cache size increment code to verify that it
+ * is disabled when it should be.
+ *
+ * Since the flash size increase code doesn't look at hit rate, or
+ * use epochs (other than to start a new epoch if a flash cache size
+ * increase is triggered), we go about these tests somewhat differently
+ * than the rest of the tests in this function.
+ *
+ * As of this writing, there is only one flash cache size increment
+ * mode (add space), which is triggered whenever the size of a newly
+ * loaded or inserted entry, or the delta between old and new entry
+ * sizes exceeds some fraction of the current maximum cache size, and
+ * the cache doesn't have enough free space to accomodate the new/
+ * resize entry without performing evictions. The range of permissible
+ * values for the flash_threshold (0.1 to 1.0 as of this writing), and
+ * for the flash_multiple (0.1 to 10.0) do not permit the facility to
+ * be turned off by configuration. Thus, flash cache size increases
+ * can be disabled only via the flash_incr_mode, and by setting the
+ * current max_cache_size equal to max_size.
+ *
+ * We have already tested the latter in check_auto_cache_resize(), so
+ * we need only thest the former here. Do this by disabling flash
+ * cache size increments via the flash_incr_mode, and then creating
+ * situations that would trigger flash cache size increases were that
+ * code enabled.
+ */
+
+ if ( pass2 ) {
+
+ auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 64 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 256 * 1024;
+ auto_size_ctl.min_size = 32 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024);
+
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 1.0;
+ auto_size_ctl.flash_threshold = 0.25;
+
+
+ auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 17.\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ if ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "bad cache size after set resize re-config 16.\n";
+ }
+ }
+
+ /* We have reduced the max cache size to well below the current index
+ * size. Protect and unprotect an entry to allow the cache to evict
+ * entries and get within bounds
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0);
+ unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
+ (long)(cache_ptr->max_cache_size));
+ HDfprintf(stdout, "min_clean_size = %ld.\n",
+ (long)(cache_ptr->min_clean_size));
+ HDfprintf(stdout, "index_len = %ld.\n",
+ (long)(cache_ptr->index_len));
+ HDfprintf(stdout, "index_size = %ld.\n",
+ (long)(cache_ptr->index_size));
+ HDfprintf(stdout, "rpt_fcn_called = %ld.\n",
+ (long)(rpt_fcn_called));
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache size change results 46.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now protect and unprotect a monster entry. If the flash cache
+ * size increment code was active, this would trigger an increase.
+ * Verify that it doesn't.
+ *
+ * This finishes the additional tests needed for the flash cache
+ * size increase code.
+ */
+ if ( pass2 ) {
+
+ rpt_fcn_called = FALSE;
+
+ protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+ unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, H5C2__NO_FLAGS_SET);
+
+ if ( ( pass2 ) &&
+ ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (32 * 1024) ) ||
+ ( cache_ptr->index_len != 1 ) ||
+ ( cache_ptr->index_size != MONSTER_ENTRY_SIZE ) ||
+ ( rpt_fcn_called != FALSE ) ) ) ) {
+
+ HDfprintf(stdout, "\nmax_cache_size = %ld.\n",
+ (long)(cache_ptr->max_cache_size));
+ HDfprintf(stdout, "min_clean_size = %ld.\n",
+ (long)(cache_ptr->min_clean_size));
+ HDfprintf(stdout, "index_len = %ld.\n",
+ (long)(cache_ptr->index_len));
+ HDfprintf(stdout, "index_size = %ld.\n",
+ (long)(cache_ptr->index_size));
+ HDfprintf(stdout, "rpt_fcn_called = %ld.\n",
+ (long)(rpt_fcn_called));
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected cache size change results 47.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
if ( pass2 ) {
takedown_cache2(cache_ptr, FALSE, FALSE);
@@ -23499,6 +24890,11 @@ check_auto_cache_resize_epoch_markers(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -23581,6 +24977,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -23754,6 +25154,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -23872,6 +25276,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -23947,6 +25355,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -24057,6 +25469,10 @@ check_auto_cache_resize_epoch_markers(void)
auto_size_ctl.apply_max_increment = TRUE;
auto_size_ctl.max_increment = (4 * 1024 * 1024);
+ auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ auto_size_ctl.flash_multiple = 2.0;
+ auto_size_ctl.flash_threshold = 0.5;
+
auto_size_ctl.decr_mode = H5C2_decr__off;
@@ -24144,6 +25560,11 @@ check_auto_cache_resize_epoch_markers(void)
*
* Modifications:
*
+ * Added code to verify that errors in the flash cache size
+ * increment related fields are caught as well.
+ *
+ * JRM -- 1/17/08
+ *
*-------------------------------------------------------------------------
*/
@@ -24163,6 +25584,9 @@ check_auto_cache_resize_epoch_markers(void)
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
( (a).decrement == (b).decrement ) && \
@@ -24203,6 +25627,11 @@ check_auto_cache_resize_input_errs(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
@@ -24305,6 +25734,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24377,6 +25810,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24450,6 +25887,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24520,6 +25961,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24592,6 +26037,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24661,6 +26110,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24734,6 +26187,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24803,6 +26260,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24872,6 +26333,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -24944,6 +26409,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25013,6 +26482,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25086,6 +26559,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25156,6 +26633,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25228,6 +26709,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25297,6 +26782,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25366,6 +26855,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25438,6 +26931,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25483,6 +26980,382 @@ check_auto_cache_resize_input_errs(void)
}
}
+ /* test for bad flash_incr_mode rejection */
+
+ if ( pass2 ) {
+
+ invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ (enum H5C2_cache_flash_incr_mode) -1; /* INVALID */
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config accepted bad flash_incr_mode.\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ result = H5C2_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 19.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected auto resize config 19.";
+ }
+ }
+
+ /* test for bad flash_multiple rejection */
+
+ if ( pass2 ) {
+
+ invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C2_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 0.09; /* INVALID */
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(1).\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ result = H5C2_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 20.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected auto resize config 20.";
+ }
+ }
+
+ if ( pass2 ) {
+
+ invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C2_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 10.01; /* INVALID */
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
+
+ invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(2).\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ result = H5C2_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 21.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected auto resize config 21.";
+ }
+ }
+
+ /* test for bad flash_threshold rejection */
+
+ if ( pass2 ) {
+
+ invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C2_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 1.0;
+ invalid_auto_size_ctl.flash_threshold = 0.09; /* INVALID */
+
+
+ invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(1).\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ result = H5C2_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 22.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected auto resize config 22.";
+ }
+ }
+
+ if ( pass2 ) {
+
+ invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+ invalid_auto_size_ctl.flash_incr_mode =
+ H5C2_flash_incr__add_space;
+ invalid_auto_size_ctl.flash_multiple = 1.0;
+ invalid_auto_size_ctl.flash_threshold = 1.001; /* INVALID */
+
+
+ invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C2_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass2 = FALSE;
+ failure_mssg2 =
+ "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(2).\n";
+ }
+ }
+
+ if ( pass2 ) {
+
+ result = H5C2_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 23.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "Unexpected auto resize config 23.";
+ }
+ }
+
/* test for bad decr_mode rejection */
@@ -25511,6 +27384,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode =
(enum H5C2_cache_decr_mode) -1; /* INVALID */
@@ -25546,13 +27423,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 19.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 24.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 19.";
+ failure_mssg2 = "Unexpected auto resize config 24.";
}
}
@@ -25581,6 +27458,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode =
(enum H5C2_cache_decr_mode) 4; /* INVALID */
@@ -25616,13 +27497,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 20.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 25.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 20.";
+ failure_mssg2 = "Unexpected auto resize config 25.";
}
}
@@ -25654,6 +27535,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25688,13 +27573,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 21.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 26.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 21.";
+ failure_mssg2 = "Unexpected auto resize config 26.";
}
}
@@ -25723,6 +27608,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold;
@@ -25757,13 +27646,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 22.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 27.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 22.";
+ failure_mssg2 = "Unexpected auto resize config 27.";
}
}
@@ -25795,6 +27684,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -25828,13 +27721,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 23.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 28.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 23.";
+ failure_mssg2 = "Unexpected auto resize config 28.";
}
}
@@ -25863,6 +27756,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -25897,13 +27794,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 24.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 29.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 24.";
+ failure_mssg2 = "Unexpected auto resize config 29.";
}
}
@@ -25935,6 +27832,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out;
@@ -25968,13 +27869,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 25.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 30.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 25.";
+ failure_mssg2 = "Unexpected auto resize config 30.";
}
}
@@ -26003,6 +27904,10 @@ check_auto_cache_resize_input_errs(void)
invalid_auto_size_ctl.apply_max_increment = TRUE;
invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+ invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off;
+ invalid_auto_size_ctl.flash_multiple = 2.0;
+ invalid_auto_size_ctl.flash_threshold = 0.5;
+
invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold;
@@ -26037,13 +27942,13 @@ check_auto_cache_resize_input_errs(void)
if ( result != SUCCEED ) {
pass2 = FALSE;
- failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 26.";
+ failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 31.";
} else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
ref_auto_size_ctl, FALSE) ) {
pass2 = FALSE;
- failure_mssg2 = "Unexpected auto resize config 26.";
+ failure_mssg2 = "Unexpected auto resize config 31.";
}
}
@@ -26168,7 +28073,12 @@ check_auto_cache_resize_aux_fcns(void)
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
/* double upper_hr_threshold = */ 0.995,
@@ -26714,7 +28624,7 @@ main(void)
run_full_test2 = FALSE;
#endif /* NDEBUG */
-#if 0
+#if 1
run_full_test2 = TRUE;
#endif
diff --git a/test/cache2_api.c b/test/cache2_api.c
index 31a836a..0e78e25 100644
--- a/test/cache2_api.c
+++ b/test/cache2_api.c
@@ -52,6 +52,9 @@ const char *FILENAMES[] = {
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
( (a).decrement == (b).decrement ) && \
@@ -145,6 +148,9 @@ static void check_file_mdc_api_errs(void);
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
( (a).decrement == (b).decrement ) && \
@@ -172,6 +178,9 @@ static void check_file_mdc_api_errs(void);
(i).increment = (e).increment; \
(i).apply_max_increment = (e).apply_max_increment; \
(i).max_increment = (e).max_increment; \
+ (i).flash_incr_mode = (e).flash_incr_mode; \
+ (i).flash_multiple = (e).flash_multiple; \
+ (i).flash_threshold = (e).flash_threshold; \
(i).decr_mode = (e).decr_mode; \
(i).upper_hr_threshold = (e).upper_hr_threshold; \
(i).decrement = (e).decrement; \
@@ -198,31 +207,35 @@ check_fapl_mdc_api_calls(void)
{
/* int version = */
H5AC2__CURR_CACHE_CONFIG_VERSION,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ (1 * 1024 * 1024 + 1),
- /* double min_clean_fraction = */ 0.2,
- /* size_t max_size = */ (16 * 1024 * 1024 + 1),
- /* size_t min_size = */ ( 1 * 1024 * 1024 + 1),
- /* long int epoch_length = */ 50001,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024 + 1),
+ /* double min_clean_fraction = */ 0.2,
+ /* size_t max_size = */ (16 * 1024 * 1024 + 1),
+ /* size_t min_size = */ ( 1 * 1024 * 1024 + 1),
+ /* long int epoch_length = */ 50001,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold,
- /* double lower_hr_threshold = */ 0.91,
- /* double increment = */ 2.1,
- /* hbool_t apply_max_increment = */ TRUE,
- /* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* double lower_hr_threshold = */ 0.91,
+ /* double increment = */ 2.1,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out,
- /* double upper_hr_threshold = */ 0.998,
- /* double decrement = */ 0.91,
- /* hbool_t apply_max_decrement = */ TRUE,
- /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
- /* int epochs_before_eviction = */ 4,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.998,
+ /* double decrement = */ 0.91,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
+ /* int epochs_before_eviction = */ 4,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t scratch;
H5C2_auto_size_ctl_t default_auto_size_ctl;
@@ -732,7 +745,7 @@ validate_mdc_config(hid_t file_id,
/* Recall that in any configuration supplied by the cache
* at run time, the set_initial_size field will always
* be FALSE, regardless of the value pass2ed in. Thus we
- * always resume that this field need not match that of
+ * always presume that this field need not match that of
* the supplied external configuration.
*
* The cache also sets the initial_size field to the current
@@ -794,120 +807,136 @@ check_file_mdc_api_calls(void)
H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG;
H5AC2_cache_config_t mod_config_1 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ (1 * 1024 * 1024 + 1),
- /* double min_clean_fraction = */ 0.2,
- /* size_t max_size = */ (16 * 1024 * 1024 + 1),
- /* size_t min_size = */ ( 1 * 1024 * 1024 + 1),
- /* long int epoch_length = */ 50001,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024 + 1),
+ /* double min_clean_fraction = */ 0.2,
+ /* size_t max_size = */ (16 * 1024 * 1024 + 1),
+ /* size_t min_size = */ ( 1 * 1024 * 1024 + 1),
+ /* long int epoch_length = */ 50001,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold,
- /* double lower_hr_threshold = */ 0.91,
- /* double increment = */ 2.1,
- /* hbool_t apply_max_increment = */ TRUE,
- /* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* double lower_hr_threshold = */ 0.91,
+ /* double increment = */ 2.1,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out,
- /* double upper_hr_threshold = */ 0.998,
- /* double decrement = */ 0.91,
- /* hbool_t apply_max_decrement = */ TRUE,
- /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
- /* int epochs_before_eviction = */ 4,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.998,
+ /* double decrement = */ 0.91,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
+ /* int epochs_before_eviction = */ 4,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t mod_config_2 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ TRUE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ (512 * 1024),
- /* double min_clean_fraction = */ 0.1,
- /* size_t max_size = */ ( 8 * 1024 * 1024),
- /* size_t min_size = */ ( 512 * 1024),
- /* long int epoch_length = */ 25000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ TRUE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (512 * 1024),
+ /* double min_clean_fraction = */ 0.1,
+ /* size_t max_size = */ ( 8 * 1024 * 1024),
+ /* size_t min_size = */ ( 512 * 1024),
+ /* long int epoch_length = */ 25000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold,
- /* double lower_hr_threshold = */ 0.9,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ TRUE,
- /* size_t max_increment = */ (2 * 1024 * 1024),
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (2 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
- /* double upper_hr_threshold = */ 0.9995,
- /* double decrement = */ 0.95,
- /* hbool_t apply_max_decrement = */ TRUE,
- /* size_t max_decrement = */ (512 * 1024),
- /* int epochs_before_eviction = */ 4,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.9995,
+ /* double decrement = */ 0.95,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (512 * 1024),
+ /* int epochs_before_eviction = */ 4,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t mod_config_3 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ (1 * 1024 * 1024),
- /* double min_clean_fraction = */ 0.2,
- /* size_t max_size = */ (16 * 1024 * 1024),
- /* size_t min_size = */ ( 1 * 1024 * 1024),
- /* long int epoch_length = */ 50000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.2,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off,
- /* double lower_hr_threshold = */ 0.90,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ TRUE,
- /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* double lower_hr_threshold = */ 0.90,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
- /* double upper_hr_threshold = */ 0.999,
- /* double decrement = */ 0.9,
- /* hbool_t apply_max_decrement = */ FALSE,
- /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
- /* int epochs_before_eviction = */ 3,
- /* hbool_t apply_empty_reserve = */ FALSE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ FALSE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024 - 1),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ FALSE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t mod_config_4 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ (1 * 1024 * 1024),
- /* double min_clean_fraction = */ 0.15,
- /* size_t max_size = */ (20 * 1024 * 1024),
- /* size_t min_size = */ ( 1 * 1024 * 1024),
- /* long int epoch_length = */ 75000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.15,
+ /* size_t max_size = */ (20 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 75000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold,
- /* double lower_hr_threshold = */ 0.9,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ TRUE,
- /* size_t max_increment = */ (2 * 1024 * 1024),
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (2 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */
H5C2_decr__age_out_with_threshold,
- /* double upper_hr_threshold = */ 0.999,
- /* double decrement = */ 0.9,
- /* hbool_t apply_max_decrement = */ TRUE,
- /* size_t max_decrement = */ (1 * 1024 * 1024),
- /* int epochs_before_eviction = */ 3,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.1,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
TESTING("MDC/FILE related API calls");
@@ -1420,94 +1449,115 @@ mdc_api_call_smoke_check(void)
H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG;
H5AC2_cache_config_t mod_config_1 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ 500000,
- /* double min_clean_fraction = */ 0.1,
- /* size_t max_size = */ 16000000,
- /* size_t min_size = */ 250000,
- /* long int epoch_length = */ 50000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ 500000,
+ /* double min_clean_fraction = */ 0.1,
+ /* size_t max_size = */ 16000000,
+ /* size_t min_size = */ 250000,
+ /* long int epoch_length = */ 50000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off,
- /* double lower_hr_threshold = */ 0.95,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ FALSE,
- /* size_t max_increment = */ 4000000,
+ /* double lower_hr_threshold = */ 0.95,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ FALSE,
+ /* size_t max_increment = */ 4000000,
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
- /* double upper_hr_threshold = */ 0.999,
- /* double decrement = */ 0.9,
- /* hbool_t apply_max_decrement = */ FALSE,
- /* size_t max_decrement = */ 1000000,
- /* int epochs_before_eviction = */ 2,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ FALSE,
+ /* size_t max_decrement = */ 1000000,
+ /* int epochs_before_eviction = */ 2,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t mod_config_2 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ 12000000,
- /* double min_clean_fraction = */ 0.1,
- /* size_t max_size = */ 16000000,
- /* size_t min_size = */ 250000,
- /* long int epoch_length = */ 50000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ 12000000,
+ /* double min_clean_fraction = */ 0.1,
+ /* size_t max_size = */ 16000000,
+ /* size_t min_size = */ 250000,
+ /* long int epoch_length = */ 50000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off,
- /* double lower_hr_threshold = */ 0.95,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ FALSE,
- /* size_t max_increment = */ 4000000,
+ /* double lower_hr_threshold = */ 0.95,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ FALSE,
+ /* size_t max_increment = */ 4000000,
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
- /* double upper_hr_threshold = */ 0.999,
- /* double decrement = */ 0.9,
- /* hbool_t apply_max_decrement = */ FALSE,
- /* size_t max_decrement = */ 1000000,
- /* int epochs_before_eviction = */ 2,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ FALSE,
+ /* size_t max_decrement = */ 1000000,
+ /* int epochs_before_eviction = */ 2,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
H5AC2_cache_config_t mod_config_3 =
{
- /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
- /* hbool_t rpt_fcn_enabled = */ FALSE,
- /* hbool_t open_trace_file = */ FALSE,
- /* hbool_t close_trace_file = */ FALSE,
- /* char trace_file_name[] = */ "",
- /* hbool_t evictions_enabled = */ TRUE,
- /* hbool_t set_initial_size = */ TRUE,
- /* size_t initial_size = */ 2000000,
- /* double min_clean_fraction = */ 0.1,
- /* size_t max_size = */ 16000000,
- /* size_t min_size = */ 250000,
- /* long int epoch_length = */ 50000,
+ /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ 2000000,
+ /* double min_clean_fraction = */ 0.1,
+ /* size_t max_size = */ 16000000,
+ /* size_t min_size = */ 250000,
+ /* long int epoch_length = */ 50000,
/* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off,
- /* double lower_hr_threshold = */ 0.95,
- /* double increment = */ 2.0,
- /* hbool_t apply_max_increment = */ FALSE,
- /* size_t max_increment = */ 4000000,
+ /* double lower_hr_threshold = */ 0.95,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ FALSE,
+ /* size_t max_increment = */ 4000000,
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
- /* double upper_hr_threshold = */ 0.999,
- /* double decrement = */ 0.9,
- /* hbool_t apply_max_decrement = */ FALSE,
- /* size_t max_decrement = */ 1000000,
- /* int epochs_before_eviction = */ 2,
- /* hbool_t apply_empty_reserve = */ TRUE,
- /* double empty_reserve = */ 0.05,
- /* int dirty_bytes_threshold = */ (256 * 1024)
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ FALSE,
+ /* size_t max_decrement = */ 1000000,
+ /* int epochs_before_eviction = */ 2,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
};
TESTING("MDC API smoke check");
+ if ( express_test > 0 ) {
+
+ SKIPPED();
+
+ HDfprintf(stdout, " Long tests disabled.\n");
+
+ return;
+ }
+
pass2 = TRUE;
/* Open a file with the default FAPL. Verify that the cache is
@@ -2145,7 +2195,7 @@ mdc_api_call_smoke_check(void)
* used to test error rejection in the MDC related API calls.
*/
-#define NUM_INVALID_CONFIGS 36
+#define NUM_INVALID_CONFIGS 41
H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
{
@@ -2168,6 +2218,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2197,6 +2251,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2226,6 +2284,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2255,6 +2317,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2284,6 +2350,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2313,6 +2383,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2342,6 +2416,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2371,6 +2449,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2400,6 +2482,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2429,6 +2515,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2458,6 +2548,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2487,6 +2581,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2516,6 +2614,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2545,6 +2647,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2574,6 +2680,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2603,6 +2713,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2632,6 +2746,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2661,6 +2779,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2690,6 +2812,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 0.999999999999,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2719,6 +2845,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ (hbool_t)-1,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2730,7 +2860,172 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 20 -- bad decr_mode */
+ /* 20 -- invalid flash_incr_mode */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ -1,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 21 -- flash_multiple too small */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 0.09,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 22 -- flash_multiple too big */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 10.001,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 23 -- flash_threshold too small */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 1.0,
+ /* double flash_threshold = */ 0.099,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 24 -- flash_threshold too big */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 1.0,
+ /* double flash_threshold = */ 1.001,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 25 -- bad decr_mode */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2748,6 +3043,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ -1,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2759,7 +3058,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 21 -- upper_hr_threshold too big */
+ /* 26 -- upper_hr_threshold too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2777,6 +3076,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
/* double upper_hr_threshold = */ 1.00001,
/* double decrement = */ 0.9,
@@ -2788,7 +3091,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 22 -- decrement too small */
+ /* 27 -- decrement too small */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2806,6 +3109,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ -0.0000000001,
@@ -2817,7 +3124,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 23 -- decrement too big */
+ /* 28 -- decrement too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2835,6 +3142,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 1.0000000001,
@@ -2846,7 +3157,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 24 -- epochs_before_eviction too small */
+ /* 29 -- epochs_before_eviction too small */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2864,6 +3175,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2875,7 +3190,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 24 -- epochs_before_eviction too big */
+ /* 30 -- epochs_before_eviction too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2893,6 +3208,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2904,7 +3223,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 26 -- invalid apply_empty_reserve */
+ /* 31 -- invalid apply_empty_reserve */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2922,6 +3241,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2933,7 +3256,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 27 -- empty_reserve too small */
+ /* 32 -- empty_reserve too small */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2951,6 +3274,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2962,7 +3289,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 28 -- empty_reserve too big */
+ /* 33 -- empty_reserve too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2980,6 +3307,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2991,7 +3322,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 29 -- upper_hr_threshold too small */
+ /* 34 -- upper_hr_threshold too small */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3009,6 +3340,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ -0.000000001,
/* double decrement = */ 0.9,
@@ -3020,7 +3355,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 30 -- upper_hr_threshold too big */
+ /* 35 -- upper_hr_threshold too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3038,6 +3373,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 1.00000001,
/* double decrement = */ 0.9,
@@ -3049,7 +3388,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 31 -- upper_hr_threshold <= lower_hr_threshold */
+ /* 36 -- upper_hr_threshold <= lower_hr_threshold */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3067,6 +3406,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3078,7 +3421,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 32 -- dirty_bytes_threshold too small */
+ /* 37 -- dirty_bytes_threshold too small */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3096,6 +3439,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -3107,7 +3454,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (H5C2__MIN_MAX_CACHE_SIZE / 2) - 1
},
{
- /* 33 -- dirty_bytes_threshold too big */
+ /* 38 -- dirty_bytes_threshold too big */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3125,6 +3472,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3136,7 +3487,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (H5C2__MAX_MAX_CACHE_SIZE / 4) + 1
},
{
- /* 34 -- attempt to disable evictions when auto incr enabled */
+ /* 39 -- attempt to disable evictions when auto incr enabled */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3154,6 +3505,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3165,7 +3520,7 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 35 -- attempt to disable evictions when auto decr enabled */
+ /* 40 -- attempt to disable evictions when auto decr enabled */
/* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3183,6 +3538,10 @@ H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C2_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C2_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3759,15 +4118,13 @@ check_file_mdc_api_errs(void)
int
main(void)
{
+ int express_test;
+
H5open();
skip_long_tests2 = FALSE;
-#ifdef NDEBUG
- run_full_test2 = TRUE;
-#else /* NDEBUG */
- run_full_test2 = FALSE;
-#endif /* NDEBUG */
+ express_test = GetTestExpress();
#if 1
check_fapl_mdc_api_calls();
diff --git a/test/cache2_common.c b/test/cache2_common.c
index be9429b..2ac6dfd 100644
--- a/test/cache2_common.c
+++ b/test/cache2_common.c
@@ -2101,6 +2101,91 @@ resize_entry2(H5C2_t * cache_ptr,
} /* resize_entry2() */
+ /*-------------------------------------------------------------------------
+ * Function: resize_pinned_entry2
+ *
+ * Purpose: Given a pointer to a cache, an entry type, an index, and
+ * a new size, change the size of the target pinned entry
+ * to match the supplied new size.
+ *
+ * Do nothing if pass is false on entry.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 1/11/08
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+resize_pinned_entry2(H5C2_t * cache_ptr,
+ int32_t type,
+ int32_t idx,
+ size_t new_size)
+{
+ herr_t result;
+ test_entry_t * base_addr;
+ test_entry_t * entry_ptr;
+
+ HDassert( cache_ptr );
+ HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+ HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) );
+ HDassert( type = VARIABLE_ENTRY_TYPE ) ;
+ HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes2[type] ) );
+
+ if ( pass2 ) {
+
+ if ( ! entry_in_cache2(cache_ptr, type, idx) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "entry not in cache.";
+
+ } else {
+
+ base_addr = entries2[type];
+ entry_ptr = &(base_addr[idx]);
+
+ HDassert( entry_ptr->index == idx );
+ HDassert( entry_ptr->type == type );
+ HDassert( entry_ptr == entry_ptr->self );
+
+ if ( ! ( (entry_ptr->header).is_pinned ) ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "entry to be resized is not pinned.";
+
+ } else {
+
+ entry_ptr->size = new_size;
+
+ result = H5C2_resize_pinned_entry(cache_ptr,
+ (void *)entry_ptr,
+ new_size);
+
+ if ( result != SUCCEED ) {
+
+ pass2 = FALSE;
+ failure_mssg2 = "error(s) in H5C2_resize_pinned_entry().";
+
+ } else {
+
+ HDassert( entry_ptr->size = (entry_ptr->header).size );
+
+ }
+ }
+ }
+ }
+
+ return;
+
+} /* resize_pinned_entry() */
+
+
/*-------------------------------------------------------------------------
* Function: verify_clean2
*
@@ -3114,6 +3199,12 @@ mark_pinned_entry_dirty2(H5C2_t * cache_ptr,
entry_ptr->is_dirty = TRUE;
+ if ( size_changed ) {
+
+ /* update entry size now to keep the sanity checks happy */
+ entry_ptr->size = new_size;
+ }
+
result = H5C2_mark_pinned_entry_dirty(cache_ptr,
(void *)entry_ptr,
size_changed,
@@ -3126,6 +3217,22 @@ mark_pinned_entry_dirty2(H5C2_t * cache_ptr,
( entry_ptr->size != entry_ptr->header.size ) ||
( entry_ptr->addr != entry_ptr->header.addr ) ) {
+#if 0 /* This is useful debugging code -- keep it around */
+ HDfprintf(stdout, "result = %ld.\n", (long)result);
+ HDfprintf(stdout, "entry_ptr->header.is_dirty = %d.\n",
+ (int)(entry_ptr->header.is_dirty));
+ HDfprintf(stdout, "entry_ptr->header.is_pinned = %d.\n",
+ (int)(entry_ptr->header.is_pinned));
+ HDfprintf(stdout,
+ "(entry_ptr->header.type != &(types[type])) = %d.\n",
+ (int)(entry_ptr->header.type != &(types[type])));
+ HDfprintf(stdout,
+ "entry_ptr->size = %ld, entry_ptr->header.size = %ld.\n",
+ (long)(entry_ptr->size), (long)(entry_ptr->header.size));
+ HDfprintf(stdout,
+ "entry_ptr->addr = %ld, entry_ptr->header.addr = %ld.\n",
+ (long)(entry_ptr->addr), (long)(entry_ptr->header.addr));
+#endif
pass2 = FALSE;
failure_mssg2 = "error in H5C2_mark_pinned_entry_dirty().";
diff --git a/test/cache2_common.h b/test/cache2_common.h
index 351f7e8..627b8c6 100644
--- a/test/cache2_common.h
+++ b/test/cache2_common.h
@@ -697,6 +697,11 @@ void resize_entry2(H5C2_t * cache_ptr,
size_t new_size,
hbool_t resize_pin);
+void resize_pinned_entry2(H5C2_t * cache_ptr,
+ int32_t type,
+ int32_t idx,
+ size_t new_size);
+
H5C2_t * setup_cache2(size_t max_cache_size, size_t min_clean_size);
void row_major_scan_forward2(H5C2_t * cache_ptr,
diff --git a/test/cache_api.c b/test/cache_api.c
index a1da62f..fcc4664 100644
--- a/test/cache_api.c
+++ b/test/cache_api.c
@@ -50,6 +50,9 @@ const char *FILENAME[] = {
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
( (a).decrement == (b).decrement ) && \
@@ -84,7 +87,7 @@ static void check_and_validate_cache_size(hid_t file_id,
int32_t * cur_num_entries_ptr,
hbool_t dump_data);
-static void mdc_api_call_smoke_check(void);
+static void mdc_api_call_smoke_check(int express_test);
static void check_fapl_mdc_api_errs(void);
@@ -139,6 +142,9 @@ static void check_file_mdc_api_errs(void);
( (a).increment == (b).increment ) && \
( (a).apply_max_increment == (b).apply_max_increment ) && \
( (a).max_increment == (b).max_increment ) && \
+ ( (a).flash_incr_mode == (b).flash_incr_mode ) && \
+ ( (a).flash_multiple == (b).flash_multiple ) && \
+ ( (a).flash_threshold == (b).flash_threshold ) && \
( (a).decr_mode == (b).decr_mode ) && \
( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
( (a).decrement == (b).decrement ) && \
@@ -166,8 +172,14 @@ static void check_file_mdc_api_errs(void);
(i).increment = (e).increment; \
(i).apply_max_increment = (e).apply_max_increment; \
(i).max_increment = (e).max_increment; \
+ (i).flash_incr_mode = (e).flash_incr_mode; \
+ (i).flash_multiple = (e).flash_multiple; \
+ (i).flash_threshold = (e).flash_threshold; \
(i).decr_mode = (e).decr_mode; \
(i).upper_hr_threshold = (e).upper_hr_threshold; \
+ (i).flash_incr_mode = (e).flash_incr_mode; \
+ (i).flash_multiple = (e).flash_multiple; \
+ (i).flash_threshold = (e).flash_threshold; \
(i).decrement = (e).decrement; \
(i).apply_max_decrement = (e).apply_max_decrement; \
(i).max_decrement = (e).max_decrement; \
@@ -208,6 +220,10 @@ check_fapl_mdc_api_calls(void)
/* double increment = */ 2.1,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
/* double upper_hr_threshold = */ 0.998,
/* double decrement = */ 0.91,
@@ -695,7 +711,7 @@ validate_mdc_config(hid_t file_id,
/* Recall that in any configuration supplied by the cache
* at run time, the set_initial_size field will always
* be FALSE, regardless of the value passed in. Thus we
- * always resume that this field need not match that of
+ * always presume that this field need not match that of
* the supplied external configuration.
*
* The cache also sets the initial_size field to the current
@@ -773,6 +789,10 @@ check_file_mdc_api_calls(void)
/* double increment = */ 2.1,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024 + 1),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
/* double upper_hr_threshold = */ 0.998,
/* double decrement = */ 0.91,
@@ -802,6 +822,10 @@ check_file_mdc_api_calls(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (2 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 1.5,
+ /* double flash_threshold = */ 0.4,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
/* double upper_hr_threshold = */ 0.9995,
/* double decrement = */ 0.95,
@@ -831,6 +855,10 @@ check_file_mdc_api_calls(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.1,
+ /* double flash_threshold = */ 0.6,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -860,6 +888,10 @@ check_file_mdc_api_calls(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (2 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 1.1,
+ /* double flash_threshold = */ 0.3,
/* enum H5C_cache_decr_mode decr_mode = */
H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
@@ -1344,7 +1376,7 @@ check_and_validate_cache_size(hid_t file_id,
#define NUM_RANDOM_ACCESSES 200000
static void
-mdc_api_call_smoke_check(void)
+mdc_api_call_smoke_check(int express_test)
{
const char * fcn_name = "mdc_api_call_smoke_check()";
char filename[512];
@@ -1389,6 +1421,10 @@ mdc_api_call_smoke_check(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ FALSE,
/* size_t max_increment = */ 4000000,
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -1418,6 +1454,10 @@ mdc_api_call_smoke_check(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ FALSE,
/* size_t max_increment = */ 4000000,
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -1447,6 +1487,10 @@ mdc_api_call_smoke_check(void)
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ FALSE,
/* size_t max_increment = */ 4000000,
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -1460,6 +1504,15 @@ mdc_api_call_smoke_check(void)
TESTING("MDC API smoke check");
+ if ( express_test > 0 ) {
+
+ SKIPPED();
+
+ HDfprintf(stdout, " Long tests disabled.\n");
+
+ return;
+ }
+
pass = TRUE;
/* Open a file with the default FAPL. Verify that the cache is
@@ -2092,7 +2145,7 @@ mdc_api_call_smoke_check(void)
* used to test error rejection in the MDC related API calls.
*/
-#define NUM_INVALID_CONFIGS 36
+#define NUM_INVALID_CONFIGS 41
H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
{
@@ -2115,6 +2168,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2143,6 +2200,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double lower_hr_threshold = */ 0.9,
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* size_t max_increment = */ (4 * 1024 * 1024),
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
@@ -2173,6 +2234,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2202,6 +2267,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2231,6 +2300,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2260,6 +2333,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2289,6 +2366,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2318,6 +2399,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2347,6 +2432,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2376,6 +2465,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2405,6 +2498,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2434,6 +2531,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2463,6 +2564,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2492,6 +2597,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2521,6 +2630,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2550,6 +2663,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2579,6 +2696,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2608,6 +2729,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2637,6 +2762,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 0.999999999999,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2666,6 +2795,142 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ (hbool_t)-1,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 20 -- invalid flash_incr_mode */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ -1,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 21 -- flash_multiple too small */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 0.09,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 22 -- flash_multiple too big */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 10.001,
+ /* double flash_threshold = */ 0.5,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 23 -- flash_threshold too small */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 1.0,
+ /* double flash_threshold = */ 0.099,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2677,7 +2942,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 20 -- bad decr_mode */
+ /* 24 -- flash_threshold too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2695,6 +2960,43 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__add_space,
+ /* double flash_multiple = */ 1.0,
+ /* double flash_threshold = */ 1.001,
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
+ /* double upper_hr_threshold = */ 0.999,
+ /* double decrement = */ 0.9,
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+ /* int epochs_before_eviction = */ 3,
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1,
+ /* int dirty_bytes_threshold = */ (256 * 1024)
+ },
+ {
+ /* 25 -- bad decr_mode */
+ /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* hbool_t rpt_fcn_enabled = */ FALSE,
+ /* hbool_t open_trace_file = */ FALSE,
+ /* hbool_t close_trace_file = */ FALSE,
+ /* char trace_file_name[] = */ "",
+ /* hbool_t evictions_enabled = */ TRUE,
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+ /* double min_clean_fraction = */ 0.25,
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ ( 1 * 1024 * 1024),
+ /* long int epoch_length = */ 50000,
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+ /* double lower_hr_threshold = */ 0.9,
+ /* double increment = */ 2.0,
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ -1,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2706,7 +3008,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 21 -- upper_hr_threshold too big */
+ /* 26 -- upper_hr_threshold too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2724,6 +3026,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
/* double upper_hr_threshold = */ 1.00001,
/* double decrement = */ 0.9,
@@ -2735,7 +3041,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 22 -- decrement too small */
+ /* 27 -- decrement too small */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2753,6 +3059,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ -0.0000000001,
@@ -2764,7 +3074,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 23 -- decrement too big */
+ /* 28 -- decrement too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2782,6 +3092,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 1.0000000001,
@@ -2793,7 +3107,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 24 -- epochs_before_eviction too small */
+ /* 29 -- epochs_before_eviction too small */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2811,6 +3125,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2822,7 +3140,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 24 -- epochs_before_eviction too big */
+ /* 30 -- epochs_before_eviction too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2840,6 +3158,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2851,7 +3173,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 26 -- invalid apply_empty_reserve */
+ /* 31 -- invalid apply_empty_reserve */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2869,6 +3191,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2880,7 +3206,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 27 -- empty_reserve too small */
+ /* 32 -- empty_reserve too small */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2898,6 +3224,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2909,7 +3239,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 28 -- empty_reserve too big */
+ /* 33 -- empty_reserve too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2927,6 +3257,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -2938,7 +3272,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 29 -- upper_hr_threshold too small */
+ /* 34 -- upper_hr_threshold too small */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2956,6 +3290,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ -0.000000001,
/* double decrement = */ 0.9,
@@ -2967,7 +3305,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 30 -- upper_hr_threshold too big */
+ /* 35 -- upper_hr_threshold too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -2985,6 +3323,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 1.00000001,
/* double decrement = */ 0.9,
@@ -2996,7 +3338,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 31 -- upper_hr_threshold <= lower_hr_threshold */
+ /* 36 -- upper_hr_threshold <= lower_hr_threshold */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3014,6 +3356,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3025,7 +3371,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 32 -- dirty_bytes_threshold too small */
+ /* 37 -- dirty_bytes_threshold too small */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3043,6 +3389,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.999,
/* double decrement = */ 0.9,
@@ -3054,7 +3404,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (H5C__MIN_MAX_CACHE_SIZE / 2) - 1
},
{
- /* 33 -- dirty_bytes_threshold too big */
+ /* 38 -- dirty_bytes_threshold too big */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3072,6 +3422,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3083,7 +3437,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (H5C__MAX_MAX_CACHE_SIZE / 4) + 1
},
{
- /* 34 -- attempt to disable evictions when auto incr enabled */
+ /* 39 -- attempt to disable evictions when auto incr enabled */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3101,6 +3455,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3112,7 +3470,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* int dirty_bytes_threshold = */ (256 * 1024)
},
{
- /* 35 -- attempt to disable evictions when auto decr enabled */
+ /* 40 -- attempt to disable evictions when auto decr enabled */
/* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
/* hbool_t rpt_fcn_enabled = */ FALSE,
/* hbool_t open_trace_file = */ FALSE,
@@ -3130,6 +3488,10 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
/* double increment = */ 2.0,
/* hbool_t apply_max_increment = */ TRUE,
/* size_t max_increment = */ (4 * 1024 * 1024),
+ /* enum H5C_cache_flash_incr_mode */
+ /* flash_incr_mode = */ H5C_flash_incr__off,
+ /* double flash_multiple = */ 2.0,
+ /* double flash_threshold = */ 0.5,
/* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
/* double upper_hr_threshold = */ 0.9,
/* double decrement = */ 0.9,
@@ -3669,15 +4031,11 @@ check_file_mdc_api_errs(void)
int
main(void)
{
- H5open();
+ int express_test;
- skip_long_tests = FALSE;
+ H5open();
-#ifdef NDEBUG
- run_full_test = TRUE;
-#else /* NDEBUG */
- run_full_test = FALSE;
-#endif /* NDEBUG */
+ express_test = GetTestExpress();
#if 1
check_fapl_mdc_api_calls();
@@ -3685,8 +4043,8 @@ main(void)
#if 1
check_file_mdc_api_calls();
#endif
-#if 0
- mdc_api_call_smoke_check();
+#if 1
+ mdc_api_call_smoke_check(express_test);
#endif
#if 1
check_fapl_mdc_api_errs();
diff --git a/test/cache_common.c b/test/cache_common.c
index d2be959..25eb988 100644
--- a/test/cache_common.c
+++ b/test/cache_common.c
@@ -1722,6 +1722,91 @@ resize_entry(H5C_t * cache_ptr,
/*-------------------------------------------------------------------------
+ * Function: resize_pinned_entry
+ *
+ * Purpose: Given a pointer to a cache, an entry type, an index, and
+ * a new size, change the size of the target pinned entry
+ * to match the supplied new size.
+ *
+ * Do nothing if pass is false on entry.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 1/11/08
+ *
+ * Modifications:
+ *
+ * None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+resize_pinned_entry(H5C_t * cache_ptr,
+ int32_t type,
+ int32_t idx,
+ size_t new_size)
+{
+ herr_t result;
+ test_entry_t * base_addr;
+ test_entry_t * entry_ptr;
+
+ HDassert( cache_ptr );
+ HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+ HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) );
+ HDassert( type = VARIABLE_ENTRY_TYPE ) ;
+ HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes[type] ) );
+
+ if ( pass ) {
+
+ if ( ! entry_in_cache(cache_ptr, type, idx) ) {
+
+ pass = FALSE;
+ failure_mssg = "entry not in cache.";
+
+ } else {
+
+ base_addr = entries[type];
+ entry_ptr = &(base_addr[idx]);
+
+ HDassert( entry_ptr->index == idx );
+ HDassert( entry_ptr->type == type );
+ HDassert( entry_ptr == entry_ptr->self );
+
+ if ( ! ( (entry_ptr->header).is_pinned ) ) {
+
+ pass = FALSE;
+ failure_mssg = "entry to be resized is not pinned.";
+
+ } else {
+
+ entry_ptr->size = new_size;
+
+ result = H5C_resize_pinned_entry(cache_ptr,
+ (void *)entry_ptr,
+ new_size);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "error(s) in H5C_resize_pinned_entry().";
+
+ } else {
+
+ HDassert( entry_ptr->size = (entry_ptr->header).size );
+
+ }
+ }
+ }
+ }
+
+ return;
+
+} /* resize_pinned_entry() */
+
+
+/*-------------------------------------------------------------------------
* Function: verify_clean
*
* Purpose: Verify that all cache entries are marked as clean. If any
@@ -2460,6 +2545,12 @@ mark_pinned_entry_dirty(H5C_t * cache_ptr,
entry_ptr->is_dirty = TRUE;
+ if ( size_changed ) {
+
+ /* update entry size now to keep the sanity checks happy */
+ entry_ptr->size = new_size;
+ }
+
result = H5C_mark_pinned_entry_dirty(cache_ptr,
(void *)entry_ptr,
size_changed,
@@ -2472,6 +2563,22 @@ mark_pinned_entry_dirty(H5C_t * cache_ptr,
( entry_ptr->size != entry_ptr->header.size ) ||
( entry_ptr->addr != entry_ptr->header.addr ) ) {
+#if 0 /* This is useful debugging code -- keep it around */
+ HDfprintf(stdout, "result = %ld.\n", (long)result);
+ HDfprintf(stdout, "entry_ptr->header.is_dirty = %d.\n",
+ (int)(entry_ptr->header.is_dirty));
+ HDfprintf(stdout, "entry_ptr->header.is_pinned = %d.\n",
+ (int)(entry_ptr->header.is_pinned));
+ HDfprintf(stdout,
+ "(entry_ptr->header.type != &(types[type])) = %d.\n",
+ (int)(entry_ptr->header.type != &(types[type])));
+ HDfprintf(stdout,
+ "entry_ptr->size = %ld, entry_ptr->header.size = %ld.\n",
+ (long)(entry_ptr->size), (long)(entry_ptr->header.size));
+ HDfprintf(stdout,
+ "entry_ptr->addr = %ld, entry_ptr->header.addr = %ld.\n",
+ (long)(entry_ptr->addr), (long)(entry_ptr->header.addr));
+#endif
pass = FALSE;
failure_mssg = "error in H5C_mark_pinned_entry_dirty().";
diff --git a/test/cache_common.h b/test/cache_common.h
index 23832dc..e1d33f2 100644
--- a/test/cache_common.h
+++ b/test/cache_common.h
@@ -655,6 +655,11 @@ void resize_entry(H5C_t * cache_ptr,
size_t new_size,
hbool_t resize_pin);
+void resize_pinned_entry(H5C_t * cache_ptr,
+ int32_t type,
+ int32_t idx,
+ size_t new_size);
+
H5C_t * setup_cache(size_t max_cache_size, size_t min_clean_size);
void row_major_scan_forward(H5C_t * cache_ptr,
diff --git a/test/tbogus.h5 b/test/tbogus.h5
index 2b8b1dd..6d6f15f 100644
--- a/test/tbogus.h5
+++ b/test/tbogus.h5
Binary files differ
diff --git a/testpar/t_cache.c b/testpar/t_cache.c
index 243caa1..c5f8aae 100644
--- a/testpar/t_cache.c
+++ b/testpar/t_cache.c
@@ -5281,7 +5281,7 @@ trace_file_check(void)
const char * expected_output[] =
{
"### HDF5 metadata cache trace file version 1 ###\n",
- "H5AC_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n",
+ "H5AC_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 1.000000 0.250000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n",
"H5AC_set 0x0 15 0x0 2 0\n",
"H5AC_set 0x2 15 0x0 2 0\n",
"H5AC_set 0x4 15 0x0 4 0\n",
diff --git a/testpar/t_cache2.c b/testpar/t_cache2.c
index da527b1..aa64bea 100644
--- a/testpar/t_cache2.c
+++ b/testpar/t_cache2.c
@@ -5556,8 +5556,12 @@ smoke_check_5(void)
* Modifications:
*
* JRM -- 7/11/06
- * Updated fro H5AC2_expunge_entry() and
+ * Updated for H5AC2_expunge_entry() and
* H5AC2_resize_pinned_entry().
+ *
+ * JRM -- 2/14/08
+ * Updated for changes in H5AC2_set_cache_auto_resize_config
+ * to support the new flash cache size increment code.
*
*****************************************************************************/
@@ -5571,8 +5575,8 @@ trace_file_check(void)
const char * fcn_name = "trace_file_check()";
const char * expected_output[] =
{
- "### HDF5 metadata cache trace file version 1 ###\n",
- "H5AC2_set_cache_auto_resize_config 1 0 1 0 \"t_cache2_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n",
+ "### HDF5 metadata cache trace file version 2 ###\n",
+ "H5AC2_set_cache_auto_resize_config 1 0 1 0 \"t_cache2_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 4194304 1 1.000000 0.250000 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n",
"H5AC2_set 0x400 2 15 0x0 2 0\n",
"H5AC2_set 0x402 2 15 0x0 2 0\n",
"H5AC2_set 0x404 4 15 0x0 4 0\n",