diff options
| author | Venky Shankar <vshankar@redhat.com> | 2015-05-21 19:55:02 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2015-05-28 04:19:27 -0700 | 
| commit | 6fc12a43f3e20ea24969e5a3c949f7c27d9c1893 (patch) | |
| tree | 08d2525bb859464ae7de2c534363f76db878f144 /xlators/features/bit-rot/src/bitd/bit-rot.h | |
| parent | e878b0bcbaa19e46517e44284685ef99b885117b (diff) | |
features/bitrot: reimplement scrubbing frequency
This patch reimplments existing scrub-frequency mechanism used
to schedule scrubber runs. Existing mechanism uses periodic
sleeps (waking up periodically on minimum granularity) and
performing a number of tracking checks based on counters and
sleep times. This patch does away with all the nifty counters
and uses timer-wheel to schedule scrub runs.
Scheduling changes are peformed by merely calculating the new
expiry time and calling mod_timer() [mod_timer_pending() in
some cases] making the code more debuggable and easier to
follow. This also introduces "hourly" scrubbing tunable as an
aid for testing scrubbing during development/testing cycle.
One could also implement on-demand scrubbing with ease: by
invoking mod_timer() with an expiry of one (1) second, thereby
scheduling a scrub run the very next second.
Change-Id: I6c7c5f0c6c9f886bf574d88c04cde14b76e60a8b
BUG: 1224596
Signed-off-by: Venky Shankar <vshankar@redhat.com>
Reviewed-on: http://review.gluster.org/10893
Reviewed-by: Gaurav Kumar Garg <ggarg@redhat.com>
Tested-by: NetBSD Build System
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/features/bit-rot/src/bitd/bit-rot.h')
| -rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot.h | 32 | 
1 files changed, 26 insertions, 6 deletions
diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.h b/xlators/features/bit-rot/src/bitd/bit-rot.h index 6543be763d6..ec943e9131f 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot.h +++ b/xlators/features/bit-rot/src/bitd/bit-rot.h @@ -46,6 +46,14 @@ typedef enum scrub_throttle {          BR_SCRUB_THROTTLE_STALLED    = 3,  } scrub_throttle_t; +typedef enum scrub_freq { +        BR_FSSCRUB_FREQ_HOURLY = 1, +        BR_FSSCRUB_FREQ_DAILY, +        BR_FSSCRUB_FREQ_WEEKLY, +        BR_FSSCRUB_FREQ_BIWEEKLY, +        BR_FSSCRUB_FREQ_MONTHLY, +} scrub_freq_t; +  #define signature_size(hl) (sizeof (br_isignature_t) + hl + 1)  struct br_scanfs { @@ -57,6 +65,15 @@ struct br_scanfs {          unsigned int     entries;          struct list_head queued;          struct list_head ready; + +        /* scheduler */ +        uint32_t boot; +        gf_boolean_t kick; + +        pthread_mutex_t wakelock; +        pthread_cond_t  wakecond; + +        struct gf_tw_timer_list *timer;  };  struct br_child { @@ -98,13 +115,21 @@ struct br_scrubber {          scrub_throttle_t throttle; +        /** +         * frequency of scanning for this subvolume. this should +         * normally be per-child, but since all childs follow the +         * same frequency for a volume, this option ends up here +         * instead of br_child_t. +         */ +        scrub_freq_t frequency; +          pthread_mutex_t mutex;          pthread_cond_t  cond;          unsigned int nr_scrubbers;          struct list_head scrubbers; -        /* +        /**           * list of "rotatable" subvolume(s) undergoing scrubbing           */          struct list_head scrublist; @@ -139,11 +164,6 @@ struct br_private {          gf_boolean_t iamscrubber;         /* function as a fs scrubber */          struct br_scrubber fsscrub;       /* scrubbers for this subvolume */ - -        char    *scrub_freq;              /* Scrubber frequency*/ - -        struct  timeval  tv_before_scrub; /* time before starting scrubbing*/ -        struct  timeval  tv_after_scrub;  /* time after  scrubbing completion*/  };  typedef struct br_private br_private_t;  | 
