opts->interrupt_rxcall = NULL;
opts->offline_timeout = -1;
opts->offline_shutdown_timeout = -1;
+ opts->usage_threshold = 128;
+ opts->usage_rate_limit = 5;
#ifdef FAST_RESTART
opts->unsafe_attach = 1;
if (now - V_dayUseDate(vp) > OneDay)
VAdjustVolumeStatistics_r(vp);
/*
- * Save the volume header image to disk after every 128 bumps to dayUse.
+ * Save the volume header image to disk after a threshold of bumps to dayUse,
+ * at most every usage_rate_limit seconds.
*/
- if ((V_dayUse(vp)++ & 127) == 0) {
+ V_dayUse(vp)++;
+ vp->usage_bumps_outstanding++;
+ if (vp->usage_bumps_outstanding >= vol_opts.usage_threshold
+ && vp->usage_bumps_next_write <= now) {
Error error;
+ vp->usage_bumps_outstanding = 0;
+ vp->usage_bumps_next_write = now + vol_opts.usage_rate_limit;
VUpdateVolume_r(&error, vp, VOL_UPDATE_WAIT);
}
}
* during shutdown, we will still only wait
* for this amount of time in total, not e.g.
* for each going-offline volume encountered. */
+ afs_int32 usage_threshold; /*< number of accesses before writing volume header */
+ afs_int32 usage_rate_limit; /*< minimum number of seconds before writing volume
+ * header, after usage_threshold is exceeded */
} VolumePackageOptions;
/* Magic numbers and version stamps for each type of file */
VolumeVLRUState vlru; /* state specific to the VLRU */
FSSYNC_VolOp_info * pending_vol_op; /* fssync command info for any pending vol ops */
#endif /* AFS_DEMAND_ATTACH_FS */
+ int usage_bumps_outstanding; /**< to rate limit the usage update i/o by accesses */
+ int usage_bumps_next_write; /**< to rate limit the usage update i/o by time */
} Volume;
struct volHeader {