diff options
| author | Anand Avati <avati@redhat.com> | 2014-01-16 16:14:36 -0800 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2014-03-22 05:25:57 -0700 | 
| commit | 6d3739292b7b51d2ddbab75b5f884fb38925b943 (patch) | |
| tree | cf332a881a49c0904a7e023935750c2d080fc1c5 /xlators/cluster/afr/src/afr-lk-common.c | |
| parent | eb87c96f49b3dd2c7460e58c54ce909c706cd475 (diff) | |
cluster/afr: refactor
- Remove client side self-healing completely (opendir, openfd, lookup)
- Re-work readdir-failover to work reliably in case of NFS
- Remove unused/dead lock recovery code
- Consistently use xdata in both calls and callbacks in all FOPs
- Per-inode event generation, used to force inode ctx refresh
- Implement dirty flag support (in place of pending counts)
- Eliminate inode ctx structure, use read subvol bits + event_generation
- Implement inode ctx refreshing based on event generation
- Provide backward compatibility in transactions
- remove unused variables and functions
- make code more consistent in style and pattern
- regularize and clean up inode-write transaction code
- regularize and clean up dir-write transaction code
- regularize and clean up common FOPs
- reorganize transaction framework code
- skip setting xattrs in pending dict if nothing is pending
- re-write self-healing code using syncops
- re-write simpler self-heal-daemon
Change-Id: I1e4080c9796c8a2815c2dab4be3073f389d614a8
BUG: 1021686
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/6010
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-lk-common.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-lk-common.c | 509 | 
1 files changed, 1 insertions, 508 deletions
diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 060d78f3505..a2a758f35af 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -580,22 +580,6 @@ initialize_inodelk_variables (call_frame_t *frame, xlator_t *this)          return 0;  } -loc_t * -lower_path (loc_t *l1, const char *b1, loc_t *l2, const char *b2) -{ -        int ret = 0; - -        ret = uuid_compare (l1->inode->gfid, l2->inode->gfid); - -        if (ret == 0) -                ret = strcmp (b1, b2); - -        if (ret <= 0) -                return l1; -        else -                return l2; -} -  int  afr_lockee_locked_nodes_count (afr_internal_lock_t *int_lock)  { @@ -1213,8 +1197,7 @@ afr_blocking_lock (call_frame_t *frame, xlator_t *this)          case AFR_ENTRY_RENAME_TRANSACTION:          case AFR_ENTRY_TRANSACTION: -                up_count = afr_up_children_count (local->child_up, -                                                  priv->child_count); +                up_count = AFR_COUNT (local->child_up, priv->child_count);                  int_lock->lk_call_count = int_lock->lk_expected_count                                          = (int_lock->lockee_count *                                             up_count); @@ -1648,496 +1631,6 @@ afr_unlock (call_frame_t *frame, xlator_t *this)  }  int -afr_mark_locked_nodes (xlator_t *this, fd_t *fd, -                       unsigned char *locked_nodes) -{ -        afr_private_t *priv  = NULL; -        afr_fd_ctx_t  *fdctx = NULL; -        uint64_t       tmp   = 0; -        int            ret   = 0; - -        priv = this->private; - -        ret = afr_fd_ctx_set (this, fd); -        if (ret) -                goto out; - -        ret = fd_ctx_get (fd, this, &tmp); -        if (ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "failed to get the fd ctx"); -                goto out; -        } -        fdctx = (afr_fd_ctx_t *) (long) tmp; - -        GF_ASSERT (fdctx->locked_on); - -        memcpy (fdctx->locked_on, locked_nodes, -                priv->child_count); - -out: -        return ret; -} - -static int -__is_fd_saved (xlator_t *this, fd_t *fd) -{ -        afr_locked_fd_t *locked_fd = NULL; -        afr_private_t   *priv      = NULL; -        int              found     = 0; - -        priv = this->private; - -        list_for_each_entry (locked_fd, &priv->saved_fds, list) { -                if (locked_fd->fd == fd) { -                        found = 1; -                        break; -                } -        } - -        return found; -} - -static int -__afr_save_locked_fd (xlator_t *this, fd_t *fd) -{ -        afr_private_t   *priv      = NULL; -        afr_locked_fd_t *locked_fd = NULL; -        int              ret       = 0; - -        priv = this->private; - -        locked_fd = GF_CALLOC (1, sizeof (*locked_fd), -                               gf_afr_mt_locked_fd); -        if (!locked_fd) { -                ret = -1; -                goto out; -        } - -        locked_fd->fd = fd; -        INIT_LIST_HEAD (&locked_fd->list); - -        list_add_tail (&locked_fd->list, &priv->saved_fds); - -out: -        return ret; -} - -int -afr_save_locked_fd (xlator_t *this, fd_t *fd) -{ -        afr_private_t   *priv      = NULL; -        int              ret       = 0; - -        priv = this->private; - -        pthread_mutex_lock (&priv->mutex); -        { -                if (__is_fd_saved (this, fd)) { -                        gf_log (this->name, GF_LOG_DEBUG, -                                "fd=%p already saved", fd); -                        goto unlock; -                } - -                ret = __afr_save_locked_fd (this, fd); -                if (ret) { -                        gf_log (this->name, GF_LOG_INFO, -                                "fd=%p could not be saved", fd); -                        goto unlock; -                } -        } -unlock: -        pthread_mutex_unlock (&priv->mutex); - -        return ret; -} - -static int -afr_lock_recovery_cleanup (call_frame_t *frame, xlator_t *this) -{ -        afr_local_t     *local     = NULL; -        afr_locked_fd_t *locked_fd = NULL; - -        local = frame->local; - -        locked_fd = local->locked_fd; - -        STACK_DESTROY (frame->root); -        afr_local_cleanup (local, this); - -        afr_save_locked_fd (this, locked_fd->fd); - -        return 0; - -} - -static int -afr_get_source_lock_recovery (xlator_t *this, fd_t *fd) -{ -        afr_fd_ctx_t  *fdctx        = NULL; -        afr_private_t *priv         = NULL; -        uint64_t      tmp           = 0; -        int           i             = 0; -        int           source_child  = -1; -        int           ret           = 0; - -        priv = this->private; - -        ret = fd_ctx_get (fd, this, &tmp); -        if (ret) -                goto out; - -        fdctx = (afr_fd_ctx_t *) (long) tmp; - -        for (i = 0; i < priv->child_count; i++) { -                if (fdctx->locked_on[i]) { -                        gf_log (this->name, GF_LOG_DEBUG, -                                "Found lock recovery source=%d", i); -                        source_child = i; -                        break; -                } -        } - -out: -        return source_child; - -} - -int32_t -afr_get_locks_fd_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                      int32_t op_ret, int32_t op_errno, struct gf_flock *lock, -                      dict_t *xdata); -int32_t -afr_recover_lock_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                      int32_t op_ret, int32_t op_errno, struct gf_flock *lock, -                      dict_t *xdata) -{ -        afr_local_t   *local = NULL; -        afr_private_t *priv  = NULL; -        int32_t source_child = 0; -        struct gf_flock flock   = {0,}; - -        local = frame->local; -        priv  = this->private; - -        if (op_ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "lock recovery failed"); -                goto cleanup; -        } - -        source_child = local->source_child; - -        memcpy (&flock, lock, sizeof (*lock)); - -        STACK_WIND_COOKIE (frame, afr_get_locks_fd_cbk, -                           (void *) (long) source_child, -                           priv->children[source_child], -                           priv->children[source_child]->fops->lk, -                           local->fd, F_GETLK_FD, &flock, NULL); - -        return 0; - -cleanup: -        afr_lock_recovery_cleanup (frame, this); -        return 0; -} - -int -afr_recover_lock (call_frame_t *frame, xlator_t *this, -                  struct gf_flock *flock) -{ -        afr_local_t   *local             = NULL; -        afr_private_t *priv              = NULL; -        int32_t      lock_recovery_child = 0; - -        priv  = this->private; -        local = frame->local; - -        lock_recovery_child = local->lock_recovery_child; - -        frame->root->lk_owner = flock->l_owner; - -        STACK_WIND_COOKIE (frame, afr_recover_lock_cbk, -                           (void *) (long) lock_recovery_child, -                           priv->children[lock_recovery_child], -                           priv->children[lock_recovery_child]->fops->lk, -                           local->fd, F_SETLK, flock, NULL); - -        return 0; -} - -static int -is_afr_lock_eol (struct gf_flock *lock) -{ -        int ret = 0; - -        if ((lock->l_type == GF_LK_EOL)) -                ret = 1; - -        return ret; -} - -int32_t -afr_get_locks_fd_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                      int32_t op_ret, int32_t op_errno, struct gf_flock *lock, -                      dict_t *xdata) -{ -        if (op_ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "Failed to get locks on fd"); -                goto cleanup; -        } - -        gf_log (this->name, GF_LOG_DEBUG, -                "Got a lock on fd"); - -        if (is_afr_lock_eol (lock)) { -                gf_log (this->name, GF_LOG_INFO, -                        "Reached EOL on locks on fd"); -                goto cleanup; -        } - -        afr_recover_lock (frame, this, lock); - -        return 0; - -cleanup: -        afr_lock_recovery_cleanup (frame, this); - -        return 0; -} - -static int -afr_lock_recovery (call_frame_t *frame, xlator_t *this) -{ -        afr_local_t   *local        = NULL; -        afr_private_t *priv         = NULL; -        fd_t          *fd           = NULL; -        int            ret          = 0; -        int32_t        source_child = 0; -        struct gf_flock   flock        = {0,}; - -        priv  = this->private; -        local = frame->local; - -        fd = local->fd; - -        source_child = afr_get_source_lock_recovery (this, fd); -        if (source_child < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Could not recover locks due to lock " -                        "split brain"); -                ret = -1; -                goto out; -        } - -        local->source_child = source_child; - -        /* the flock can be zero filled as we're querying incrementally -           the locks held on the fd. -        */ -        STACK_WIND_COOKIE (frame, afr_get_locks_fd_cbk, -                           (void *) (long) source_child, -                           priv->children[source_child], -                           priv->children[source_child]->fops->lk, -                           local->fd, F_GETLK_FD, &flock, NULL); - -out: -        return ret; -} - - -static int -afr_mark_fd_opened (xlator_t *this, fd_t *fd, int32_t child_index) -{ -        afr_fd_ctx_t *fdctx = NULL; -        uint64_t      tmp   = 0; -        int           ret   = 0; - -        ret = fd_ctx_get (fd, this, &tmp); -        if (ret) -                goto out; - -        fdctx = (afr_fd_ctx_t *) (long) tmp; - -        fdctx->opened_on[child_index] = AFR_FD_OPENED; - -out: -        return ret; -} - -int32_t -afr_lock_recovery_preopen_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                               int32_t op_ret, int32_t op_errno, fd_t *fd, -                               dict_t *xdata) -{ -        int32_t child_index = (long )cookie; -        int ret = 0; - -        if (op_ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "Reopen during lock-recovery failed"); -                goto cleanup; -        } - -        gf_log (this->name, GF_LOG_DEBUG, -                "Open succeeded => proceed to recover locks"); - -        ret = afr_lock_recovery (frame, this); -        if (ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "Lock recovery failed"); -                goto cleanup; -        } - -        ret = afr_mark_fd_opened (this, fd, child_index); -        if (ret) { -                gf_log (this->name, GF_LOG_INFO, -                        "Marking fd open failed"); -                goto cleanup; -        } - -        return 0; - -cleanup: -        afr_lock_recovery_cleanup (frame, this); -        return 0; -} - -static int -afr_lock_recovery_preopen (call_frame_t *frame, xlator_t *this) -{ -        afr_private_t *priv  = NULL; -        afr_local_t   *local = NULL; -        uint64_t       tmp   = 0; -        afr_fd_ctx_t  *fdctx = NULL; -        loc_t          loc   = {0,}; -        int32_t        child_index = 0; -        int            ret   = 0; - -        priv  = this->private; -        local = frame->local; - -        GF_ASSERT (local && local->fd); - -        ret = fd_ctx_get (local->fd, this, &tmp); -        if (ret) -                gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to get the context of fd", -                        uuid_utoa (local->fd->inode->gfid)); -        fdctx = (afr_fd_ctx_t *) (long) tmp; -        /* TODO: instead we should return from the function */ -        GF_ASSERT (fdctx); - -        child_index = local->lock_recovery_child; - -        inode_path (local->fd->inode, NULL, (char **)&loc.path); -        loc.name   = strrchr (loc.path, '/'); -        loc.inode  = inode_ref (local->fd->inode); -        loc.parent = inode_parent (local->fd->inode, 0, NULL); - - -        STACK_WIND_COOKIE (frame, afr_lock_recovery_preopen_cbk, -                           (void *)(long) child_index, -                           priv->children[child_index], -                           priv->children[child_index]->fops->open, -                           &loc, fdctx->flags, local->fd, NULL); - -        return 0; -} - -static int -is_fd_opened (fd_t *fd, int32_t child_index) -{ -        afr_fd_ctx_t *fdctx = NULL; -        uint64_t      tmp = 0; -        int           ret = 0; - -        ret = fd_ctx_get (fd, THIS, &tmp); -        if (ret) -                goto out; - -        fdctx = (afr_fd_ctx_t *) (long) tmp; - -        if (fdctx->opened_on[child_index] == AFR_FD_OPENED) -                ret = 1; - -out: -        return ret; -} - -int -afr_attempt_lock_recovery (xlator_t *this, int32_t child_index) -{ -        call_frame_t    *frame      = NULL; -        afr_private_t   *priv       = NULL; -        afr_local_t     *local      = NULL; -        afr_locked_fd_t *locked_fd  = NULL; -        afr_locked_fd_t  *tmp       = NULL; -        int              ret        = -1; -        struct list_head locks_list = {0,}; -        int32_t          op_errno   = 0; - - -        priv = this->private; - -        if (list_empty (&priv->saved_fds)) -                goto out; - -        frame = create_frame (this, this->ctx->pool); -        if (!frame) { -                ret = -1; -                goto out; -        } - -        AFR_LOCAL_ALLOC_OR_GOTO (frame->local, out); -        local = frame->local; -        ret = afr_local_init (local, priv, &op_errno); -        if (ret < 0) { -                ret = -1; -                goto out; -        } - -        frame->local = local; - -        INIT_LIST_HEAD (&locks_list); - -        pthread_mutex_lock (&priv->mutex); -        { -                list_splice_init (&priv->saved_fds, &locks_list); -        } -        pthread_mutex_unlock (&priv->mutex); - -        list_for_each_entry_safe (locked_fd, tmp, -                                  &locks_list, list) { - -                list_del_init (&locked_fd->list); - -                local->fd                  = fd_ref (locked_fd->fd); -                local->lock_recovery_child = child_index; -                local->locked_fd           = locked_fd; - -                if (!is_fd_opened (locked_fd->fd, child_index)) { -                        gf_log (this->name, GF_LOG_DEBUG, -                                "attempting open before lock " -                                "recovery"); -                        afr_lock_recovery_preopen (frame, this); -                } else { -                        gf_log (this->name, GF_LOG_DEBUG, -                                "attempting lock recovery " -                                "without a preopen"); -                        afr_lock_recovery (frame, this); -                } -        } - -out: -        if ((ret < 0) && frame) -                AFR_STACK_DESTROY (frame); -        return ret; -} - -int  afr_lk_transfer_datalock (call_frame_t *dst, call_frame_t *src, char *dom,                            unsigned int child_count)  {  | 
