/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * 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 LICENSE file, which can be found at the root of the source code       *
 * distribution tree, or in https://www.hdfgroup.org/licenses.               *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

package hdf.hdf5lib.structs;

import java.io.Serializable;

/**
 * Information struct for H5Pget_mdc_config/H5Pset_mdc_config
 *
 */
public class H5AC_cache_config_t implements Serializable {
    private static final long serialVersionUID = -6748085696476149972L;
    // general configuration fields
    /**
     *  version: Integer field containing the version number of this version
     *      of the H5AC_cache_config_t structure.  Any instance of
     *      H5AC_cache_config_t passed to the cache must have a known
     *      version number, or an error will be flagged.
     */
    public int version;
    /**
     * rpt_fcn_enabled: Boolean field used to enable and disable the default
     *    reporting function.  This function is invoked every time the
     *    automatic cache resize code is run, and reports on its activities.
     *
     *    This is a debugging function, and should normally be turned off.
     */
    public boolean rpt_fcn_enabled;
    /**
     * open_trace_file: Boolean field indicating whether the trace_file_name
     *     field should be used to open a trace file for the cache.
     *
     *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
     */
    public boolean open_trace_file;
    /**
     * close_trace_file: Boolean field indicating whether the current trace
     *     file (if any) should be closed.
     *
     *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
     */
    public boolean close_trace_file;
    /**
     * trace_file_name: Full path of the trace file to be opened if the
     *     open_trace_file field is TRUE.
     *
     *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
     */
    public String trace_file_name;
    /**
     * evictions_enabled:  Boolean field used to either report the current
     *     evictions enabled status of the cache, or to set the cache's
     *    evictions enabled status.
     */
    public boolean evictions_enabled;
    /**
     * set_initial_size: Boolean flag indicating whether the size of the
     *      initial size of the cache is to be set to the value given in
     *      the initial_size field.  If set_initial_size is FALSE, the
     *      initial_size field is ignored.
     */
    public boolean set_initial_size;
    /**
     * initial_size: If enabled, this field contain the size the cache is
     *      to be set to upon receipt of this structure.  Needless to say,
     *      initial_size must lie in the closed interval [min_size, max_size].
     */
    public long initial_size;
    /**
     * min_clean_fraction: double in the range 0 to 1 indicating the fraction
     *      of the cache that is to be kept clean.  This field is only used
     *      in parallel mode.  Typical values are 0.1 to 0.5.
     */
    public double min_clean_fraction;
    /**
     * max_size: Maximum size to which the cache can be adjusted.  The
     *      supplied value must fall in the closed interval
     *      [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE].  Also, max_size must
     *      be greater than or equal to min_size.
     */
    public long max_size;
    /**
     * min_size: Minimum size to which the cache can be adjusted.  The
     *      supplied value must fall in the closed interval
     *      [H5C__MIN_MAX_CACHE_SIZE, H5C__MAX_MAX_CACHE_SIZE].  Also, min_size
     *      must be less than or equal to max_size.
     */
    public long min_size;
    /**
     * epoch_length: Number of accesses on the cache over which to collect
     *      hit rate stats before running the automatic cache resize code,
     *      if it is enabled.
     */
    public long epoch_length;
    // size increase control fields
    /**
     * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose
     *      value indicates how we determine whether the cache size should be
     *      increased.  At present there are two possible values.
     */
    public int incr_mode;
    /**
     * lower_hr_threshold: Lower hit rate threshold.  If the increment mode
     *      (incr_mode) is H5C_incr__threshold and the hit rate drops below the
     *      value supplied in this field in an epoch, increment the cache size by
     *      size_increment.  Note that cache size may not be incremented above
     *      max_size, and that the increment may be further restricted by the
     *      max_increment field if it is enabled.
     */
    public double lower_hr_threshold;
    /**
     * increment:  Double containing the multiplier used to derive the new
     *      cache size from the old if a cache size increment is triggered.
     *      The increment must be greater than 1.0, and should not exceed 2.0.
     */
    public double increment;
    /**
     * apply_max_increment:  Boolean flag indicating whether the max_increment
     *      field should be used to limit the maximum cache size increment.
     */
    public boolean apply_max_increment;
    /**
     * max_increment: If enabled by the apply_max_increment field described
     *      above, this field contains the maximum number of bytes by which the
     *      cache size can be increased in a single re-size.
     */
    public long max_increment;
    /**
     * 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 accommodate insertion
     *      of large entries and large increases in the size of a single entry.
     */
    public int flash_incr_mode;
    /**
     * 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.
     */
    public double flash_multiple;
    /**
     * 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.
     */
    public double flash_threshold;
    // size decrease control fields
    /**
     * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose
     *      value indicates how we determine whether the cache size should be
     *      decreased.  At present there are four possibilities.
     */
    public int decr_mode;
    /**
     * upper_hr_threshold: Upper hit rate threshold.  The use of this field
     *      varies according to the current decr_mode.
     */
    public double upper_hr_threshold;
    /**
     * decrement: This field is only used when the decr_mode is
     *      H5C_decr__threshold.
     */
    public double decrement;
    /**
     * apply_max_decrement:  Boolean flag used to determine whether decrements
     *      in cache size are to be limited by the max_decrement field.
     */
    public boolean apply_max_decrement;
    /**
     * max_decrement: Maximum number of bytes by which the cache size can be
     *      decreased in a single re-size.  Note that decrements may also be
     *      restricted by the min_size of the cache, and (in age out modes) by
     *      the empty_reserve field.
     */
    public long max_decrement;
    /**
     * epochs_before_eviction:  Integer field used in H5C_decr__age_out and
     *      H5C_decr__age_out_with_threshold decrement modes.
     */
    public int epochs_before_eviction;
    /**
     * apply_empty_reserve:  Boolean field controlling whether the empty_reserve
     *      field is to be used in computing the new cache size when the
     *      decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold.
     */
    public boolean apply_empty_reserve;
    /**
     * empty_reserve:  To avoid a constant racheting down of cache size by small
     *      amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold
     *      modes, this field allows one to require that any cache size
     *      reductions leave the specified fraction of unused space in the cache.
     */
    public double empty_reserve;
    // parallel configuration fields
    /**
     * dirty_bytes_threshold:  Threshold of dirty byte creation used to
     *     synchronize updates between caches.
     */
    public long dirty_bytes_threshold;
    /**
     * metadata_write_strategy: Integer field containing a code indicating the
     *    desired metadata write strategy.
     */
    public int metadata_write_strategy;

