From cd571e4a45e5af71ae608388141e6b28a16f8171 Mon Sep 17 00:00:00 2001 From: John Mainzer Date: Mon, 18 Feb 2008 00:28:04 -0500 Subject: [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. --- MANIFEST | 1 + configure | 2 +- src/H5AC.c | 23 +- src/H5AC2.c | 27 +- src/H5AC2private.h | 4 + src/H5AC2public.h | 60 +- src/H5ACprivate.h | 4 + src/H5ACpublic.h | 61 +- src/H5C.c | 993 ++++++++- src/H5C2.c | 599 +++++- src/H5C2journal.c | 519 +++++ src/H5C2pkg.h | 14 + src/H5C2private.h | 104 +- src/H5C2public.h | 7 + src/H5Cpkg.h | 22 +- src/H5Cprivate.h | 130 +- src/H5Cpublic.h | 6 + src/H5Fpkg.h | 5 + src/H5Fsuper.c | 105 + src/H5O.c | 15 +- src/H5Opkg.h | 7 +- src/H5Oprivate.h | 59 +- src/Makefile.am | 2 +- src/Makefile.in | 78 +- test/cache.c | 5427 ++++++++++++++++++++++++++++++++++---------------- test/cache2.c | 5302 ++++++++++++++++++++++++++++++++---------------- test/cache2_api.c | 785 ++++++-- test/cache2_common.c | 107 + test/cache2_common.h | 5 + test/cache_api.c | 416 +++- test/cache_common.c | 107 + test/cache_common.h | 5 + test/tbogus.h5 | Bin 1944 -> 1944 bytes testpar/t_cache.c | 2 +- testpar/t_cache2.c | 10 +- 35 files changed, 11136 insertions(+), 3877 deletions(-) create mode 100644 src/H5C2journal.c 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 * @@ -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 * @@ -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,96 +20522,22 @@ check_auto_cache_resize(void) takedown_cache(cache_ptr, FALSE, FALSE); } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass ) { - - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); - } - - return; - -} /* check_auto_cache_resize() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_disable() - * - * Purpose: Test the various ways in which the resize code can - * be disabled. Unfortunately, there are quite a few of them. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_auto_cache_resize_disable(void) -{ - const char * fcn_name = "check_auto_cache_resize_disable()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t checkpoint = 0; - H5C_t * cache_ptr = NULL; - H5C_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, - /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 1000, - - - /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - - /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("automatic cache resize disable"); - - pass = TRUE; + /* 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 automatic cache resizing, and then force - * the cache through all its operational modes. Verify that all - * performs as expected. + /* 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 ) { @@ -20565,36 +20548,11 @@ check_auto_cache_resize_disable(void) (size_t)(1 * 1024)); } - 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 1.\n"; - } - } - - if ( pass ) { - - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; - } - } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /****************************************************************** - * So far, we have forced the auto cache resize through all modes - * other than increase_disabled and decrease_disabled. Force these - * modes now. Note that there are several ways we can reach these - * modes. - ******************************************************************/ + /* now repeat the above tests using the add space flash cache size + * increment algorithm. + */ if ( pass ) { @@ -20602,795 +20560,844 @@ check_auto_cache_resize_disable(void) auto_size_ctl.rpt_fcn = test_rpt_fcn; auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; + auto_size_ctl.initial_size = 64 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.max_size = 1024 * 1024; + auto_size_ctl.min_size = 5 * 1024; - auto_size_ctl.epoch_length = 1000; + 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 = 1.0; /* disable size increases */ + auto_size_ctl.increment = 2.0; - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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__threshold; - auto_size_ctl.upper_hr_threshold = 0.995; + 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 = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1000 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + 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 2.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n"; } } if ( pass ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 1.\n"; + failure_mssg = "Unexpected cache config (0).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ + /* Load a huge entry into the cache */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; + if ( pass ) { + unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); } - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size change results 1.\n"; - } + failure_mssg = "Unexpected cache config (1).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 2.\n"; - } + failure_mssg = "Unexpected cache config (2).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1, + NO_CHANGE, H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 3.\n"; - } + failure_mssg = "Unexpected cache config (3).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests, disabling increase through the lower - * threshold instead of the increment. + /* Load a third moster entry. Should be no cache size increase this + * time. */ - if ( pass ) { - auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2); - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2, + NO_CHANGE, H5C__NO_FLAGS_SET); - auto_size_ctl.min_clean_fraction = 0.5; + 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 ) ) ) ) { - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + pass = FALSE; + failure_mssg = "Unexpected cache config (4).\n"; + } + } - auto_size_ctl.epoch_length = 1000; + 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 ) { - auto_size_ctl.incr_mode = H5C_incr__threshold; + expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1); + expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2); - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + if ( pass ) { - auto_size_ctl.increment = 2.0; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + if ( result != SUCCEED ) { + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + } + } - auto_size_ctl.decr_mode = H5C_decr__threshold; + 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 ) ) ) ) { - auto_size_ctl.upper_hr_threshold = 0.995; + pass = FALSE; + failure_mssg = "Unexpected cache config (5).\n"; + } + } - auto_size_ctl.decrement = 0.5; + /* repeat the above basic test, only this time, use inserts to add + * entries to the cache, not protects. + */ - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 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 3.\n"; - } - } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* insert a huge entry into the cache */ if ( pass ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 2.\n"; - } + failure_mssg = "Unexpected cache config (6).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 4, TRUE, + H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size change results 4.\n"; - } + failure_mssg = "Unexpected cache config (7).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. + /* Insert a second monster entry. Cache size should increase again. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, + H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 5.\n"; - } + failure_mssg = "Unexpected cache config (8).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. + /* Insert a third monster entry. Should be no cache size increase this + * time. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6, + NO_CHANGE, H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 6.\n"; - } + failure_mssg = "Unexpected cache config (9).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests yet again, disabling increase through the - * incr_mode. - */ - + /* 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 ) { - auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5); + expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6); - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; + 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); - auto_size_ctl.min_clean_fraction = 0.5; + 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); - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 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); - auto_size_ctl.epoch_length = 1000; + 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); - auto_size_ctl.incr_mode = H5C_incr__off; - auto_size_ctl.lower_hr_threshold = 0.75; + if ( pass ) { - auto_size_ctl.increment = 2.0; + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + if ( result != SUCCEED ) { + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + } + } - auto_size_ctl.decr_mode = H5C_decr__threshold; + 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 ) ) ) ) { - auto_size_ctl.upper_hr_threshold = 0.995; + pass = FALSE; + failure_mssg = "Unexpected cache config (10).\n"; + } + } - auto_size_ctl.decrement = 0.5; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + /* Now load the variable entries into the cache */ + if ( pass ) { - auto_size_ctl.epochs_before_eviction = 3; + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__NO_FLAGS_SET); - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__NO_FLAGS_SET); - result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__NO_FLAGS_SET); - if ( result != SUCCEED ) { + 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 = "H5C_set_cache_auto_resize_config failed 4.\n"; - } + 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 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 3.\n"; - } + failure_mssg = "Unexpected cache config (12).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + 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 ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 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 size change results 7.\n"; - } + failure_mssg = "Unexpected cache config (13).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. + /* protect a second variable entry, and re-size it to 10K. Should + * resize to 22 KB. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + 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 ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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 size change results 8.\n"; - } + failure_mssg = "Unexpected cache config (14).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. + /* protect a third variable entry, and re-size it to 10K. Should + * be no change in cache size. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + 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 ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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 size change results 9.\n"; - } + failure_mssg = "Unexpected cache config (15).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now, disable size decreases, and repeat the above tests. + /* 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 ) { - 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + 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); - auto_size_ctl.epoch_length = 1000; + if ( pass ) { + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); - auto_size_ctl.incr_mode = H5C_incr__threshold; + if ( result != SUCCEED ) { - auto_size_ctl.lower_hr_threshold = 0.75; + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n"; + } + } - auto_size_ctl.increment = 2.0; + 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 ) ) ) ) { - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + pass = FALSE; + failure_mssg = "Unexpected cache config (16).\n"; + } + } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.decr_mode = H5C_decr__threshold; + /* Now test flash cache resizes with pinned entries... + */ + if ( pass ) { - auto_size_ctl.upper_hr_threshold = 0.995; + 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); - auto_size_ctl.decrement = 1.0; /* disable size decreases */ + 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 ) ) ) ) { - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + pass = FALSE; + failure_mssg = "Unexpected cache config (17).\n"; + } + } - auto_size_ctl.epochs_before_eviction = 3; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + if ( pass ) { - result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); - if ( result != SUCCEED ) { + 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 = "H5C_set_cache_auto_resize_config failed 5.\n"; - } + failure_mssg = "Unexpected cache config (18).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); if ( pass ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 4.\n"; - } + failure_mssg = "Unexpected cache config (19).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be decrease_disabled. - */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + 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 ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 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 size change results 10.\n"; - } + failure_mssg = "Unexpected cache config (20).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* Unpin the entries. Note that no entries are evicted as we don't + * load any entries. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 11.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should be no change in cache size, - * and result should be decrease_disabled. - */ - if ( pass ) { + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 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 != 4 ) ) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 12.\n"; - } + failure_mssg = "Unexpected cache config (21).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests, disabling decrease through the upper - * threshold instead of the decrement. + /* 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 ) { - 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; + 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.incr_mode = H5C_incr__threshold; + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); - auto_size_ctl.lower_hr_threshold = 0.75; + if ( result != SUCCEED ) { - auto_size_ctl.increment = 2.0; + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n"; + } + } - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 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 != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + pass = FALSE; + failure_mssg = "Unexpected cache config (22).\n"; + } + } - auto_size_ctl.decr_mode = H5C_decr__threshold; + if ( pass ) { - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ + 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); - auto_size_ctl.decrement = 0.5; + 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 ) ) ) ) { - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + pass = FALSE; + failure_mssg = "Unexpected cache config (23).\n"; + } + } - auto_size_ctl.epochs_before_eviction = 3; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + if ( pass ) { - result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); - if ( result != SUCCEED ) { + 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 = "H5C_set_cache_auto_resize_config failed 6.\n"; - } + failure_mssg = "Unexpected cache config (24).\n"; + } } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + if ( pass ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 5.\n"; - } + failure_mssg = "Unexpected cache config (25).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. - */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + 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 ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 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 size change results 13.\n"; - } + failure_mssg = "Unexpected cache config (26).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* Unpin the entries. Note that no entries are evicted as we don't + * load any entries. */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 14.\n"; - } + failure_mssg = "Unexpected cache config (27).\n"; + } } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. + /* We have finished a basic check of the flash cache size increment + * code. Tidy up for a more extensive test... */ if ( pass ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + 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 ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 15.\n"; - } + failure_mssg = "Unexpected cache config (28).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests, disabling decrease through the decr_mode. + /* ...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 * 1024; + auto_size_ctl.initial_size = 4 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.max_size = 20 * 1024; + auto_size_ctl.min_size = 4 * 1024; - auto_size_ctl.epoch_length = 1000; + auto_size_ctl.epoch_length = 100; auto_size_ctl.incr_mode = H5C_incr__threshold; @@ -21400,106 +21407,137 @@ check_auto_cache_resize_disable(void) auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__off; - auto_size_ctl.upper_hr_threshold = 0.995; + 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 * 1024 * 1024); + auto_size_ctl.max_decrement = (2 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + 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 7.\n"; + 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 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size after set resize re-config 6.\n"; + failure_mssg = "bad cache after initialization 15.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. + /* 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; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size change results 16.\n"; - } + failure_mssg = "Unexpected cache config (29).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* 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; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } + protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, + H5C__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 17.\n"; - } + failure_mssg = "Unexpected cache config (30).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. + /* 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 ) { @@ -21507,35 +21545,229 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, TINY_ENTRY_TYPE, 0); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry(cache_ptr, TINY_ENTRY_TYPE, 0, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( 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 size change results 18.\n"; + failure_mssg = "Unexpected cache config (32).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now do tests disabling size decrement in age out mode. - * - * Start by disabling size decrement by setting max_decrement to zero. + /* 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(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* check_auto_cache_resize() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_disable() + * + * Purpose: Test the various ways in which the resize code can + * be disabled. Unfortunately, there are quite a few of them. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + * Added code to include the flash cache size increment + * code in this test. + * JRM -- 1/10/08 + * + *------------------------------------------------------------------------- + */ + +static void +check_auto_cache_resize_disable(void) +{ + const char * fcn_name = "check_auto_cache_resize_disable()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t checkpoint = 0; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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 = */ 1.0, + /* double flash_threshold = */ 0.25, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize disable"); + + pass = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* allocate a cache, enable automatic cache resizing, and then force + * the cache 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 ( 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 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /****************************************************************** + * So far, we have forced the auto cache resize through all modes + * other than increase_disabled and decrease_disabled. Force these + * modes now. Note that there are several ways we can reach these + * modes. + ******************************************************************/ + + if ( pass ) { + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -21554,22 +21786,26 @@ check_auto_cache_resize_disable(void) auto_size_ctl.lower_hr_threshold = 0.75; - auto_size_ctl.increment = 2.0; + auto_size_ctl.increment = 1.0; /* disable size increases */ - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__age_out; + + auto_size_ctl.decr_mode = H5C_decr__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 = 0; /* disable decrement */ + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -21579,7 +21815,7 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n"; } } @@ -21589,19 +21825,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 7.\n"; + failure_mssg = "bad cache size after set resize re-config 1.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass ) { @@ -21609,91 +21840,60 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 19.\n"; + failure_mssg = "Unexpected cache size change results 1.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Load up some more small entries. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass ) { rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + i = 0; + while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 20.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. - */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 21.\n"; + failure_mssg = "Unexpected cache size change results 2.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass ) { @@ -21711,51 +21911,20 @@ check_auto_cache_resize_disable(void) } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 22.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 23.\n"; + failure_mssg = "Unexpected cache size change results 3.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now disable size decrement in age out mode via the empty reserve. + /* Repeat the above tests, disabling increase through the lower + * threshold instead of the increment. */ if ( pass ) { @@ -21776,34 +21945,38 @@ check_auto_cache_resize_disable(void) auto_size_ctl.incr_mode = H5C_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ auto_size_ctl.increment = 2.0; - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__age_out; + + auto_size_ctl.decr_mode = H5C_decr__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.apply_max_decrement = FALSE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ + 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 9.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n"; } } @@ -21813,19 +21986,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 8.\n"; + failure_mssg = "bad cache size after set resize re-config 2.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. */ if ( pass ) { @@ -21833,61 +22001,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 24.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass ) && ( i < 2000 ) ) - { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 25.\n"; + failure_mssg = "Unexpected cache size change results 4.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass ) { @@ -21895,29 +22032,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 26.\n"; + failure_mssg = "Unexpected cache size change results 5.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass ) { @@ -21935,58 +22072,20 @@ check_auto_cache_resize_disable(void) } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 27.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 28.\n"; + failure_mssg = "Unexpected cache size change results 6.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now work with age out with threshold. One can argue that we should - * repeat the above age out tests with age out with threshold, but the - * same code is executed in both cases so I don't see the point. If - * that ever changes, this test should be updated. - * - * There is only one way of disabling decrements that is peculiar - * to age out with threshold, which is to set the upper threshold - * to 1.0. Test this now. + /* Repeat the above tests yet again, disabling increase through the + * incr_mode. */ if ( pass ) { @@ -22005,26 +22104,30 @@ check_auto_cache_resize_disable(void) auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__threshold; + auto_size_ctl.incr_mode = H5C_incr__off; 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 * 1024); + 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__age_out_with_threshold; - auto_size_ctl.upper_hr_threshold = 1.0; + auto_size_ctl.decr_mode = H5C_decr__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.apply_max_decrement = FALSE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -22034,7 +22137,7 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 10.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n"; } } @@ -22044,19 +22147,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 9.\n"; + failure_mssg = "bad cache size after set resize re-config 3.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. */ if ( pass ) { @@ -22064,63 +22162,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 29.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass ) && ( i < 2000 ) ) - { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 30.\n"; + failure_mssg = "Unexpected cache size change results 7.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible, but the upper threshold cannot be met, so no decrease. - * - * rpt_status should be decrease_disabled. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass ) { @@ -22128,31 +22193,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || - ( cache_ptr->index_len != 2000 ) || - ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 31.\n"; + failure_mssg = "Unexpected cache size change results 8.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass ) { @@ -22170,59 +22233,20 @@ check_auto_cache_resize_disable(void) } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 32.\n"; + failure_mssg = "Unexpected cache size change results 9.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* just bang on a single entry. This keeps the hit rate high, and sees - * to it that there are many entries that could be aged out were - * decreases enabled. - * - * Should be no change in cache size, and result should be - * decrease_disabled. + /* Now, disable size decreases, and repeat the above tests. */ - if ( pass ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) - { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999); - - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 33.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /********************************************************************* - * Finally, use the auto cache resize code to set the size of the - * cache and keep it there. Again, due to the complexity of the - * interface, there are lots of ways of doing this. We have to - * check them all. - *********************************************************************/ if ( pass ) { @@ -22230,31 +22254,35 @@ check_auto_cache_resize_disable(void) auto_size_ctl.rpt_fcn = test_rpt_fcn; auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; auto_size_ctl.incr_mode = H5C_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + 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 * 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; - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ + auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 0.5; + auto_size_ctl.decrement = 1.0; /* disable size decreases */ auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -22269,24 +22297,55 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 11.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 4.\n"; } } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no change in cache size, + * and result should be decrease_disabled. + */ if ( pass ) { - if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 10.\n"; + failure_mssg = "Unexpected cache size change results 10.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass ) { @@ -22303,22 +22362,20 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 34.\n"; + failure_mssg = "Unexpected cache size change results 11.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate again -- should be no change in cache size, + * and result should be decrease_disabled. */ if ( pass ) { @@ -22335,20 +22392,22 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 35.\n"; + failure_mssg = "Unexpected cache size change results 12.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Repeat the above tests, disabling decrease through the upper + * threshold instead of the decrement. + */ + if ( pass ) { auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -22357,10 +22416,10 @@ check_auto_cache_resize_disable(void) auto_size_ctl.set_initial_size = TRUE; auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.25; + auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; @@ -22369,17 +22428,21 @@ check_auto_cache_resize_disable(void) auto_size_ctl.lower_hr_threshold = 0.75; - auto_size_ctl.increment = 1.0; /* disable size increment */ + auto_size_ctl.increment = 2.0; 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; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ - auto_size_ctl.decrement = 1.0; /* disable size decrement */ + auto_size_ctl.decrement = 0.5; auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -22394,24 +22457,24 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n"; } } if ( pass ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 11.\n"; + failure_mssg = "bad cache size after set resize re-config 5.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. */ if ( pass ) { @@ -22419,31 +22482,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 36.\n"; + failure_mssg = "Unexpected cache size change results 13.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass ) { @@ -22451,41 +22512,73 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 37.\n"; + failure_mssg = "Unexpected cache size change results 14.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Repeat the above tests, disabling decrease through the decr_mode. + */ + 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 = FALSE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ - auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; @@ -22499,8 +22592,12 @@ 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; + + auto_size_ctl.decr_mode = H5C_decr__off; auto_size_ctl.upper_hr_threshold = 0.995; @@ -22519,24 +22616,54 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n"; } } if ( pass ) { - if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 12.\n"; + failure_mssg = "bad cache size after set resize re-config 6.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 16.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass ) { @@ -22553,22 +22680,20 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 38.\n"; + failure_mssg = "Unexpected cache size change results 17.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. */ if ( pass ) { @@ -22585,20 +22710,24 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 39.\n"; + failure_mssg = "Unexpected cache size change results 18.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now do tests disabling size decrement in age out mode. + * + * Start by disabling size decrement by setting max_decrement to zero. + */ + if ( pass ) { auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -22607,10 +22736,10 @@ check_auto_cache_resize_disable(void) auto_size_ctl.set_initial_size = TRUE; auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.25; + auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; @@ -22619,22 +22748,26 @@ check_auto_cache_resize_disable(void) auto_size_ctl.lower_hr_threshold = 0.75; - auto_size_ctl.increment = 1.0; /* disable size increment */ + auto_size_ctl.increment = 2.0; 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; - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ + auto_size_ctl.decr_mode = H5C_decr__age_out; + + 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 * 1024); + auto_size_ctl.max_decrement = 0; /* disable decrement */ - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -22644,24 +22777,29 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n"; } } if ( pass ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 13.\n"; + failure_mssg = "bad cache size after set resize re-config 7.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. */ if ( pass ) { @@ -22669,125 +22807,61 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 40.\n"; + failure_mssg = "Unexpected cache size change results 19.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Load up some more small entries. */ if ( pass ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass = FALSE; - failure_mssg = "Unexpected cache size change results 41.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - - auto_size_ctl.decr_mode = H5C_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 1.0; /* disable size decrement */ - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 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 15.\n"; - } - } - - if ( pass ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 14.\n"; + failure_mssg = "Unexpected cache size change results 20.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. */ if ( pass ) { @@ -22795,31 +22869,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 42.\n"; + failure_mssg = "Unexpected cache size change results 21.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass ) { @@ -22827,29 +22899,63 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 22.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 43.\n"; + failure_mssg = "Unexpected cache size change results 23.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now disable size decrement in age out mode via the empty reserve. + */ + if ( pass ) { auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -22861,12 +22967,12 @@ check_auto_cache_resize_disable(void) auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__off; + auto_size_ctl.incr_mode = H5C_incr__threshold; auto_size_ctl.lower_hr_threshold = 0.75; @@ -22875,8 +22981,12 @@ 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; + + auto_size_ctl.decr_mode = H5C_decr__age_out; auto_size_ctl.upper_hr_threshold = 0.995; @@ -22885,18 +22995,17 @@ check_auto_cache_resize_disable(void) auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - + auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ 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 16.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 9.\n"; } } @@ -22906,14 +23015,19 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 15.\n"; + failure_mssg = "bad cache size after set resize re-config 8.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. */ if ( pass ) { @@ -22921,400 +23035,443 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 44.\n"; + failure_mssg = "Unexpected cache size change results 24.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Load up some more small entries. */ if ( pass ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass ) && ( i < 1000 ) ) + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 45.\n"; + failure_mssg = "Unexpected cache size change results 25.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. + */ if ( pass ) { - takedown_cache(cache_ptr, FALSE, FALSE); + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 26.\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { - if ( ! pass ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 27.\n"; + } } - return; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); -} /* check_auto_cache_resize_disable() */ + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass ) { - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_epoch_markers() - * - * Purpose: Verify that the auto-resize code manages epoch markers - * correctly. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); -static void -check_auto_cache_resize_epoch_markers(void) -{ - const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t j; - int32_t checkpoint = 0; - H5C_t * cache_ptr = NULL; - H5C_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, - /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - /* double min_clean_fraction = */ 0.5, + pass = FALSE; + failure_mssg = "Unexpected cache size change results 28.\n"; + } + } - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* int64_t epoch_length = */ 1000, + /* Now work with age out with threshold. One can argue that we should + * repeat the above age out tests with age out with threshold, but the + * same code is executed in both cases so I don't see the point. If + * that ever changes, this test should be updated. + * + * There is only one way of disabling decrements that is peculiar + * to age out with threshold, which is to set the upper threshold + * to 1.0. Test this now. + */ + if ( pass ) { - /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; - /* double lower_hr_threshold = */ 0.75, + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; - /* double increment = */ 2.0, + auto_size_ctl.min_clean_fraction = 0.5; - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.epoch_length = 1000; - /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, - /* double upper_hr_threshold = */ 0.995, + auto_size_ctl.incr_mode = H5C_incr__threshold; - /* double decrement = */ 0.1, + auto_size_ctl.lower_hr_threshold = 0.75; - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), + auto_size_ctl.increment = 2.0; - /* int32_t epochs_before_eviction = */ 3, + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; - TESTING("automatic cache resize epoch marker management"); - pass = TRUE; + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + auto_size_ctl.upper_hr_threshold = 1.0; - if ( pass ) { + auto_size_ctl.decrement = 0.5; - reset_entries(); + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); - cache_ptr = setup_cache((size_t)(2 * 1024), - (size_t)(1 * 1024)); - } + auto_size_ctl.epochs_before_eviction = 1; - if ( pass ) { + 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 1.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 10.\n"; } } if ( pass ) { - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + failure_mssg = "bad cache size after set resize re-config 9.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(cache_ptr, TRUE, FALSE, FALSE); - /* Now make sure that we are managing the epoch markers correctly. - */ + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is 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 = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C_incr__off; - - 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 * 1024); - - - auto_size_ctl.decr_mode = H5C_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 10; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n"; + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; } - } - - if ( pass ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 1.\n"; + failure_mssg = "Unexpected cache size change results 29.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Since we just created the cache, there should be no epoch markers - * active. Verify that this is true. + /* Load up some more small entries. */ - if ( pass ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 1.\n"; + failure_mssg = "Unexpected cache size change results 30.\n"; } } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible, but the upper threshold cannot be met, so no decrease. + * + * rpt_status should be decrease_disabled. + */ if ( pass ) { rpt_fcn_called = FALSE; i = 0; while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || + ( cache_ptr->index_len != 2000 ) || + ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 0.\n"; + failure_mssg = "Unexpected cache size change results 31.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ if ( pass ) { - j = 2; - while ( ( pass ) && ( j <= 10 ) ) + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - rpt_fcn_called = FALSE; - i = (j - 2) * 1000; - while ( ( pass ) && ( i < (j - 1) * 1000 ) ) - { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); } + i++; + } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 2.\n"; - } + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - j++; + pass = FALSE; + failure_mssg = "Unexpected cache size change results 32.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* we now have a full complement of epoch markers -- see if - * we get the expected reduction. + /* just bang on a single entry. This keeps the hit rate high, and sees + * to it that there are many entries that could be aged out were + * decreases enabled. + * + * Should be no change in cache size, and result should be + * decrease_disabled. */ if ( pass ) { rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass ) && ( i < 10000 ) ) + i = 0; + while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != - ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || - ( cache_ptr->index_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 1.\n"; + failure_mssg = "Unexpected cache size change results 33.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* now reduce the epochs before eviction, and see if the cache - * deletes the extra markers - */ + + /********************************************************************* + * Finally, use the auto cache resize code to set the size of the + * cache and keep it there. Again, due to the complexity of the + * interface, there are lots of ways of doing this. We have to + * check them all. + *********************************************************************/ + 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 2 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__off; + auto_size_ctl.incr_mode = H5C_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23322,117 +23479,128 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 11.\n"; } } if ( pass ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 2.\n"; + failure_mssg = "bad cache size after set resize re-config 10.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* There should be exactly one active epoch marker at present. - */ - if ( pass ) { - - if ( cache_ptr->epoch_markers_active != 1 ) { - - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 3.\n"; - } - } - - /* Now do an epochs worth of accesses, and verify that everything - * not accessed in this epoch gets evicted, and the cache size - * is reduced. + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass ) && ( i < 10000 ) ) + i = 0; + while ( ( pass ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C__NO_FLAGS_SET); } i++; } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected cache size change results 2.\n"; + failure_mssg = "Unexpected cache size change results 34.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* There should be exactly one active epoch marker at present... + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { - if ( cache_ptr->epoch_markers_active != 1 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 4.\n"; + failure_mssg = "Unexpected cache size change results 35.\n"; } } - /* shift the decrement mode to threshold, and verify that we remove - * all epoch markers. - */ + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.5; + auto_size_ctl.min_clean_fraction = 0.25; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__off; + 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.increment = 1.0; /* disable size increment */ auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 0.5; + auto_size_ctl.decrement = 1.0; /* disable size decrement */ - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23440,74 +23608,128 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n"; } } if ( pass ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 3.\n"; + failure_mssg = "bad cache size after set resize re-config 11.\n"; } } - /* ... and now there should be none. + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 5.\n"; + failure_mssg = "Unexpected cache size change results 36.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* shift the decrement mode to age out with threshold. Set epochs - * before eviction to 10 again. + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 37.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + 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 = 8 * 1024 * 1024; + auto_size_ctl.set_initial_size = FALSE; + auto_size_ctl.initial_size = 2 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ + auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__off; + 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 * 1024); + 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; + + auto_size_ctl.decr_mode = H5C_decr__threshold; auto_size_ctl.upper_hr_threshold = 0.995; auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 10; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23515,298 +23737,1892 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; } } - /* Verify that there are no active epoch markers. - */ if ( pass ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 6.\n"; + failure_mssg = "bad cache size after set resize re-config 12.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* build up a full set of epoch markers. */ + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ if ( pass ) { - j = 1; - while ( ( pass ) && ( j <= 10 ) ) + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - rpt_fcn_called = FALSE; - i = (j - 1) * 1000; - while ( ( pass ) && ( i < j * 1000 ) ) - { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C__NO_FLAGS_SET); - } - i++; + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); } + i++; + } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 7.\n"; - } + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - j++; + pass = FALSE; + failure_mssg = "Unexpected cache size change results 38.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Verify that there are now 10 active epoch markers. + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { - if ( cache_ptr->epoch_markers_active != 10 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 8.\n"; + failure_mssg = "Unexpected cache size change results 39.\n"; } } - /* shift the decrement mode to off. This should cause all epoch - * markers to be removed. + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + 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 * 1024; + + auto_size_ctl.min_clean_fraction = 0.25; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 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 = 1.0; /* disable size increment */ + + 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; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 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 14.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 13.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 40.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 41.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C_incr__off; + auto_size_ctl.incr_mode = H5C_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; + + auto_size_ctl.decr_mode = H5C_decr__threshold; auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 0.5; + auto_size_ctl.decrement = 1.0; /* disable size decrement */ - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 10; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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 6.\n"; + failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 14.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 42.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 43.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + 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 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + 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 * 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 16.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 44.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 45.\n"; + } + } + + 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); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* check_auto_cache_resize_disable() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_epoch_markers() + * + * Purpose: Verify that the auto-resize code manages epoch markers + * correctly. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_auto_cache_resize_epoch_markers(void) +{ + const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t j; + int32_t checkpoint = 0; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize epoch marker management"); + + pass = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + reset_entries(); + + cache_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + } + + 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 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* Now make sure that we are managing the epoch markers correctly. + */ + + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 2.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Since we just created the cache, there should be no epoch markers + * active. Verify that this is true. + */ + + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 1.\n"; + } + } + + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 0.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + if ( pass ) { + + j = 2; + while ( ( pass ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 2) * 1000; + while ( ( pass ) && ( i < (j - 1) * 1000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 2.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* we now have a full complement of epoch markers -- see if + * we get the expected reduction. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass ) && ( i < 10000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != + ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || + ( cache_ptr->index_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now reduce the epochs before eviction, and see if the cache + * deletes the extra markers + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 3.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 3.\n"; + } + } + + /* Now do an epochs worth of accesses, and verify that everything + * not accessed in this epoch gets evicted, and the cache size + * is reduced. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass ) && ( i < 10000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present... + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 4.\n"; + } + } + + /* shift the decrement mode to threshold, and verify that we remove + * all epoch markers. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 4.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 3.\n"; + } + } + + /* ... and now there should be none. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* shift the decrement mode to age out with threshold. Set epochs + * before eviction to 10 again. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 5.\n"; + } + } + + /* Verify that there are no active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* build up a full set of epoch markers. */ + if ( pass ) { + + j = 1; + while ( ( pass ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 1) * 1000; + while ( ( pass ) && ( i < j * 1000 ) ) + { + protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 7.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Verify that there are now 10 active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 10 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 8.\n"; + } + } + + /* shift the decrement mode to off. This should cause all epoch + * markers to be removed. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 6.\n"; + } + } + + /* Verify that there are now no active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* verify that we still have the expected number of entries in the cache, + * and that the cache is of the expected size. + */ + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| + ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || + ( cache_ptr->index_len != 10000 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 3.\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(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* check_auto_cache_resize_epoch_markers() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_input_errs() + * + * Purpose: Verify that H5C_set_cache_auto_resize_config() detects + * and rejects invalid input. + * + * Return: void + * + * Programmer: John Mainzer + * 10/29/04 + * + * Modifications: + * + * Added code to verify that errors in the flash cache size + * increment related fields are caught as well. + * + * JRM -- 1/17/08 + * + *------------------------------------------------------------------------- + */ + +#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ +( ( (a).version == (b).version ) && \ + ( (a).rpt_fcn == (b).rpt_fcn ) && \ + ( ( ! compare_init ) || \ + ( (a).set_initial_size == (b).set_initial_size ) ) && \ + ( ( ! compare_init ) || \ + ( (a).initial_size == (b).initial_size ) ) && \ + ( (a).min_clean_fraction == (b).min_clean_fraction ) && \ + ( (a).max_size == (b).max_size ) && \ + ( (a).min_size == (b).min_size ) && \ + ( (a).epoch_length == (b).epoch_length ) && \ + ( (a).incr_mode == (b).incr_mode ) && \ + ( (a).lower_hr_threshold == (b).lower_hr_threshold ) && \ + ( (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 ) && \ + ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ + ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ + ( (a).empty_reserve == (b).empty_reserve ) ) + +static void +check_auto_cache_resize_input_errs(void) +{ + const char * fcn_name = "check_auto_cache_resize_input_errs()"; + herr_t result; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t ref_auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + H5C_auto_size_ctl_t invalid_auto_size_ctl; + H5C_auto_size_ctl_t test_auto_size_ctl; + + TESTING("automatic cache resize input errors"); + + pass = TRUE; + + /* allocate a cache, and set a reference automatic cache control + * configuration. Then feed H5C_set_cache_auto_resize_config() + * invalid input, and verify that the correct error is returned, + * and that the configuration is not modified. + */ + + if ( pass ) { + + reset_entries(); + + cache_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &ref_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\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 1."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 1."; + } + } + + 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.5; + + 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.7; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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(NULL, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted NULL cache_ptr.\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 2."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 2."; + } + } + + + /* check bad version rejection. */ + + if ( pass ) { + + invalid_auto_size_ctl.version = -1; /* INVALID */ + 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.5; + + 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.7; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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 version.\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 3."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 3."; + } + } + + + /* check bad initial size 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 = 16 * 1024 * 1024 + 1; + /* INVALID */ + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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 init size 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 4."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 4."; } } - /* Verify that there are now no active epoch markers. - */ if ( pass ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 9.\n"; - } - } + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1; + /* INVALID */ - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.min_clean_fraction = 0.5; - /* verify that we still have the expected number of entries in the cache, - * and that the cache is of the expected size. - */ - if ( pass ) { + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| - ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || - ( cache_ptr->index_len != 10000 ) ) { + invalid_auto_size_ctl.epoch_length = 5000; - pass = FALSE; - failure_mssg = "Unexpected cache size change results 3.\n"; - } - } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - if ( pass ) { + invalid_auto_size_ctl.lower_hr_threshold = 0.75; - takedown_cache(cache_ptr, FALSE, FALSE); - } + invalid_auto_size_ctl.increment = 2.0; - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + 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; - if ( ! pass ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); - } + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; - return; + invalid_auto_size_ctl.upper_hr_threshold = 0.999; -} /* check_auto_cache_resize_epoch_markers() */ + invalid_auto_size_ctl.decrement = 0.5; - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_input_errs() - * - * Purpose: Verify that H5C_set_cache_auto_resize_config() detects - * and rejects invalid input. - * - * Return: void - * - * Programmer: John Mainzer - * 10/29/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); -#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ -( ( (a).version == (b).version ) && \ - ( (a).rpt_fcn == (b).rpt_fcn ) && \ - ( ( ! compare_init ) || \ - ( (a).set_initial_size == (b).set_initial_size ) ) && \ - ( ( ! compare_init ) || \ - ( (a).initial_size == (b).initial_size ) ) && \ - ( (a).min_clean_fraction == (b).min_clean_fraction ) && \ - ( (a).max_size == (b).max_size ) && \ - ( (a).min_size == (b).min_size ) && \ - ( (a).epoch_length == (b).epoch_length ) && \ - ( (a).incr_mode == (b).incr_mode ) && \ - ( (a).lower_hr_threshold == (b).lower_hr_threshold ) && \ - ( (a).increment == (b).increment ) && \ - ( (a).apply_max_increment == (b).apply_max_increment ) && \ - ( (a).max_increment == (b).max_increment ) && \ - ( (a).decr_mode == (b).decr_mode ) && \ - ( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \ - ( (a).decrement == (b).decrement ) && \ - ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ - ( (a).max_decrement == (b).max_decrement ) && \ - ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ - ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ - ( (a).empty_reserve == (b).empty_reserve ) ) + invalid_auto_size_ctl.epochs_before_eviction = 3; -static void -check_auto_cache_resize_input_errs(void) -{ - const char * fcn_name = "check_auto_cache_resize_input_errs()"; - herr_t result; - H5C_t * cache_ptr = NULL; - H5C_auto_size_ctl_t ref_auto_size_ctl = - { - /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, - /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); - /* double min_clean_fraction = */ 0.5, + if ( result != FAIL ) { - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad init size 2.\n"; + } + } - /* int64_t epoch_length = */ 1000, + if ( pass ) { + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); - /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + if ( result != SUCCEED ) { - /* double lower_hr_threshold = */ 0.75, + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 5."; - /* double increment = */ 2.0, + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), + pass = FALSE; + failure_mssg = "Unexpected auto resize config 5."; + } + } - /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + /* test for invalid min clean fraction rejection. */ - /* double upper_hr_threshold = */ 0.995, + if ( pass ) { - /* double decrement = */ 0.1, + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - /* int32_t epochs_before_eviction = */ 3, + invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - H5C_auto_size_ctl_t invalid_auto_size_ctl; - H5C_auto_size_ctl_t test_auto_size_ctl; + invalid_auto_size_ctl.epoch_length = 5000; - TESTING("automatic cache resize input errors"); - pass = TRUE; + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - /* allocate a cache, and set a reference automatic cache control - * configuration. Then feed H5C_set_cache_auto_resize_config() - * invalid input, and verify that the correct error is returned, - * and that the configuration is not modified. - */ + invalid_auto_size_ctl.lower_hr_threshold = 0.75; - if ( pass ) { + invalid_auto_size_ctl.increment = 2.0; - reset_entries(); + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - cache_ptr = setup_cache((size_t)(2 * 1024), - (size_t)(1 * 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; - if ( pass ) { - result = H5C_set_cache_auto_resize_config(cache_ptr, - &ref_auto_size_ctl); + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; - if ( result != SUCCEED ) { + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - pass = FALSE; - failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; - } - } + invalid_auto_size_ctl.decrement = 0.5; - if ( pass ) { + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 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 = "bad cache size after initialization.\n"; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; } } @@ -23818,13 +25634,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 1."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 6."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 1."; + failure_mssg = "Unexpected auto resize config 6."; } } @@ -23836,7 +25652,7 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = -0.00001; /* INVALID */ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; @@ -23846,13 +25662,17 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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__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; @@ -23868,14 +25688,14 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.apply_empty_reserve = TRUE; invalid_auto_size_ctl.empty_reserve = 0.05; - result = H5C_set_cache_auto_resize_config(NULL, + 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 NULL cache_ptr.\n"; + "H5C_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; } } @@ -23887,22 +25707,22 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 2."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 7."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 2."; + failure_mssg = "Unexpected auto resize config 7."; } } - /* check bad version rejection. */ + /* test for invalid max_size and/or min_size rejection */ if ( pass ) { - invalid_auto_size_ctl.version = -1; /* INVALID */ + 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; @@ -23910,7 +25730,8 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.min_clean_fraction = 0.5; - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.max_size = H5C__MAX_MAX_CACHE_SIZE + 1; + /* INVALID */ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; invalid_auto_size_ctl.epoch_length = 5000; @@ -23918,13 +25739,17 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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__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; @@ -23947,7 +25772,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad version.\n"; + "H5C_set_cache_auto_resize_config accepted bad max_size.\n"; } } @@ -23959,32 +25784,28 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 3."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 8."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 3."; + failure_mssg = "Unexpected auto resize config 8."; } } - - /* check bad initial size 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 = 16 * 1024 * 1024 + 1; - /* INVALID */ + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; invalid_auto_size_ctl.min_clean_fraction = 0.5; - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ invalid_auto_size_ctl.epoch_length = 5000; @@ -23998,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; @@ -24020,7 +25845,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad init size 1.\n"; + "H5C_set_cache_auto_resize_config accepted bad size pair.\n"; } } @@ -24032,13 +25857,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 4."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 9."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 4."; + failure_mssg = "Unexpected auto resize config 9."; } } @@ -24047,15 +25872,14 @@ check_auto_cache_resize_input_errs(void) 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 = 1 * 1024 * 1024 - 1; - /* INVALID */ + 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.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - + invalid_auto_size_ctl.min_size = H5C__MIN_MAX_CACHE_SIZE - 1; + /* INVALID */ invalid_auto_size_ctl.epoch_length = 5000; @@ -24068,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; @@ -24090,7 +25918,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad init size 2.\n"; + "H5C_set_cache_auto_resize_config accepted bad min_size.\n"; } } @@ -24102,18 +25930,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 5."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 10."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 5."; + failure_mssg = "Unexpected auto resize config 10."; } } - /* test for invalid min clean fraction rejection. */ + /* test for invalid epoch_length rejection */ if ( pass ) { @@ -24123,13 +25951,13 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.set_initial_size = TRUE; invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ + 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.epoch_length = H5C__MAX_AR_EPOCH_LENGTH + 1; + /* INVALID */ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; @@ -24140,12 +25968,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24162,7 +25994,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; + "H5C_set_cache_auto_resize_config accepted bad epoch len 1.\n"; } } @@ -24174,13 +26006,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 6."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 11."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 6."; + failure_mssg = "Unexpected auto resize config 11."; } } @@ -24192,13 +26024,13 @@ check_auto_cache_resize_input_errs(void) 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.00001; /* INVALID */ + 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.epoch_length = H5C__MIN_AR_EPOCH_LENGTH - 1; + /* INVALID */ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; @@ -24209,12 +26041,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24231,7 +26067,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; + "H5C_set_cache_auto_resize_config accepted bad epoch len 2.\n"; } } @@ -24243,18 +26079,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 7."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 12."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 7."; + failure_mssg = "Unexpected auto resize config 12."; } } - /* test for invalid max_size and/or min_size rejection */ + /* test for bad incr_mode rejection */ if ( pass ) { @@ -24264,16 +26100,16 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = 0.1; - invalid_auto_size_ctl.max_size = H5C__MAX_MAX_CACHE_SIZE + 1; - /* INVALID */ + 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.incr_mode = + (enum H5C_cache_incr_mode) -1; /* INVALID */ invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -24282,12 +26118,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24304,7 +26144,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad max_size.\n"; + "H5C_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; } } @@ -24316,13 +26156,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 8."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 13."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 8."; + failure_mssg = "Unexpected auto resize config 13."; } } @@ -24334,15 +26174,16 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = 0.1; - invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ + 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.incr_mode = + (enum H5C_cache_incr_mode) 2; /* INVALID */ invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -24351,12 +26192,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24373,7 +26218,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad size pair.\n"; + "H5C_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; } } @@ -24385,16 +26230,19 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 9."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 14."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 9."; + failure_mssg = "Unexpected auto resize config 14."; } } + + /* check for bad upper and/or lower threshold rejection */ + if ( pass ) { invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -24406,24 +26254,28 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = H5C__MIN_MAX_CACHE_SIZE - 1; - /* INVALID */ + 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.lower_hr_threshold = 0.7; 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__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; - invalid_auto_size_ctl.upper_hr_threshold = 0.999; + invalid_auto_size_ctl.upper_hr_threshold = 1.01; /* INVALID */ invalid_auto_size_ctl.decrement = 0.5; @@ -24442,7 +26294,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad min_size.\n"; + "H5C_set_cache_auto_resize_config accepted bad upper threshold.\n"; } } @@ -24454,19 +26306,16 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 10."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 15."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 10."; + failure_mssg = "Unexpected auto resize config 15."; } } - - /* test for invalid epoch_length rejection */ - if ( pass ) { invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -24475,29 +26324,33 @@ check_auto_cache_resize_input_errs(void) 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.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - invalid_auto_size_ctl.epoch_length = H5C__MAX_AR_EPOCH_LENGTH + 1; - /* INVALID */ + 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.lower_hr_threshold = 0.8; /* INVALID */ 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__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; - invalid_auto_size_ctl.upper_hr_threshold = 0.999; + invalid_auto_size_ctl.upper_hr_threshold = 0.7; /* INVALID */ - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24514,7 +26367,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad epoch len 1.\n"; + "H5C_set_cache_auto_resize_config accepted bad threshold pair.\n"; } } @@ -24526,13 +26379,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 11."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 16."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 11."; + failure_mssg = "Unexpected auto resize config 16."; } } @@ -24544,29 +26397,33 @@ check_auto_cache_resize_input_errs(void) 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.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - invalid_auto_size_ctl.epoch_length = H5C__MIN_AR_EPOCH_LENGTH - 1; - /* INVALID */ + 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.lower_hr_threshold = -0.0001; /* INVALID */ 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__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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24583,7 +26440,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad epoch len 2.\n"; + "H5C_set_cache_auto_resize_config accepted bad lower threshold.\n"; } } @@ -24595,18 +26452,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 12."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 17."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 12."; + failure_mssg = "Unexpected auto resize config 17."; } } - /* test for bad incr_mode rejection */ + /* test for bad increment rejection */ if ( pass ) { @@ -24624,22 +26481,25 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.epoch_length = 5000; - invalid_auto_size_ctl.incr_mode = - (enum H5C_cache_incr_mode) -1; /* INVALID */ + 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.increment = 0.99999; /* INVALID */ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24649,6 +26509,7 @@ check_auto_cache_resize_input_errs(void) 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); @@ -24656,7 +26517,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; + "H5C_set_cache_auto_resize_config accepted bad increment.\n"; } } @@ -24668,16 +26529,19 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 13."; + failure_mssg = "H5C_get_cache_auto_resize_config failed 18."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass = FALSE; - failure_mssg = "Unexpected auto resize config 13."; + failure_mssg = "Unexpected auto resize config 18."; } } + + /* test for bad flash_incr_mode rejection */ + if ( pass ) { invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -24694,8 +26558,7 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.epoch_length = 5000; - invalid_auto_size_ctl.incr_mode = - (enum H5C_cache_incr_mode) 2; /* INVALID */ + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -24704,6 +26567,11 @@ 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 = + (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; @@ -24726,7 +26594,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; + "H5C_set_cache_auto_resize_config accepted bad flash_incr_mode.\n"; } } @@ -24738,18 +26606,17 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 14."; + 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 14."; + failure_mssg = "Unexpected auto resize config 19."; } } - - /* check for bad upper and/or lower threshold rejection */ + /* test for bad flash_multiple rejection */ if ( pass ) { @@ -24759,7 +26626,7 @@ check_auto_cache_resize_input_errs(void) 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.5; + 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; @@ -24769,19 +26636,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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 = 1.01; /* INVALID */ + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24798,7 +26670,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad upper threshold.\n"; + "H5C_set_cache_auto_resize_config accepted bad flash_multiple(1).\n"; } } @@ -24810,13 +26682,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 15."; + 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 15."; + failure_mssg = "Unexpected auto resize config 20."; } } @@ -24828,7 +26700,7 @@ check_auto_cache_resize_input_errs(void) 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.5; + 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; @@ -24838,19 +26710,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.8; /* INVALID */ + 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.7; /* INVALID */ + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24867,7 +26744,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad threshold pair.\n"; + "H5C_set_cache_auto_resize_config accepted bad flash_multiple(2).\n"; } } @@ -24879,16 +26756,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 16."; + 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 16."; + 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; @@ -24897,7 +26776,7 @@ check_auto_cache_resize_input_errs(void) 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.5; + 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; @@ -24907,19 +26786,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = -0.0001; /* INVALID */ + 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.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24936,7 +26820,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad lower threshold.\n"; + "H5C_set_cache_auto_resize_config accepted bad flash_threshold(1).\n"; } } @@ -24948,19 +26832,16 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 17."; + 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 17."; + failure_mssg = "Unexpected auto resize config 22."; } } - - /* test for bad increment rejection */ - if ( pass ) { invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; @@ -24981,17 +26862,22 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.lower_hr_threshold = 0.75; - invalid_auto_size_ctl.increment = 0.99999; /* INVALID */ + 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.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25001,7 +26887,6 @@ check_auto_cache_resize_input_errs(void) 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); @@ -25009,7 +26894,7 @@ check_auto_cache_resize_input_errs(void) pass = FALSE; failure_mssg = - "H5C_set_cache_auto_resize_config accepted bad increment.\n"; + "H5C_set_cache_auto_resize_config accepted bad flash_threshold(2).\n"; } } @@ -25021,17 +26906,16 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass = FALSE; - failure_mssg = "H5C_get_cache_auto_resize_config failed 18."; + 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 18."; + 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,626 +20967,882 @@ 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 ) { - takedown_cache2(cache_ptr, FALSE, FALSE); + flush_cache2(cache_ptr, TRUE, FALSE, FALSE); + + reset_entries2(); } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + if ( pass2 ) { - if ( ! pass2 ) { + auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 64 * 1024; - return; + auto_size_ctl.min_clean_fraction = 0.5; -} /* check_auto_cache_resize() */ + auto_size_ctl.max_size = 1024 * 1024; + auto_size_ctl.min_size = 5 * 1024; - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_disable() - * - * Purpose: Test the various ways in which the resize code can - * be disabled. Unfortunately, there are quite a few of them. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ + auto_size_ctl.epoch_length = 100; -static void -check_auto_cache_resize_disable(void) -{ - const char * fcn_name = "check_auto_cache_resize_disable()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t checkpoint = 0; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), + auto_size_ctl.incr_mode = H5C2_incr__threshold; - /* double min_clean_fraction = */ 0.5, + auto_size_ctl.lower_hr_threshold = 0.75; - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), + auto_size_ctl.increment = 2.0; - /* int64_t epoch_length = */ 1000, + 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; - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.75, + auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - /* double increment = */ 2.0, + auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), + auto_size_ctl.decrement = 0.5; + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1000 * 1024); - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ - /* double upper_hr_threshold = */ 0.995, + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ - /* double decrement = */ 0.1, + result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), + if ( result != SUCCEED ) { - /* int32_t epochs_before_eviction = */ 3, + pass2 = FALSE; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n"; + } + } - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; + if ( pass2 ) { - TESTING("automatic cache resize disable"); + 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 = TRUE; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (0).\n"; + } + } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* allocate a cache, enable automatic cache resizing, and then force - * the cache through all its operational modes. Verify that all - * performs as expected. - */ - + /* Load a huge entry into the cache */ if ( pass2 ) { - reset_entries2(); + protect_entry2(cache_ptr, HUGE_ENTRY_TYPE, 0); - cache_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); + 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 ) { - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( result != SUCCEED ) { + 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 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } + 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 ) { - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + 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 = "bad cache size after initialization.\n"; - } + failure_mssg2 = "Unexpected cache config (3).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /****************************************************************** - * So far, we have forced the auto cache resize through all modes - * other than increase_disabled and decrease_disabled. Force these - * modes now. Note that there are several ways we can reach these - * modes. - ******************************************************************/ - + /* Load a third moster entry. Should be no cache size increase this + * time. + */ 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 * 1024; + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2); - auto_size_ctl.min_clean_fraction = 0.5; + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2, + NO_CHANGE, H5C2__NO_FLAGS_SET); - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + 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 ) ) ) ) { - auto_size_ctl.epoch_length = 1000; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (4).\n"; + } + } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.incr_mode = H5C2_incr__threshold; + /* delete existing entries to prepare for next test, and reset + * the size of the cache. + */ + if ( pass2 ) { - auto_size_ctl.lower_hr_threshold = 0.75; + expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 1); + expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 2); - auto_size_ctl.increment = 1.0; /* disable size increases */ + if ( pass2 ) { - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + result = H5C2_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + if ( result != SUCCEED ) { - auto_size_ctl.decr_mode = H5C2_decr__threshold; + pass2 = FALSE; + failure_mssg2 = + "H5C2_set_cache_auto_resize_config failed 13.\n"; + } + } - auto_size_ctl.upper_hr_threshold = 0.995; + 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 ) ) ) ) { - auto_size_ctl.decrement = 0.5; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (5).\n"; + } + } - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + /* repeat the above basic test, only this time, use inserts to add + * entries to the cache, not protects. + */ - auto_size_ctl.epochs_before_eviction = 3; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + /* insert a huge entry into the cache */ + if ( pass2 ) { - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + 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 ( result != SUCCEED ) { + 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 = "H5C2_set_cache_auto_resize_config failed 2.\n"; - } + 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 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 1.\n"; - } + failure_mssg2 = "Unexpected cache config (7).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. + /* Insert a second monster entry. Cache size should increase again. */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + insert_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, + H5C2__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size change results 1.\n"; - } + failure_mssg2 = "Unexpected cache config (8).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. + /* Insert a third monster entry. Should be no cache size increase this + * time. */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6, + NO_CHANGE, H5C2__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 2.\n"; - } + failure_mssg2 = "Unexpected cache config (9).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 5); + expunge_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 6); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + 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); - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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); - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 3.\n"; - } - } + 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); - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + 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); - /* Repeat the above tests, disabling increase through the lower - * threshold instead of the increment. - */ + flush_cache2(cache_ptr, TRUE, FALSE, FALSE); - if ( pass2 ) { - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + if ( pass2 ) { - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; + auto_size_ctl.initial_size = 6 * 1024; + result = H5C2_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); - auto_size_ctl.min_clean_fraction = 0.5; + if ( result != SUCCEED ) { - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + pass2 = FALSE; + failure_mssg2 = + "H5C2_set_cache_auto_resize_config failed 13.\n"; + } + } - auto_size_ctl.epoch_length = 1000; + 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"; + } + } - auto_size_ctl.incr_mode = H5C2_incr__threshold; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + /* Now load the variable entries into the cache */ + if ( pass2 ) { - auto_size_ctl.increment = 2.0; + protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C2__NO_FLAGS_SET); - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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); - auto_size_ctl.decr_mode = H5C2_decr__threshold; + protect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13); + unprotect_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE, + H5C2__NO_FLAGS_SET); - auto_size_ctl.upper_hr_threshold = 0.995; + 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 ) ) ) ) { - auto_size_ctl.decrement = 0.5; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (11).\n"; + } + } - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.epochs_before_eviction = 3; + /* protect a variable entry, and re-size it to 3K. Should be + * no effect on the size of the cache. + */ + if ( pass2 ) { - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + 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); - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - if ( result != SUCCEED ) { + 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 = "H5C2_set_cache_auto_resize_config failed 3.\n"; - } + 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 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 2.\n"; - } + failure_mssg2 = "Unexpected cache config (13).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. + /* protect a second variable entry, and re-size it to 10K. Should + * resize to 22 KB. */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + 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 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 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 size change results 4.\n"; - } + failure_mssg2 = "Unexpected cache config (14).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. + /* protect a third variable entry, and re-size it to 10K. Should + * be no change in cache size. */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + 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 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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 size change results 5.\n"; - } + failure_mssg2 = "Unexpected cache config (15).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + 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 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; + 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 ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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 != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 6.\n"; - } + failure_mssg2 = "Unexpected cache config (16).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests yet again, disabling increase through the - * incr_mode. + /* Now test flash cache resizes with pinned entries... */ - 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; + 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); - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 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 ) ) ) ) { - auto_size_ctl.epoch_length = 1000; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (17).\n"; + } + } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.incr_mode = H5C2_incr__off; + if ( pass2 ) { - auto_size_ctl.lower_hr_threshold = 0.75; + resize_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); - auto_size_ctl.increment = 2.0; + 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 ) ) ) ) { - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (18).\n"; + } + } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.decr_mode = H5C2_decr__threshold; + if ( pass2 ) { - auto_size_ctl.upper_hr_threshold = 0.995; + 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); - auto_size_ctl.decrement = 0.5; + 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 ) ) ) ) { - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); + pass2 = FALSE; + failure_mssg2 = "Unexpected cache config (19).\n"; + } + } - auto_size_ctl.epochs_before_eviction = 3; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + if ( pass2 ) { - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + 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 ( result != SUCCEED ) { + 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 = "H5C2_set_cache_auto_resize_config failed 4.\n"; - } + 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 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 3.\n"; - } + failure_mssg2 = "Unexpected cache config (21).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. + /* 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 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + 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 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; + 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 ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 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 != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 7.\n"; - } + failure_mssg2 = "Unexpected cache config (22).\n"; + } } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. - */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + 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 ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 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 size change results 8.\n"; - } + failure_mssg2 = "Unexpected cache config (23).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ if ( pass2 ) { - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + resize_pinned_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + 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 ) ) ) ) { - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + 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 size change results 9.\n"; - } + failure_mssg2 = "Unexpected cache config (25).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now, disable size decreases, and repeat the above tests. + 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 * 1024; + auto_size_ctl.initial_size = 4 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.max_size = 20 * 1024; + auto_size_ctl.min_size = 4 * 1024; - auto_size_ctl.epoch_length = 1000; + auto_size_ctl.epoch_length = 100; auto_size_ctl.incr_mode = H5C2_incr__threshold; @@ -21541,29 +21852,33 @@ check_auto_cache_resize_disable(void) auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__threshold; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - auto_size_ctl.decrement = 1.0; /* disable size decreases */ + 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 * 1024 * 1024); + auto_size_ctl.max_decrement = (2 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; + 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 5.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 15.\n"; } } @@ -21571,172 +21886,103 @@ check_auto_cache_resize_disable(void) if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size after set resize re-config 4.\n"; + failure_mssg2 = "bad cache after initialization 15.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be decrease_disabled. + /* 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; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + H5C2__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 size change results 10.\n"; - } + failure_mssg2 = "Unexpected cache config (29).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* 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; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, + H5C2__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 11.\n"; - } + failure_mssg2 = "Unexpected cache config (30).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate again -- should be no change in cache size, - * and result should be decrease_disabled. + /* protect and unprotect two more large entries -- shouldnt trigger a + * flash cache size increase. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 12.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Repeat the above tests, disabling decrease through the upper - * threshold instead of the decrement. - */ - - 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 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 * 1024); - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 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 6.\n"; - } - } - - if ( pass2 ) { + 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 ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + 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 = "bad cache size after set resize re-config 5.\n"; - } + failure_mssg2 = "Unexpected cache config (31).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. + /* do many accesses of a single entry to talk the cache into reducing + * its size to the minimum. */ if ( pass2 ) { @@ -21744,95 +21990,231 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, TINY_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, TINY_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( 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 size change results 13.\n"; + failure_mssg2 = "Unexpected cache config (32).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ + /* Force another flash increase */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } + protect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry2(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + H5C2__NO_FLAGS_SET); - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 14.\n"; - } + failure_mssg2 = "Unexpected cache config (33).\n"; + } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. - */ + /* force regular size increase up to maximum */ if ( pass2 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) + while ( ( pass2 ) && ( i < 500 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, TINY_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, TINY_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + 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 size change results 15.\n"; + failure_mssg2 = "Unexpected cache config (34).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Repeat the above tests, disabling decrease through the decr_mode. - */ if ( pass2 ) { - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + takedown_cache2(cache_ptr, FALSE, FALSE); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass2 ) { + + HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", + fcn_name, failure_mssg2); + } + + return; + +} /* check_auto_cache_resize() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_disable() + * + * Purpose: Test the various ways in which the resize code can + * be disabled. Unfortunately, there are quite a few of them. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + * Added code to include the flash cache size increment + * code in this test. + * JRM -- 1/10/08 + * + *------------------------------------------------------------------------- + */ + +static void +check_auto_cache_resize_disable(void) +{ + const char * fcn_name = "check_auto_cache_resize_disable()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t checkpoint = 0; + H5C2_t * cache_ptr = NULL; + H5C2_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, + /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize disable"); + + pass2 = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* allocate a cache, enable automatic cache resizing, and then force + * the cache through all its operational modes. Verify that all + * performs as expected. + */ + + if ( pass2 ) { + + reset_entries2(); + + cache_ptr = setup_cache2((size_t)(2 * 1024), + (size_t)(1 * 1024)); + } + + 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 1.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /****************************************************************** + * So far, we have forced the auto cache resize through all modes + * other than increase_disabled and decrease_disabled. Force these + * modes now. Note that there are several ways we can reach these + * modes. + ******************************************************************/ + + 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 * 1024; @@ -21849,19 +22231,23 @@ check_auto_cache_resize_disable(void) auto_size_ctl.lower_hr_threshold = 0.75; - auto_size_ctl.increment = 2.0; + auto_size_ctl.increment = 1.0; /* disable size increases */ - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__off; + + 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 = TRUE; + auto_size_ctl.apply_max_decrement = FALSE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); auto_size_ctl.epochs_before_eviction = 3; @@ -21874,7 +22260,7 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 7.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 2.\n"; } } @@ -21884,14 +22270,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 6.\n"; + failure_mssg2 = "bad cache size after set resize re-config 1.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass2 ) { @@ -21899,29 +22285,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 16.\n"; + failure_mssg2 = "Unexpected cache size change results 1.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass2 ) { @@ -21929,29 +22316,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 17.\n"; + failure_mssg2 = "Unexpected cache size change results 2.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass2 ) { @@ -21959,31 +22346,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 18.\n"; + failure_mssg2 = "Unexpected cache size change results 3.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now do tests disabling size decrement in age out mode. - * - * Start by disabling size decrement by setting max_decrement to zero. + /* Repeat the above tests, disabling increase through the lower + * threshold instead of the increment. */ if ( pass2 ) { @@ -22004,24 +22390,27 @@ check_auto_cache_resize_disable(void) auto_size_ctl.incr_mode = H5C2_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ auto_size_ctl.increment = 2.0; - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); + 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__age_out; - auto_size_ctl.upper_hr_threshold = 0.995; + 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 = TRUE; - auto_size_ctl.max_decrement = 0; /* disable decrement */ + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -22031,7 +22420,7 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 8.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 3.\n"; } } @@ -22041,19 +22430,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 7.\n"; + failure_mssg2 = "bad cache size after set resize re-config 2.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. */ if ( pass2 ) { @@ -22061,91 +22445,60 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 19.\n"; + failure_mssg2 = "Unexpected cache size change results 4.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Load up some more small entries. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 20.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 21.\n"; + failure_mssg2 = "Unexpected cache size change results 5.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass2 ) { @@ -22163,51 +22516,20 @@ check_auto_cache_resize_disable(void) } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 22.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 23.\n"; + failure_mssg2 = "Unexpected cache size change results 6.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now disable size decrement in age out mode via the empty reserve. + /* Repeat the above tests yet again, disabling increase through the + * incr_mode. */ if ( pass2 ) { @@ -22226,36 +22548,40 @@ check_auto_cache_resize_disable(void) auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__threshold; + auto_size_ctl.incr_mode = H5C2_incr__off; 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 * 1024); + 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__age_out; + + 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 = TRUE; + auto_size_ctl.apply_max_decrement = FALSE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ + 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 9.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 4.\n"; } } @@ -22265,19 +22591,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 8.\n"; + failure_mssg2 = "bad cache size after set resize re-config 3.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. */ if ( pass2 ) { @@ -22285,61 +22606,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 24.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 25.\n"; + failure_mssg2 = "Unexpected cache size change results 7.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. */ if ( pass2 ) { @@ -22347,29 +22637,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 26.\n"; + failure_mssg2 = "Unexpected cache size change results 8.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- cache size should increase from 4 to 6 Meg. + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. */ if ( pass2 ) { @@ -22387,58 +22677,19 @@ check_auto_cache_resize_disable(void) } if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 27.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 28.\n"; + failure_mssg2 = "Unexpected cache size change results 9.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now work with age out with threshold. One can argue that we should - * repeat the above age out tests with age out with threshold, but the - * same code is executed in both cases so I don't see the point. If - * that ever changes, this test should be updated. - * - * There is only one way of disabling decrements that is peculiar - * to age out with threshold, which is to set the upper threshold - * to 1.0. Test this now. + /* Now, disable size decreases, and repeat the above tests. */ if ( pass2 ) { @@ -22466,17 +22717,21 @@ 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; - auto_size_ctl.upper_hr_threshold = 1.0; + auto_size_ctl.decr_mode = H5C2_decr__threshold; - auto_size_ctl.decrement = 0.5; + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 1.0; /* disable size decreases */ auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -22486,29 +22741,26 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 10.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 5.\n"; } } + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + if ( pass2 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 9.\n"; + failure_mssg2 = "bad cache size after set resize re-config 4.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. + /* force high hit rate -- should be no change in cache size, + * and result should be decrease_disabled. */ if ( pass2 ) { @@ -22516,89 +22768,22 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 29.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 30.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible, but the upper threshold cannot be met, so no decrease. - * - * rpt_status should be decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || ( rpt_status != decrease_disabled ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || - ( cache_ptr->index_len != 2000 ) || - ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 31.\n"; + failure_mssg2 = "Unexpected cache size change results 10.\n"; } } @@ -22627,18 +22812,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 32.\n"; + failure_mssg2 = "Unexpected cache size change results 11.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* just bang on a single entry. This keeps the hit rate high, and sees - * to it that there are many entries that could be aged out were - * decreases enabled. - * - * Should be no change in cache size, and result should be - * decrease_disabled. + /* force high hit rate again -- should be no change in cache size, + * and result should be decrease_disabled. */ if ( pass2 ) { @@ -22646,35 +22827,30 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 999); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 999, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || ( rpt_status != decrease_disabled ) || ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 33.\n"; + failure_mssg2 = "Unexpected cache size change results 12.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /********************************************************************* - * Finally, use the auto cache resize code to set the size of the - * cache and keep it there. Again, due to the complexity of the - * interface, there are lots of ways of doing this. We have to - * check them all. - *********************************************************************/ + /* Repeat the above tests, disabling decrease through the upper + * threshold instead of the decrement. + */ if ( pass2 ) { @@ -22682,25 +22858,29 @@ check_auto_cache_resize_disable(void) auto_size_ctl.rpt_fcn = test_rpt_fcn; auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; auto_size_ctl.incr_mode = H5C2_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + 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 * 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; @@ -22721,24 +22901,54 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 11.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 6.\n"; } } if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 10.\n"; + failure_mssg2 = "bad cache size after set resize re-config 5.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 13.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass2 ) { @@ -22755,22 +22965,20 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 34.\n"; + failure_mssg2 = "Unexpected cache size change results 14.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. */ if ( pass2 ) { @@ -22787,20 +22995,22 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 35.\n"; + failure_mssg2 = "Unexpected cache size change results 15.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Repeat the above tests, disabling decrease through the decr_mode. + */ + if ( pass2 ) { auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; @@ -22809,10 +23019,10 @@ check_auto_cache_resize_disable(void) auto_size_ctl.set_initial_size = TRUE; auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.25; + auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; @@ -22821,17 +23031,21 @@ check_auto_cache_resize_disable(void) auto_size_ctl.lower_hr_threshold = 0.75; - auto_size_ctl.increment = 1.0; /* disable size increment */ + auto_size_ctl.increment = 2.0; 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; + + auto_size_ctl.decr_mode = H5C2_decr__off; auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 1.0; /* disable size decrement */ + auto_size_ctl.decrement = 0.5; auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -22846,24 +23060,24 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 7.\n"; } } if ( pass2 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 11.\n"; + failure_mssg2 = "bad cache size after set resize re-config 6.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. */ if ( pass2 ) { @@ -22871,31 +23085,29 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 36.\n"; + failure_mssg2 = "Unexpected cache size change results 16.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass2 ) { @@ -22903,41 +23115,75 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 37.\n"; + failure_mssg2 = "Unexpected cache size change results 17.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. + */ if ( pass2 ) { - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); - auto_size_ctl.set_initial_size = FALSE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } - auto_size_ctl.min_clean_fraction = 0.5; + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ - auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 18.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now do tests disabling size decrement in age out mode. + * + * Start by disabling size decrement by setting max_decrement to zero. + */ + + 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 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; @@ -22951,17 +23197,21 @@ 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; + + auto_size_ctl.decr_mode = H5C2_decr__age_out; 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 * 1024); + auto_size_ctl.max_decrement = 0; /* disable decrement */ - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; auto_size_ctl.apply_empty_reserve = TRUE; auto_size_ctl.empty_reserve = 0.05; @@ -22971,24 +23221,29 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 13.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 8.\n"; } } if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 12.\n"; + failure_mssg2 = "bad cache size after set resize re-config 7.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache2(cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. */ if ( pass2 ) { @@ -22996,124 +23251,91 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 38.\n"; + failure_mssg2 = "Unexpected cache size change results 19.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Load up some more small entries. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) + i = 1000; + while ( ( pass2 ) && ( i < 2000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 39.\n"; + failure_mssg2 = "Unexpected cache size change results 20.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. + */ 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 * 1024; - - auto_size_ctl.min_clean_fraction = 0.25; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 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 = 1.0; /* disable size increment */ - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 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 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 14.\n"; + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; } - } - - if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 13.\n"; + failure_mssg2 = "Unexpected cache size change results 21.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ if ( pass2 ) { @@ -23130,22 +23352,22 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 40.\n"; + failure_mssg2 = "Unexpected cache size change results 22.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. */ if ( pass2 ) { @@ -23162,20 +23384,22 @@ check_auto_cache_resize_disable(void) i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 41.\n"; + failure_mssg2 = "Unexpected cache size change results 23.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now disable size decrement in age out mode via the empty reserve. + */ + if ( pass2 ) { auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; @@ -23187,42 +23411,45 @@ check_auto_cache_resize_disable(void) auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; auto_size_ctl.incr_mode = H5C2_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ + 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 * 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.decr_mode = H5C2_decr__age_out; auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 1.0; /* disable size decrement */ + auto_size_ctl.decrement = 0.5; auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - + auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ 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"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 9.\n"; } } @@ -23232,14 +23459,19 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 14.\n"; + failure_mssg2 = "bad cache size after set resize re-config 8.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache2(cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. */ if ( pass2 ) { @@ -23247,65 +23479,166 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 42.\n"; + failure_mssg2 = "Unexpected cache size change results 24.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Load up some more small entries. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) + i = 1000; + while ( ( pass2 ) && ( i < 2000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 43.\n"; + failure_mssg2 = "Unexpected cache size change results 25.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. + */ if ( pass2 ) { - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 26.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 27.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 28.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now work with age out with threshold. One can argue that we should + * repeat the above age out tests with age out with threshold, but the + * same code is executed in both cases so I don't see the point. If + * that ever changes, this test should be updated. + * + * There is only one way of disabling decrements that is peculiar + * to age out with threshold, which is to set the upper threshold + * to 1.0. Test this now. + */ + + 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 * 1024; @@ -23313,12 +23646,12 @@ check_auto_cache_resize_disable(void) auto_size_ctl.min_clean_fraction = 0.5; auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + auto_size_ctl.incr_mode = H5C2_incr__threshold; auto_size_ctl.lower_hr_threshold = 0.75; @@ -23327,28 +23660,31 @@ 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; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; auto_size_ctl.decrement = 0.5; auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 3; + auto_size_ctl.epochs_before_eviction = 1; 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 16.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 10.\n"; } } @@ -23358,14 +23694,19 @@ check_auto_cache_resize_disable(void) ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 15.\n"; + failure_mssg2 = "bad cache size after set resize re-config 9.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache2(cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. */ if ( pass2 ) { @@ -23373,188 +23714,165 @@ check_auto_cache_resize_disable(void) i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 44.\n"; + failure_mssg2 = "Unexpected cache size change results 29.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. + /* Load up some more small entries. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) + i = 1000; + while ( ( pass2 ) && ( i < 2000 ) ) { - protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || + if ( ( ! rpt_fcn_called ) || ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 45.\n"; + failure_mssg2 = "Unexpected cache size change results 30.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible, but the upper threshold cannot be met, so no decrease. + * + * rpt_status should be decrease_disabled. + */ if ( pass2 ) { - takedown_cache2(cache_ptr, FALSE, FALSE); - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } - if ( ! pass2 ) { + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || + ( cache_ptr->index_len != 2000 ) || + ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 31.\n"; + } } - return; + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); -} /* check_auto_cache_resize_disable() */ + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass2 ) { - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_epoch_markers() - * - * Purpose: Verify that the auto-resize code manages epoch markers - * correctly. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); -static void -check_auto_cache_resize_epoch_markers(void) -{ - const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t j; - int32_t checkpoint = 0; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - /* double min_clean_fraction = */ 0.5, + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 32.\n"; + } + } - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* int64_t epoch_length = */ 1000, + /* just bang on a single entry. This keeps the hit rate high, and sees + * to it that there are many entries that could be aged out were + * decreases enabled. + * + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass2 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 999); - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("automatic cache resize epoch marker management"); - - pass2 = TRUE; - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - reset_entries2(); - - cache_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - } - - 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 1.\n"; + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 999, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; } - } - - if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; + failure_mssg2 = "Unexpected cache size change results 33.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Now make sure that we are managing the epoch markers correctly. - */ + /********************************************************************* + * Finally, use the auto cache resize code to set the size of the + * cache and keep it there. Again, due to the complexity of the + * interface, there are lots of ways of doing this. We have to + * check them all. + *********************************************************************/ if ( pass2 ) { @@ -23562,38 +23880,42 @@ check_auto_cache_resize_epoch_markers(void) auto_size_ctl.rpt_fcn = test_rpt_fcn; auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 2 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + auto_size_ctl.incr_mode = H5C2_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decr_mode = H5C2_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 10; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23601,172 +23923,128 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 2.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 11.\n"; } } if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 1.\n"; + failure_mssg2 = "bad cache size after set resize re-config 10.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Since we just created the cache, there should be no epoch markers - * active. Verify that this is true. + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. */ - - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 1.\n"; - } - } - if ( pass2 ) { rpt_fcn_called = FALSE; i = 0; while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); if ( pass2 ) { - unprotect_entry2(cache_ptr, MEDIUM_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 0.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - if ( pass2 ) { - - j = 2; - while ( ( pass2 ) && ( j <= 10 ) ) - { - - rpt_fcn_called = FALSE; - i = (j - 2) * 1000; - while ( ( pass2 ) && ( i < (j - 1) * 1000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 2.\n"; - } - - j++; + failure_mssg2 = "Unexpected cache size change results 34.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* we now have a full complement of epoch markers -- see if - * we get the expected reduction. + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass2 ) && ( i < 10000 ) ) + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != - ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || - ( cache_ptr->index_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 1.\n"; + failure_mssg2 = "Unexpected cache size change results 35.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* now reduce the epochs before eviction, and see if the cache - * deletes the extra markers - */ 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.5; + auto_size_ctl.min_clean_fraction = 0.25; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + 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.increment = 1.0; /* disable size increment */ auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; + + 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.decrement = 1.0; /* disable size decrement */ - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23774,103 +24052,114 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 3.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n"; } } if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 2.\n"; + failure_mssg2 = "bad cache size after set resize re-config 11.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* There should be exactly one active epoch marker at present. + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { - if ( cache_ptr->epoch_markers_active != 1 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 3.\n"; + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; } - } - /* Now do an epochs worth of accesses, and verify that everything - * not accessed in this epoch gets evicted, and the cache size - * is reduced. + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 36.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass2 ) && ( i < 10000 ) ) + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C2__NO_FLAGS_SET); } i++; } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 2.\n"; + failure_mssg2 = "Unexpected cache size change results 37.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* There should be exactly one active epoch marker at present... - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 1 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 4.\n"; - } - } - - /* shift the decrement mode to threshold, and verify that we remove - * all epoch markers. - */ 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 = 8 * 1024 * 1024; + auto_size_ctl.set_initial_size = FALSE; + auto_size_ctl.initial_size = 2 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ + auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + 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 * 1024); + 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; @@ -23879,12 +24168,12 @@ check_auto_cache_resize_epoch_markers(void) auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 1; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23892,74 +24181,128 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 4.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 13.\n"; } } if ( pass2 ) { - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 3.\n"; + failure_mssg2 = "bad cache size after set resize re-config 12.\n"; } } - /* ... and now there should be none. + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 5.\n"; + failure_mssg2 = "Unexpected cache size change results 38.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* shift the decrement mode to age out with threshold. Set epochs - * before eviction to 10 again. + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 39.\n"; + } + } + + 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; - auto_size_ctl.min_clean_fraction = 0.5; + auto_size_ctl.min_clean_fraction = 0.25; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + 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.increment = 1.0; /* disable size increment */ auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; - auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decr_mode = H5C2_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 10; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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); @@ -23967,95 +24310,244 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 5.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 14.\n"; } } - /* Verify that there are no active epoch markers. - */ if ( pass2 ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 6.\n"; + failure_mssg2 = "bad cache size after set resize re-config 13.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* build up a full set of epoch markers. */ + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ if ( pass2 ) { - j = 1; - while ( ( pass2 ) && ( j <= 10 ) ) + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); - rpt_fcn_called = FALSE; - i = (j - 1) * 1000; - while ( ( pass2 ) && ( i < j * 1000 ) ) - { - protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); } + i++; + } - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 7.\n"; - } + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - j++; + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 40.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - /* Verify that there are now 10 active epoch markers. + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. */ if ( pass2 ) { - if ( cache_ptr->epoch_markers_active != 10 ) { + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 8.\n"; + failure_mssg2 = "Unexpected cache size change results 41.\n"; } } - /* shift the decrement mode to off. This should cause all epoch - * markers to be removed. - */ + 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 = 8 * 1024 * 1024; + auto_size_ctl.initial_size = 4 * 1024 * 1024; auto_size_ctl.min_clean_fraction = 0.5; - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; auto_size_ctl.epoch_length = 1000; - auto_size_ctl.incr_mode = H5C2_incr__off; + auto_size_ctl.incr_mode = H5C2_incr__threshold; - auto_size_ctl.lower_hr_threshold = 0.75; + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ auto_size_ctl.increment = 2.0; auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); + 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 1.0; /* disable size decrement */ + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 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 15.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after set resize re-config 14.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 42.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 43.\n"; + } + } + + 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 = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; @@ -24064,201 +24556,1514 @@ check_auto_cache_resize_epoch_markers(void) auto_size_ctl.decrement = 0.5; - auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.apply_max_decrement = TRUE; auto_size_ctl.max_decrement = (1 * 1024 * 1024); - auto_size_ctl.epochs_before_eviction = 10; + auto_size_ctl.epochs_before_eviction = 3; - auto_size_ctl.apply_empty_reserve = FALSE; + 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 6.\n"; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 16.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after set resize re-config 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 44.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 45.\n"; + } + } + + 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); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass2 ) { + + HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", + fcn_name, failure_mssg2); + } + + return; + +} /* check_auto_cache_resize_disable() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_epoch_markers() + * + * Purpose: Verify that the auto-resize code manages epoch markers + * correctly. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_auto_cache_resize_epoch_markers(void) +{ + const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t j; + int32_t checkpoint = 0; + H5C2_t * cache_ptr = NULL; + H5C2_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, + /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize epoch marker management"); + + pass2 = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass2 ) { + + reset_entries2(); + + cache_ptr = setup_cache2((size_t)(2 * 1024), + (size_t)(1 * 1024)); + } + + 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 1.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* Now make sure that we are managing the epoch markers correctly. + */ + + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 2.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after set resize re-config 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Since we just created the cache, there should be no epoch markers + * active. Verify that this is true. + */ + + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 1.\n"; + } + } + + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass2 ) && ( i < 1000 ) ) + { + protect_entry2(cache_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 0.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + if ( pass2 ) { + + j = 2; + while ( ( pass2 ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 2) * 1000; + while ( ( pass2 ) && ( i < (j - 1) * 1000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 2.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* we now have a full complement of epoch markers -- see if + * we get the expected reduction. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass2 ) && ( i < 10000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != + ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || + ( cache_ptr->index_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now reduce the epochs before eviction, and see if the cache + * deletes the extra markers + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 3.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after set resize re-config 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present. + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 3.\n"; + } + } + + /* Now do an epochs worth of accesses, and verify that everything + * not accessed in this epoch gets evicted, and the cache size + * is reduced. + */ + if ( pass2 ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass2 ) && ( i < 10000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present... + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 4.\n"; + } + } + + /* shift the decrement mode to threshold, and verify that we remove + * all epoch markers. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 4.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after set resize re-config 3.\n"; + } + } + + /* ... and now there should be none. + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* shift the decrement mode to age out with threshold. Set epochs + * before eviction to 10 again. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 5.\n"; + } + } + + /* Verify that there are no active epoch markers. + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* build up a full set of epoch markers. */ + if ( pass2 ) { + + j = 1; + while ( ( pass2 ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 1) * 1000; + while ( ( pass2 ) && ( i < j * 1000 ) ) + { + protect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass2 ) { + unprotect_entry2(cache_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C2__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 7.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Verify that there are now 10 active epoch markers. + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 10 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 8.\n"; + } + } + + /* shift the decrement mode to off. This should cause all epoch + * markers to be removed. + */ + 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 = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C2_incr__off; + + 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 * 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; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + 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 6.\n"; + } + } + + /* Verify that there are now no active epoch markers. + */ + if ( pass2 ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected # of epoch markers 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* verify that we still have the expected number of entries in the cache, + * and that the cache is of the expected size. + */ + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| + ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || + ( cache_ptr->index_len != 10000 ) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected cache size change results 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass2 ) { + + takedown_cache2(cache_ptr, FALSE, FALSE); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass2 ) { + + HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", + fcn_name, failure_mssg2); + } + + return; + +} /* check_auto_cache_resize_epoch_markers() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_input_errs() + * + * Purpose: Verify that H5C2_set_cache_auto_resize_config() detects + * and rejects invalid input. + * + * Return: void + * + * Programmer: John Mainzer + * 10/29/04 + * + * Modifications: + * + * Added code to verify that errors in the flash cache size + * increment related fields are caught as well. + * + * JRM -- 1/17/08 + * + *------------------------------------------------------------------------- + */ + +#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ +( ( (a).version == (b).version ) && \ + ( (a).rpt_fcn == (b).rpt_fcn ) && \ + ( ( ! compare_init ) || \ + ( (a).set_initial_size == (b).set_initial_size ) ) && \ + ( ( ! compare_init ) || \ + ( (a).initial_size == (b).initial_size ) ) && \ + ( (a).min_clean_fraction == (b).min_clean_fraction ) && \ + ( (a).max_size == (b).max_size ) && \ + ( (a).min_size == (b).min_size ) && \ + ( (a).epoch_length == (b).epoch_length ) && \ + ( (a).incr_mode == (b).incr_mode ) && \ + ( (a).lower_hr_threshold == (b).lower_hr_threshold ) && \ + ( (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 ) && \ + ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ + ( (a).max_decrement == (b).max_decrement ) && \ + ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ + ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ + ( (a).empty_reserve == (b).empty_reserve ) ) + +static void +check_auto_cache_resize_input_errs(void) +{ + const char * fcn_name = "check_auto_cache_resize_input_errs()"; + herr_t result; + H5C2_t * cache_ptr = NULL; + H5C2_auto_size_ctl_t ref_auto_size_ctl = + { + /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, + /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* 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.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + H5C2_auto_size_ctl_t invalid_auto_size_ctl; + H5C2_auto_size_ctl_t test_auto_size_ctl; + + TESTING("automatic cache resize input errors"); + + pass2 = TRUE; + + /* allocate a cache, and set a reference automatic cache control + * configuration. Then feed H5C2_set_cache_auto_resize_config() + * invalid input, and verify that the correct error is returned, + * and that the configuration is not modified. + */ + + if ( pass2 ) { + + reset_entries2(); + + cache_ptr = setup_cache2((size_t)(2 * 1024), + (size_t)(1 * 1024)); + } + + if ( pass2 ) { + + result = H5C2_set_cache_auto_resize_config(cache_ptr, + &ref_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass2 = FALSE; + failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass2 ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass2 = FALSE; + failure_mssg2 = "bad cache size after initialization.\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 1."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected auto resize config 1."; + } + } + + 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.5; + + 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.7; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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(NULL, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass2 = FALSE; + failure_mssg2 = + "H5C2_set_cache_auto_resize_config accepted NULL cache_ptr.\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 2."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected auto resize config 2."; + } + } + + + /* check bad version rejection. */ + + if ( pass2 ) { + + invalid_auto_size_ctl.version = -1; /* INVALID */ + 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.5; + + 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.7; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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 version.\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 3."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected auto resize config 3."; + } + } + + + /* check bad initial size 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 = 16 * 1024 * 1024 + 1; + /* INVALID */ + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + 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__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; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + 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 init size 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 4."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass2 = FALSE; + failure_mssg2 = "Unexpected auto resize config 4."; } } - /* Verify that there are now no active epoch markers. - */ if ( pass2 ) { - if ( cache_ptr->epoch_markers_active != 0 ) { + invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 9.\n"; - } - } + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1; + /* INVALID */ - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.min_clean_fraction = 0.5; - /* verify that we still have the expected number of entries in the cache, - * and that the cache is of the expected size. - */ - if ( pass2 ) { + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| - ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || - ( cache_ptr->index_len != 10000 ) ) { + invalid_auto_size_ctl.epoch_length = 5000; - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 3.\n"; - } - } - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - if ( pass2 ) { + invalid_auto_size_ctl.lower_hr_threshold = 0.75; - takedown_cache2(cache_ptr, FALSE, FALSE); - } + invalid_auto_size_ctl.increment = 2.0; - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } + 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; - if ( ! pass2 ) { - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } + invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - return; + invalid_auto_size_ctl.upper_hr_threshold = 0.999; -} /* check_auto_cache_resize_epoch_markers() */ + invalid_auto_size_ctl.decrement = 0.5; - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_input_errs() - * - * Purpose: Verify that H5C2_set_cache_auto_resize_config() detects - * and rejects invalid input. - * - * Return: void - * - * Programmer: John Mainzer - * 10/29/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); -#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ -( ( (a).version == (b).version ) && \ - ( (a).rpt_fcn == (b).rpt_fcn ) && \ - ( ( ! compare_init ) || \ - ( (a).set_initial_size == (b).set_initial_size ) ) && \ - ( ( ! compare_init ) || \ - ( (a).initial_size == (b).initial_size ) ) && \ - ( (a).min_clean_fraction == (b).min_clean_fraction ) && \ - ( (a).max_size == (b).max_size ) && \ - ( (a).min_size == (b).min_size ) && \ - ( (a).epoch_length == (b).epoch_length ) && \ - ( (a).incr_mode == (b).incr_mode ) && \ - ( (a).lower_hr_threshold == (b).lower_hr_threshold ) && \ - ( (a).increment == (b).increment ) && \ - ( (a).apply_max_increment == (b).apply_max_increment ) && \ - ( (a).max_increment == (b).max_increment ) && \ - ( (a).decr_mode == (b).decr_mode ) && \ - ( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \ - ( (a).decrement == (b).decrement ) && \ - ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ - ( (a).max_decrement == (b).max_decrement ) && \ - ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ - ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ - ( (a).empty_reserve == (b).empty_reserve ) ) + invalid_auto_size_ctl.epochs_before_eviction = 3; -static void -check_auto_cache_resize_input_errs(void) -{ - const char * fcn_name = "check_auto_cache_resize_input_errs()"; - herr_t result; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t ref_auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), + result = H5C2_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); - /* double min_clean_fraction = */ 0.5, + if ( result != FAIL ) { - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), + pass2 = FALSE; + failure_mssg2 = + "H5C2_set_cache_auto_resize_config accepted bad init size 2.\n"; + } + } - /* int64_t epoch_length = */ 1000, + if ( pass2 ) { + result = H5C2_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, + if ( result != SUCCEED ) { - /* double lower_hr_threshold = */ 0.75, + pass2 = FALSE; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 5."; - /* double increment = */ 2.0, + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), + pass2 = FALSE; + failure_mssg2 = "Unexpected auto resize config 5."; + } + } - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, + /* test for invalid min clean fraction rejection. */ - /* double upper_hr_threshold = */ 0.995, + if ( pass2 ) { - /* double decrement = */ 0.1, + invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - /* int32_t epochs_before_eviction = */ 3, + invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - H5C2_auto_size_ctl_t invalid_auto_size_ctl; - H5C2_auto_size_ctl_t test_auto_size_ctl; + invalid_auto_size_ctl.epoch_length = 5000; - TESTING("automatic cache resize input errors"); - pass2 = TRUE; + invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - /* allocate a cache, and set a reference automatic cache control - * configuration. Then feed H5C2_set_cache_auto_resize_config() - * invalid input, and verify that the correct error is returned, - * and that the configuration is not modified. - */ + invalid_auto_size_ctl.lower_hr_threshold = 0.75; - if ( pass2 ) { + invalid_auto_size_ctl.increment = 2.0; - reset_entries2(); + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - cache_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 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; - if ( pass2 ) { - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &ref_auto_size_ctl); + invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - if ( result != SUCCEED ) { + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } + invalid_auto_size_ctl.decrement = 0.5; - if ( pass2 ) { + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 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 = "bad cache size after initialization.\n"; + failure_mssg2 = + "H5C2_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; } } @@ -24270,13 +26075,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 1."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 6."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 1."; + failure_mssg2 = "Unexpected auto resize config 6."; } } @@ -24288,7 +26093,7 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = -0.00001; /* INVALID */ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; @@ -24298,13 +26103,17 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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__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; @@ -24320,14 +26129,14 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.apply_empty_reserve = TRUE; invalid_auto_size_ctl.empty_reserve = 0.05; - result = H5C2_set_cache_auto_resize_config(NULL, + 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 NULL cache_ptr.\n"; + "H5C2_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; } } @@ -24339,22 +26148,22 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 2."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 7."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 2."; + failure_mssg2 = "Unexpected auto resize config 7."; } } - /* check bad version rejection. */ + /* test for invalid max_size and/or min_size rejection */ if ( pass2 ) { - invalid_auto_size_ctl.version = -1; /* INVALID */ + 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; @@ -24362,7 +26171,8 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.min_clean_fraction = 0.5; - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.max_size = H5C2__MAX_MAX_CACHE_SIZE + 1; + /* INVALID */ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; invalid_auto_size_ctl.epoch_length = 5000; @@ -24370,13 +26180,17 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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__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; @@ -24399,7 +26213,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad version.\n"; + "H5C2_set_cache_auto_resize_config accepted bad max_size.\n"; } } @@ -24411,32 +26225,28 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 3."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 8."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 3."; + failure_mssg2 = "Unexpected auto resize config 8."; } } - - /* check bad initial size 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 = 16 * 1024 * 1024 + 1; - /* INVALID */ + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; invalid_auto_size_ctl.min_clean_fraction = 0.5; - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ invalid_auto_size_ctl.epoch_length = 5000; @@ -24450,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; @@ -24472,7 +26286,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad init size 1.\n"; + "H5C2_set_cache_auto_resize_config accepted bad size pair.\n"; } } @@ -24484,13 +26298,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 4."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 9."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 4."; + failure_mssg2 = "Unexpected auto resize config 9."; } } @@ -24500,14 +26314,13 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.rpt_fcn = NULL; invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1; - /* INVALID */ + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; invalid_auto_size_ctl.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - + invalid_auto_size_ctl.min_size = H5C2__MIN_MAX_CACHE_SIZE - 1; + /* INVALID */ invalid_auto_size_ctl.epoch_length = 5000; @@ -24520,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; @@ -24542,7 +26359,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad init size 2.\n"; + "H5C2_set_cache_auto_resize_config accepted bad min_size.\n"; } } @@ -24554,18 +26371,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 5."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 10."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 5."; + failure_mssg2 = "Unexpected auto resize config 10."; } } - /* test for invalid min clean fraction rejection. */ + /* test for invalid epoch_length rejection */ if ( pass2 ) { @@ -24575,13 +26392,13 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.set_initial_size = TRUE; invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ + 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.epoch_length = H5C2__MAX_AR_EPOCH_LENGTH + 1; + /* INVALID */ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; @@ -24592,12 +26409,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24614,7 +26435,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; + "H5C2_set_cache_auto_resize_config accepted bad epoch len 1.\n"; } } @@ -24626,13 +26447,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 6."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 11."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 6."; + failure_mssg2 = "Unexpected auto resize config 11."; } } @@ -24644,13 +26465,13 @@ check_auto_cache_resize_input_errs(void) 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.00001; /* INVALID */ + 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.epoch_length = H5C2__MIN_AR_EPOCH_LENGTH - 1; + /* INVALID */ invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; @@ -24661,12 +26482,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24683,7 +26508,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; + "H5C2_set_cache_auto_resize_config accepted bad epoch len 2.\n"; } } @@ -24695,18 +26520,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 7."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 12."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 7."; + failure_mssg2 = "Unexpected auto resize config 12."; } } - /* test for invalid max_size and/or min_size rejection */ + /* test for bad incr_mode rejection */ if ( pass2 ) { @@ -24716,16 +26541,16 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = 0.1; - invalid_auto_size_ctl.max_size = H5C2__MAX_MAX_CACHE_SIZE + 1; - /* INVALID */ + 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.incr_mode = + (enum H5C2_cache_incr_mode) -1; /* INVALID */ invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -24734,12 +26559,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24756,7 +26585,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad max_size.\n"; + "H5C2_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; } } @@ -24768,13 +26597,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 8."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 13."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 8."; + failure_mssg2 = "Unexpected auto resize config 13."; } } @@ -24786,15 +26615,16 @@ check_auto_cache_resize_input_errs(void) 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.5; + invalid_auto_size_ctl.min_clean_fraction = 0.1; - invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ + 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.incr_mode = + (enum H5C2_cache_incr_mode) 2; /* INVALID */ invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -24803,12 +26633,16 @@ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24825,7 +26659,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad size pair.\n"; + "H5C2_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; } } @@ -24837,16 +26671,19 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 9."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 14."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 9."; + failure_mssg2 = "Unexpected auto resize config 14."; } } + + /* check for bad upper and/or lower threshold rejection */ + if ( pass2 ) { invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; @@ -24858,24 +26695,28 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = H5C2__MIN_MAX_CACHE_SIZE - 1; - /* INVALID */ + 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.lower_hr_threshold = 0.7; 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__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; - invalid_auto_size_ctl.upper_hr_threshold = 0.999; + invalid_auto_size_ctl.upper_hr_threshold = 1.01; /* INVALID */ invalid_auto_size_ctl.decrement = 0.5; @@ -24894,7 +26735,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min_size.\n"; + "H5C2_set_cache_auto_resize_config accepted bad upper threshold.\n"; } } @@ -24906,19 +26747,16 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 10."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 15."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 10."; + failure_mssg2 = "Unexpected auto resize config 15."; } } - - /* test for invalid epoch_length rejection */ - if ( pass2 ) { invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; @@ -24927,29 +26765,33 @@ check_auto_cache_resize_input_errs(void) 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.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - invalid_auto_size_ctl.epoch_length = H5C2__MAX_AR_EPOCH_LENGTH + 1; - /* INVALID */ + 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.lower_hr_threshold = 0.8; /* INVALID */ 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__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; - invalid_auto_size_ctl.upper_hr_threshold = 0.999; + invalid_auto_size_ctl.upper_hr_threshold = 0.7; /* INVALID */ - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -24966,7 +26808,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad epoch len 1.\n"; + "H5C2_set_cache_auto_resize_config accepted bad threshold pair.\n"; } } @@ -24978,13 +26820,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 11."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 16."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 11."; + failure_mssg2 = "Unexpected auto resize config 16."; } } @@ -24996,29 +26838,33 @@ check_auto_cache_resize_input_errs(void) 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.min_clean_fraction = 0.5; invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - invalid_auto_size_ctl.epoch_length = H5C2__MIN_AR_EPOCH_LENGTH - 1; - /* INVALID */ + 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.lower_hr_threshold = -0.0001; /* INVALID */ 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__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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25035,7 +26881,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad epoch len 2.\n"; + "H5C2_set_cache_auto_resize_config accepted bad lower threshold.\n"; } } @@ -25047,18 +26893,18 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 12."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 17."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 12."; + failure_mssg2 = "Unexpected auto resize config 17."; } } - /* test for bad incr_mode rejection */ + /* test for bad increment rejection */ if ( pass2 ) { @@ -25076,22 +26922,25 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.epoch_length = 5000; - invalid_auto_size_ctl.incr_mode = - (enum H5C2_cache_incr_mode) -1; /* INVALID */ + 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.increment = 0.99999; /* INVALID */ 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; invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.9; + invalid_auto_size_ctl.decrement = 0.5; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25101,6 +26950,7 @@ check_auto_cache_resize_input_errs(void) 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); @@ -25108,7 +26958,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; + "H5C2_set_cache_auto_resize_config accepted bad increment.\n"; } } @@ -25120,19 +26970,21 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 13."; + failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 18."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 13."; + failure_mssg2 = "Unexpected auto resize config 18."; } } + /* test for bad flash_incr_mode rejection */ + if ( pass2 ) { - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + 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; @@ -25146,8 +26998,7 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.epoch_length = 5000; - invalid_auto_size_ctl.incr_mode = - (enum H5C2_cache_incr_mode) 2; /* INVALID */ + invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; invalid_auto_size_ctl.lower_hr_threshold = 0.75; @@ -25156,6 +27007,11 @@ 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 = + (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; @@ -25178,7 +27034,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; + "H5C2_set_cache_auto_resize_config accepted bad flash_incr_mode.\n"; } } @@ -25190,28 +27046,27 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 14."; + 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 14."; + failure_mssg2 = "Unexpected auto resize config 19."; } } - - /* check for bad upper and/or lower threshold rejection */ + /* test for bad flash_multiple rejection */ if ( pass2 ) { - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + 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.5; + 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; @@ -25221,19 +27076,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.7; + 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 = 1.01; /* INVALID */ + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25250,7 +27110,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad upper threshold.\n"; + "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(1).\n"; } } @@ -25262,25 +27122,25 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 15."; + 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 15."; + failure_mssg2 = "Unexpected auto resize config 20."; } } if ( pass2 ) { - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + 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.5; + 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; @@ -25290,19 +27150,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = 0.8; /* INVALID */ + 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.7; /* INVALID */ + invalid_auto_size_ctl.upper_hr_threshold = 0.999; - invalid_auto_size_ctl.decrement = 0.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25319,7 +27184,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad threshold pair.\n"; + "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(2).\n"; } } @@ -25331,25 +27196,27 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 16."; + 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 16."; + 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.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.5; + 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; @@ -25359,19 +27226,24 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - invalid_auto_size_ctl.lower_hr_threshold = -0.0001; /* INVALID */ + 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.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25388,7 +27260,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad lower threshold.\n"; + "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(1).\n"; } } @@ -25400,22 +27272,19 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 17."; + 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 17."; + failure_mssg2 = "Unexpected auto resize config 22."; } } - - /* test for bad increment rejection */ - if ( pass2 ) { - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + 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; @@ -25433,17 +27302,22 @@ check_auto_cache_resize_input_errs(void) invalid_auto_size_ctl.lower_hr_threshold = 0.75; - invalid_auto_size_ctl.increment = 0.99999; /* INVALID */ + 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.5; + invalid_auto_size_ctl.decrement = 0.9; invalid_auto_size_ctl.apply_max_decrement = TRUE; invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); @@ -25453,7 +27327,6 @@ check_auto_cache_resize_input_errs(void) 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); @@ -25461,7 +27334,7 @@ check_auto_cache_resize_input_errs(void) pass2 = FALSE; failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad increment.\n"; + "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(2).\n"; } } @@ -25473,13 +27346,13 @@ check_auto_cache_resize_input_errs(void) if ( result != SUCCEED ) { pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 18."; + 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 18."; + failure_mssg2 = "Unexpected auto resize config 23."; } } @@ -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 Binary files a/test/tbogus.h5 and b/test/tbogus.h5 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", -- cgit v0.12