From 639ca379e47fbe550d090fff9e635ad24e8e34f0 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Thu, 3 Nov 2011 17:09:28 -0400 Subject: [PATCH] vol: rate-limit volume usage updates Add threshold and time rate-limit parameters for volume usage updates to disk. This reduces the amount of i/o needed for volume usage statistics on very busy fileservers. Set the default to limit updates to one every 5 seconds per volume. Change-Id: I6b4274476ef6b8f9e4288b109d5a3edbdea6e91c Reviewed-on: http://gerrit.openafs.org/5803 Reviewed-by: Derrick Brashear Reviewed-by: Tom Keiser Tested-by: BuildBot --- src/vol/volume.c | 12 ++++++++++-- src/vol/volume.h | 5 +++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vol/volume.c b/src/vol/volume.c index 319aeab..ba8ed51 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -479,6 +479,8 @@ VOptDefaults(ProgramType pt, VolumePackageOptions *opts) 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; @@ -6674,10 +6676,16 @@ VBumpVolumeUsage_r(Volume * vp) 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); } } diff --git a/src/vol/volume.h b/src/vol/volume.h index 1b9c7b6..4ba4494 100644 --- a/src/vol/volume.h +++ b/src/vol/volume.h @@ -271,6 +271,9 @@ typedef struct VolumePackageOptions { * 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 */ @@ -717,6 +720,8 @@ typedef struct Volume { 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 { -- 1.9.4