    /**
     * H5AC_cache_config_t is a public structure intended for use in public APIs.
     * At least in its initial incarnation, it is basically a copy of struct
     * H5C_auto_size_ctl_t, minus the report_fcn field, and plus the
     * dirty_bytes_threshold field.
     *
     * @param version: Integer field containing the version number of this version
     * @param rpt_fcn_enabled: Boolean field used to enable and disable the default reporting function.
     * @param open_trace_file: Boolean field indicating whether the trace_file_name
     *     field should be used to open a trace file for the cache.
     * @param close_trace_file: Boolean field indicating whether the current trace
     *     file (if any) should be closed.
     * @param trace_file_name: Full path of the trace file to be opened if the
     *     open_trace_file field is TRUE.
     * @param evictions_enabled:  Boolean field used to either report or set the current
     *     evictions enabled status of the cache.
     * @param set_initial_size: Boolean flag indicating whether the size of the
     *      initial size of the cache is to be set to the value given in
     *      the initial_size field.
     * @param initial_size: If enabled, this field contain the size the cache is
     *      to be set to upon receipt of this structure.
     * @param min_clean_fraction: double in the range 0 to 1 indicating the fraction
     *      of the cache that is to be kept clean.
     * @param max_size: Maximum size to which the cache can be adjusted.
     * @param min_size: Minimum size to which the cache can be adjusted.
     * @param epoch_length: Number of accesses on the cache over which to collect
     *      hit rate stats before running the automatic cache resize code.
     * @param incr_mode: Instance of the H5C_cache_incr_mode enumerated type.
     * @param lower_hr_threshold: Lower hit rate threshold.
     * @param increment:  Double containing the multiplier used to derive the new
     *      cache size from the old if a cache size increment is triggered.
     * @param apply_max_increment:  Boolean flag indicating whether the max_increment
     *      field should be used to limit the maximum cache size increment.
     * @param max_increment: If enabled by the apply_max_increment field described
     *      above, this field contains the maximum number of bytes by which the
     *      cache size can be increased in a single re-size.
     * @param 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 accommodate insertion
     *      of large entries and large increases in the size of a single entry.
     * @param 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.
     * @param 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.
     * @param decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose
     *      value indicates how we determine whether the cache size should be
     *      decreased.
     * @param upper_hr_threshold: Upper hit rate threshold.  The use of this field
     *      varies according to the current decr_mode.
     * @param decrement: This field is only used when the decr_mode is
     *      H5C_decr__threshold.
     * @param apply_max_decrement:  Boolean flag used to determine whether decrements
     *      in cache size are to be limited by the max_decrement field.
     * @param max_decrement: Maximum number of bytes by which the cache size can be
     *      decreased in a single re-size.
     * @param epochs_before_eviction:  Integer field used in H5C_decr__age_out and
     *      H5C_decr__age_out_with_threshold decrement modes.
     * @param apply_empty_reserve:  Boolean field controlling whether the empty_reserve
     *      field is to be used in computing the new cache size when the
     *      decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold.
     * @param empty_reserve:  To avoid a constant racheting down of cache size by small
     *      amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold
     *      modes.
     * @param dirty_bytes_threshold:  Threshold of dirty byte creation used to
     *     synchronize updates between caches.
     * @param metadata_write_strategy: Integer field containing a code indicating the
     *    desired metadata write strategy.
     */
    public H5AC_cache_config_t(int version, boolean rpt_fcn_enabled, boolean open_trace_file,
                               boolean close_trace_file, String trace_file_name, boolean evictions_enabled,
                               boolean set_initial_size, long initial_size, double min_clean_fraction,
                               long max_size, long min_size, long epoch_length, int incr_mode,
                               double lower_hr_threshold, double increment, boolean apply_max_increment,
                               long max_increment, int flash_incr_mode, double flash_multiple,
                               double flash_threshold, int decr_mode, double upper_hr_threshold,
                               double decrement, boolean apply_max_decrement, long max_decrement,
                               int epochs_before_eviction, boolean apply_empty_reserve, double empty_reserve,
                               long dirty_bytes_threshold, int metadata_write_strategy)
    {
        this.version                 = version;
        this.rpt_fcn_enabled         = rpt_fcn_enabled;
        this.open_trace_file         = open_trace_file;
        this.close_trace_file        = close_trace_file;
        this.trace_file_name         = trace_file_name;
        this.evictions_enabled       = evictions_enabled;
        this.set_initial_size        = set_initial_size;
        this.initial_size            = initial_size;
        this.min_clean_fraction      = min_clean_fraction;
        this.max_size                = max_size;
        this.min_size                = min_size;
        this.epoch_length            = epoch_length;
        this.incr_mode               = incr_mode;
        this.lower_hr_threshold      = lower_hr_threshold;
        this.increment               = increment;
        this.apply_max_increment     = apply_max_increment;
        this.max_increment           = flash_incr_mode;
        this.flash_incr_mode         = flash_incr_mode;
        this.flash_multiple          = flash_multiple;
        this.flash_threshold         = flash_threshold;
        this.decr_mode               = decr_mode;
        this.upper_hr_threshold      = upper_hr_threshold;
        this.decrement               = decrement;
        this.apply_max_decrement     = apply_max_decrement;
        this.max_decrement           = max_decrement;
        this.epochs_before_eviction  = epochs_before_eviction;
        this.apply_empty_reserve     = apply_empty_reserve;
        this.empty_reserve           = empty_reserve;
        this.dirty_bytes_threshold   = dirty_bytes_threshold;
        this.metadata_write_strategy = metadata_write_strategy;
    }
}
