diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2012-12-14 01:05:39 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-01-23 01:26:09 -0800 | 
| commit | 91ac9f97417790f439702c0297bca953ece597c8 (patch) | |
| tree | aa860de8d39cfd3a44e7e9e58ebddd65aa2d87fd | |
| parent | f935c12c50691af3196b3525206ad2df4de91cb8 (diff) | |
cluster/afr: Remove strict-readdir implementation
Leaving option frame-work un-changed for backward compatibility.
Change-Id: I40bce1ec360801307e67f09e53b0721f64efab37
BUG: 886998
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/4309
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | tests/bugs/886998/strict-readdir.t | 52 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-dir-read.c | 201 | 
2 files changed, 52 insertions, 201 deletions
diff --git a/tests/bugs/886998/strict-readdir.t b/tests/bugs/886998/strict-readdir.t new file mode 100644 index 00000000..0de953e8 --- /dev/null +++ b/tests/bugs/886998/strict-readdir.t @@ -0,0 +1,52 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +function num_files_in_dir { +        d=$1 +        ls $d | sort | uniq | wc -l +} + +#Basic sanity tests for readdir functionality +cleanup; +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 replica 2 $H0:$B0/r2d2_0 $H0:$B0/r2d2_1 $H0:$B0/r2d2_2 $H0:$B0/r2d2_3 +TEST $CLI volume start $V0 +TEST glusterfs --volfile-server=$H0 --volfile-id=/$V0 $M0 + +TEST touch $M0/{1..100} +EXPECT "100" num_files_in_dir $M0 + +TEST kill_brick $V0 $H0 $B0/r2d2_0 +TEST kill_brick $V0 $H0 $B0/r2d2_2 +EXPECT "100" num_files_in_dir $M0 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 0 +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 2 + +TEST kill_brick $V0 $H0 $B0/r2d2_1 +TEST kill_brick $V0 $H0 $B0/r2d2_3 +EXPECT "100" num_files_in_dir $M0 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 1 +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 3 + +TEST $CLI volume set $V0 cluster.strict-readdir on +EXPECT "on" volinfo_field $V0 cluster.strict-readdir +TEST kill_brick $V0 $H0 $B0/r2d2_0 +TEST kill_brick $V0 $H0 $B0/r2d2_2 +EXPECT "100" num_files_in_dir $M0 + +TEST $CLI volume start $V0 force +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 0 +EXPECT_WITHIN 20 "1" afr_child_up_status $V0 2 + +TEST kill_brick $V0 $H0 $B0/r2d2_1 +TEST kill_brick $V0 $H0 $B0/r2d2_3 +EXPECT "100" num_files_in_dir $M0 +cleanup; diff --git a/xlators/cluster/afr/src/afr-dir-read.c b/xlators/cluster/afr/src/afr-dir-read.c index c201d45f..0e171881 100644 --- a/xlators/cluster/afr/src/afr-dir-read.c +++ b/xlators/cluster/afr/src/afr-dir-read.c @@ -358,85 +358,6 @@ struct entry_name {          struct list_head list;  }; - -static gf_boolean_t -remembered_name (const char *name, struct list_head *entries) -{ -        struct entry_name *e   = NULL; -        gf_boolean_t       ret = _gf_false; - -        list_for_each_entry (e, entries, list) { -                if (!strcmp (name, e->name)) { -                        ret = _gf_true; -                        goto out; -                } -        } - -out: -        return ret; -} - - -static void -afr_remember_entries (gf_dirent_t *entries, fd_t *fd) -{ -        struct entry_name *n      = NULL; -        gf_dirent_t       *entry  = NULL; -        int                ret    = 0; -        uint64_t           ctx    = 0; -        afr_fd_ctx_t      *fd_ctx = NULL; - -        ret = fd_ctx_get (fd, THIS, &ctx); -        if (ret < 0) { -                gf_log (THIS->name, GF_LOG_INFO, -                        "could not get fd ctx for fd=%p", fd); -                return; -        } - -        fd_ctx = (afr_fd_ctx_t *)(long) ctx; - -        list_for_each_entry (entry, &entries->list, list) { -                n = GF_CALLOC (1, sizeof (*n), gf_afr_mt_entry_name); -                n->name = gf_strdup (entry->d_name); -                INIT_LIST_HEAD (&n->list); - -                list_add (&n->list, &fd_ctx->entries); -        } -} - - -static off_t -afr_filter_entries (gf_dirent_t *entries, fd_t *fd) -{ -        gf_dirent_t  *entry  = NULL; -        gf_dirent_t  *tmp    = NULL; -        int           ret    = 0; -        uint64_t      ctx    = 0; -        afr_fd_ctx_t *fd_ctx = NULL; -        off_t         offset = 0; - -        ret = fd_ctx_get (fd, THIS, &ctx); -        if (ret < 0) { -                gf_log (THIS->name, GF_LOG_INFO, -                        "could not get fd ctx for fd=%p", fd); -                return -1; -        } - -        fd_ctx = (afr_fd_ctx_t *)(long) ctx; - -        list_for_each_entry_safe (entry, tmp, &entries->list, list) { -                offset = entry->d_off; - -                if (remembered_name (entry->d_name, &fd_ctx->entries)) { -                        list_del (&entry->list); -                        GF_FREE (entry); -                } -        } - -        return offset; -} - -  static void  afr_forget_entries (fd_t *fd)  { @@ -479,114 +400,6 @@ afr_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,                    dict_t *xdata)  { -        afr_private_t *  priv            = NULL; -        afr_local_t *    local           = NULL; -        xlator_t **      children        = NULL; -        int32_t          next_call_child = -1; -        int              ret             = 0; -        int32_t          *last_index     = NULL; -        int32_t          read_child      = -1; -        int32_t         *fresh_children   = NULL; -        uint64_t         ctx             = 0; -        afr_fd_ctx_t    *fd_ctx          = NULL; -        off_t            offset          = 0; -        int32_t         call_child       = -1; - -        priv     = this->private; -        children = priv->children; - -        local = frame->local; - -        if ((priv->readdir_failover == _gf_false) && (op_ret < 0)) -                goto out; - -        read_child = (long) cookie; -        last_index = &local->cont.readdir.last_index; -        fresh_children = local->fresh_children; - -        /* the value of the last_index changes if afr_next_call_child is -         * called. So to find the call_child of this callback use last_index -         * before the next_call_child call. -         */ -        if (*last_index == -1) -                call_child = read_child; -        else -                call_child = fresh_children[*last_index]; - -        if (priv->strict_readdir) { -                ret = fd_ctx_get (local->fd, this, &ctx); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_INFO, -                                "could not get fd ctx for fd=%p", local->fd); -                        op_ret   = -1; -                        op_errno = -ret; -                        goto out; -                } - -                fd_ctx = (afr_fd_ctx_t *)(long) ctx; - -                if (op_ret == -1) { -                        next_call_child = afr_next_call_child (fresh_children, -                                                               local->child_up, -                                                               priv->child_count, -                                                               last_index, -                                                               read_child); -                        if (next_call_child < 0) -                                goto out; -                        gf_log (this->name, GF_LOG_TRACE, -                                "starting readdir afresh on child %d, offset %"PRId64, -                                next_call_child, (uint64_t) 0); - -                        fd_ctx->failed_over = _gf_true; - -                        STACK_WIND_COOKIE (frame, afr_readdirp_cbk, -                                           (void *) (long) read_child, -                                           children[next_call_child], -                                           children[next_call_child]->fops->readdirp, -                                           local->fd, -                                           local->cont.readdir.size, 0, -                                           local->cont.readdir.dict); -                        return 0; -                } -        } - -        if (priv->strict_readdir) { -                if (fd_ctx->failed_over) { -                        if (list_empty (&entries->list)) { -                                gf_log (this->name, GF_LOG_DEBUG, -                                        "no entries found"); -                                goto out; -                        } - -                        offset = afr_filter_entries (entries, local->fd); - -                        afr_remember_entries (entries, local->fd); - -                        if (list_empty (&entries->list)) { -                                /* All the entries we got were duplicate. We -                                   shouldn't send an empty list now, because -                                   that will make the application stop reading. So -                                   try to get more entries */ - -                                gf_log (this->name, GF_LOG_TRACE, -                                        "trying to fetch non-duplicate entries " -                                        "from offset %"PRId64", child %s", -                                        offset, children[call_child]->name); - -                                STACK_WIND_COOKIE (frame, afr_readdirp_cbk, -                                                   (void *) (long) read_child, -                                                   children[call_child], -                                                   children[call_child]->fops->readdirp, -                                                   local->fd, local->cont.readdir.size, offset, -                                                   local->cont.readdir.dict); -                                return 0; -                        } -                } else { -                        afr_remember_entries (entries, local->fd); -                } -        } - -out:          AFR_STACK_UNWIND (readdirp, frame, op_ret, op_errno, entries, NULL);          return 0; @@ -654,20 +467,6 @@ afr_do_readdir (call_frame_t *frame, xlator_t *this,          local->cont.readdir.size   = size;          local->cont.readdir.dict   = (dict)? dict_ref (dict) : NULL; -        if (priv->strict_readdir) { -                if (fd_ctx->last_tried != call_child) { -                        gf_log (this->name, GF_LOG_TRACE, -                                "first up child has changed from %d to %d, " -                                "restarting readdir from offset 0", -                                fd_ctx->last_tried, call_child); - -                        fd_ctx->failed_over = _gf_true; -                        offset = 0; -                } - -                fd_ctx->last_tried = call_child; -        } -          if (whichop == GF_FOP_READDIR)                  STACK_WIND_COOKIE (frame, afr_readdir_cbk,                                     (void *) (long) call_child,  | 
