summaryrefslogtreecommitdiffstats
path: root/xlators/features/changelog/src/changelog-barrier.c
diff options
context:
space:
mode:
authorKotresh H R <khiremat@redhat.com>2014-05-05 15:33:25 +0530
committerVenky Shankar <vshankar@redhat.com>2014-06-10 03:35:59 -0700
commitb97e8f4ef649ed825b4f02b74e33946f6b551cec (patch)
tree5a4bd17192b919fd7d19b6b8572f433a36ee56b9 /xlators/features/changelog/src/changelog-barrier.c
parenta9cdfa3072f60171a97d9f6af6988b179d45747f (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.c60
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;
+}