diff options
Diffstat (limited to 'xlators/features/bit-rot/src/bitd/bit-rot.c')
-rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.c b/xlators/features/bit-rot/src/bitd/bit-rot.c index ca3fc273e9f..882ac1da6b4 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot.c @@ -1534,7 +1534,6 @@ _br_qchild_event (xlator_t *this, br_child_t *child, br_child_handler *call) int br_scrubber_status_get (xlator_t *this, dict_t **dict) { - int ret = -1; br_private_t *priv = NULL; struct br_scrub_stats *scrub_stats = NULL; @@ -1600,9 +1599,11 @@ notify (xlator_t *this, int32_t event, void *data, ...) br_private_t *priv = NULL; dict_t *output = NULL; va_list ap; + struct br_monitor *scrub_monitor = NULL; subvol = (xlator_t *)data; priv = this->private; + scrub_monitor = &priv->scrub_monitor; gf_msg_trace (this->name, 0, "Notification received: %d", event); @@ -1676,6 +1677,30 @@ notify (xlator_t *this, int32_t event, void *data, ...) ret = br_scrubber_status_get (this, &output); gf_msg_debug (this->name, 0, "returning %d", ret); break; + + case GF_EVENT_SCRUB_ONDEMAND: + gf_log (this->name, GF_LOG_INFO, "BitRot scrub ondemand " + "called"); + + if (scrub_monitor->state != BR_SCRUB_STATE_PENDING) + return -2; + + /* Needs synchronization with reconfigure thread */ + pthread_mutex_lock (&priv->lock); + { + ret = br_scrub_state_machine (this, _gf_true); + } + pthread_mutex_unlock (&priv->lock); + + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + BRB_MSG_RESCHEDULE_SCRUBBER_FAILED, + "Could not schedule ondemand scrubbing. " + "Scrubbing will continue according to " + "old frequency."); + } + gf_msg_debug (this->name, 0, "returning %d", ret); + break; default: default_notify (this, event, data); } @@ -2045,7 +2070,7 @@ br_reconfigure_monitor (xlator_t *this) { int32_t ret = 0; - ret = br_scrub_state_machine (this); + ret = br_scrub_state_machine (this, _gf_false); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, BRB_MSG_RESCHEDULE_SCRUBBER_FAILED, |