diff options
Diffstat (limited to 'xlators/features/changelog/src/changelog-barrier.c')
| -rw-r--r-- | xlators/features/changelog/src/changelog-barrier.c | 60 | 
1 files changed, 60 insertions, 0 deletions
diff --git a/xlators/features/changelog/src/changelog-barrier.c b/xlators/features/changelog/src/changelog-barrier.c index c20eed85b1c..2c237708cf4 100644 --- a/xlators/features/changelog/src/changelog-barrier.c +++ b/xlators/features/changelog/src/changelog-barrier.c @@ -52,9 +52,42 @@ chlog_barrier_dequeue_all (xlator_t *this, struct list_head *queue)  {          call_stub_t            *stub    = NULL; +        gf_log (this->name, GF_LOG_INFO, +                "Dequeuing all the changelog barriered fops"); +          while ((stub = __chlog_barrier_dequeue (this, queue)))                  call_resume (stub); +        gf_log (this->name, GF_LOG_INFO, +                "Dequeuing changelog barriered fops is finished"); +        return; +} + +/* Function called on changelog barrier timeout */ +void +chlog_barrier_timeout (void *data) +{ +        xlator_t               *this    = NULL; +        changelog_priv_t       *priv    = NULL; +        struct list_head        queue   = {0,}; + +        this = data; +        THIS = this; +        priv = this->private; + +        INIT_LIST_HEAD (&queue); + +        gf_log (this->name, GF_LOG_ERROR, +                "Disabling changelog barrier because of the timeout."); + +        LOCK (&priv->lock); +        { +                __chlog_barrier_disable (this, &queue); +        } +        UNLOCK (&priv->lock); + +        chlog_barrier_dequeue_all (this, &queue); +          return;  } @@ -63,8 +96,35 @@ void  __chlog_barrier_disable (xlator_t *this, struct list_head *queue)  {          changelog_priv_t  *priv   = this->private; +        int                ret    = 0; +        GF_ASSERT (priv); + +        if (priv->timer) { +                ret = gf_timer_call_cancel (this->ctx, priv->timer); +                priv->timer = NULL; +        }          list_splice_init (&priv->queue, queue);          priv->queue_size = 0;          priv->barrier_enabled = _gf_false;  } + +/* Enable chagelog barrier enable with timer */ +int +__chlog_barrier_enable (xlator_t *this, changelog_priv_t *priv) +{ +        int             ret     = -1; + +        priv->timer = gf_timer_call_after (this->ctx, priv->timeout, +                                           chlog_barrier_timeout, (void *)this); +        if (!priv->timer) { +                gf_log (this->name, GF_LOG_CRITICAL, +                        "Couldn't add changelog barrier timeout event."); +                goto out; +        } + +        priv->barrier_enabled = _gf_true; +        ret = 0; +out: +        return ret; +}  | 
