diff options
author | Kotresh H R <khiremat@redhat.com> | 2014-05-05 15:33:25 +0530 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2014-06-10 03:35:59 -0700 |
commit | b97e8f4ef649ed825b4f02b74e33946f6b551cec (patch) | |
tree | 5a4bd17192b919fd7d19b6b8572f433a36ee56b9 /xlators/features/changelog/src/changelog-barrier.c | |
parent | a9cdfa3072f60171a97d9f6af6988b179d45747f (diff) |
feature/changelog: Add timeout to changelog barrier.
This patch introduces configurable 'changelog-barrier-timeout'
in changelog. The default changelog-barrier-timeout is set to
120 sec which is same as barrier-timeout of barrier translator.
On this timeout, all the barriered fops are unbarriered. It is
safe to have this internal timeout for changelog barrier to
prevent it from indefinite barrierring of fops if barrier
disable notification does not come from snapshot for some
reason.
Change-Id: Iad07807935f88222cdefcd46312b4b6579186dce
BUG: 1094226
Signed-off-by: Kotresh H R <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/7669
Reviewed-by: Kaushal M <kaushal@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
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; +} |