summaryrefslogtreecommitdiffstats
path: root/xlators/features/changelog/src/changelog-barrier.c
diff options
context:
space:
mode:
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;
+}