Blob Blame History Raw
From c5ec2f7b76ce128c93413ab260c7bb7b59027219 Mon Sep 17 00:00:00 2001
From: Venky Shankar <vshankar@redhat.com>
Date: Tue, 30 Jun 2015 13:10:46 +0530
Subject: [PATCH 240/244] features/bitrot: move inode state just at the last moment

    Backport of http://review.gluster.org/11461

Which was done at half the set expiry time resulting in actual
IOs incrementing the object version. Now this is done just at
the last moment with re-notification now cut-shorting into
checksum calculation without waiting in the timer-wheel.

BUG: 1242585
Change-Id: If655b77d822ebf7b2a4f65e1b5583dd3609306e7
Signed-off-by: Venky Shankar <vshankar@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/52926
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Tested-by: Raghavendra Bhat <raghavendra@redhat.com>
---
 xlators/features/bit-rot/src/bitd/bit-rot.c |   61 ++++++++++++++++++--------
 1 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.c b/xlators/features/bit-rot/src/bitd/bit-rot.c
index 94063cb..4a050c8 100644
--- a/xlators/features/bit-rot/src/bitd/bit-rot.c
+++ b/xlators/features/bit-rot/src/bitd/bit-rot.c
@@ -594,15 +594,12 @@ static inline int32_t br_sign_object (br_object_t *object)
                 goto out;
         }
 
-        /* sanity check */
-        sign_info = ntohl (object->sign_info);
-        GF_ASSERT (sign_info != BR_SIGN_NORMAL);
-
         /**
          * For fd's that have notified for reopening, we send an explicit
          * open() followed by a dummy write() call. This triggers the
          * actual signing of the object.
          */
+        sign_info = ntohl (object->sign_info);
         if (sign_info == BR_SIGN_REOPEN_WAIT) {
                 br_object_resign (this, object, linked_inode);
                 goto unref_inode;
@@ -722,7 +719,8 @@ br_add_object_to_queue (struct gf_tw_timer_list *timer,
         }
         pthread_mutex_unlock (&priv->lock);
 
-        mem_put (timer);
+        if (timer)
+                mem_put (timer);
         return;
 }
 
@@ -762,7 +760,7 @@ br_initialize_timer (xlator_t *this, br_object_t *object, br_child_t *child,
                 goto out;
         INIT_LIST_HEAD (&timer->entry);
 
-        timer->expires  = (priv->expiry_time >> 1);
+        timer->expires = priv->expiry_time;
         if (!timer->expires)
                 timer->expires = 1;
 
@@ -774,6 +772,27 @@ out:
         return timer;
 }
 
+static int32_t
+br_schedule_object_reopen (xlator_t *this, br_object_t *object,
+                           br_child_t *child, changelog_event_t *ev)
+{
+        struct gf_tw_timer_list *timer = NULL;
+
+        timer = br_initialize_timer (this, object, child, ev);
+        if (!timer)
+                gf_msg (this->name, GF_LOG_ERROR, 0, BRB_MSG_SET_TIMER_FAILED,
+                        "Failed to allocate object expiry timer [GFID: %s]",
+                        uuid_utoa (object->gfid));
+        return timer ? 0 : -1;
+}
+
+static int32_t
+br_object_quicksign (xlator_t *this, br_object_t *object)
+{
+        br_add_object_to_queue (NULL, object, 0ULL);
+        return 0;
+}
+
 /**
  * This callback function registered with the changelog is executed
  * whenever a notification from the changelog is received. This should
@@ -787,11 +806,12 @@ void
 br_brick_callback (void *xl, char *brick,
                    void *data, changelog_event_t *ev)
 {
-        uuid_t gfid = {0,};
-        xlator_t                *this   = NULL;
-        br_object_t             *object = NULL;
-        br_child_t              *child  = NULL;
-        struct gf_tw_timer_list *timer  = NULL;
+        int32_t          ret       = 0;
+        uuid_t           gfid      = {0,};
+        xlator_t        *this      = NULL;
+        br_object_t     *object    = NULL;
+        br_child_t      *child     = NULL;
+        br_sign_state_t  sign_info = BR_SIGN_INVALID;
 
         this = xl;
 
@@ -822,22 +842,25 @@ br_brick_callback (void *xl, char *brick,
                 goto out;
         }
 
-        timer = br_initialize_timer (this, object, child, ev);
-        if (!timer) {
-                gf_msg (this->name, GF_LOG_ERROR, 0, BRB_MSG_SET_TIMER_FAILED,
-                        "failed to allocate object expiry timer [GFID: %s]",
-                        uuid_utoa (gfid));
+        /* sanity check */
+        sign_info = ntohl (object->sign_info);
+        GF_ASSERT (sign_info != BR_SIGN_NORMAL);
+
+        if (sign_info == BR_SIGN_REOPEN_WAIT)
+                ret = br_schedule_object_reopen (this, object, child, ev);
+        else
+                ret = br_object_quicksign (this, object);
+
+        if (ret)
                 goto free_object;
-        }
 
         gf_msg_debug (this->name, 0, "->callback: brick [%s], type [%d]\n",
                       brick, ev->ev_type);
-
         return;
 
  free_object:
         GF_FREE (object);
-out:
+ out:
         return;
 }
 
-- 
1.7.1