diff options
| -rw-r--r-- | tests/basic/afr/compounded-write-txns.t | 37 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 43 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 333 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.h | 4 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.c | 10 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 13 | 
6 files changed, 7 insertions, 433 deletions
diff --git a/tests/basic/afr/compounded-write-txns.t b/tests/basic/afr/compounded-write-txns.t deleted file mode 100644 index 7cecd87b01b..00000000000 --- a/tests/basic/afr/compounded-write-txns.t +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -cleanup - -TEST glusterd -TEST pidof glusterd -TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2} -TEST $CLI volume set $V0 write-behind off -TEST $CLI volume set $V0 client-io-threads off -TEST $CLI volume start $V0 -TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 - -# Create and generate data into a src file - -TEST `printf %1024s |tr " " "1" > /tmp/source` -TEST `printf %1024s |tr " " "2" >> /tmp/source` - -TEST dd if=/tmp/source of=$M0/file bs=1024 count=2 2>/dev/null -md5sum_file=$(md5sum $M0/file | awk '{print $1}') - -TEST $CLI volume set $V0 cluster.use-compound-fops on - -TEST dd if=$M0/file of=$M0/file-copy bs=1024 count=2 2>/dev/null - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 -TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0 - -EXPECT "$md5sum_file" echo `md5sum $M0/file-copy | awk '{print $1}'` - -EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 -TEST $CLI volume stop $V0 -TEST $CLI volume delete $V0 - -TEST rm -f /tmp/source -cleanup diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 0052968e0e4..d8fee88c7df 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -40,7 +40,6 @@  #include "afr-self-heal.h"  #include "afr-self-heald.h"  #include "afr-messages.h" -#include "compound-fop-utils.h"  int32_t  afr_quorum_errno (afr_private_t *priv) @@ -5318,7 +5317,6 @@ afr_local_init (afr_local_t *local, afr_private_t *priv, int32_t *op_errno)          local->need_full_crawl = _gf_false; -        local->compound = _gf_false;          INIT_LIST_HEAD (&local->healer);  	return 0;  out: @@ -5465,7 +5463,6 @@ afr_transaction_local_init (afr_local_t *local, xlator_t *this)          if (!local->pending)                  goto out; -        local->compound = _gf_false;  	INIT_LIST_HEAD (&local->transaction.eager_locked);          ret = 0; @@ -6220,46 +6217,6 @@ afr_get_msg_id (char *op_type)          return -1;  } -gf_boolean_t -afr_can_compound_pre_op_and_op (afr_private_t *priv, glusterfs_fop_t fop) -{ -        if (priv->arbiter_count != 0) -                return _gf_false; - -        if (!priv->use_compound_fops) -                return _gf_false; - -        switch (fop) { -        case GF_FOP_WRITE: -                return _gf_true; -        default: -                return _gf_false; -        } -} - -afr_compound_cbk_t -afr_pack_fop_args (call_frame_t *frame, compound_args_t *args, -                   glusterfs_fop_t fop, int index) -{ -        afr_local_t     *local  = frame->local; - -        switch (fop) { -        case GF_FOP_WRITE: -                COMPOUND_PACK_ARGS (writev, GF_FOP_WRITE, -                                    args, index, -                                    local->fd, local->cont.writev.vector, -                                    local->cont.writev.count, -                                    local->cont.writev.offset, -                                    local->cont.writev.flags, -                                    local->cont.writev.iobref, -                                    local->xdata_req); -                return afr_pre_op_writev_cbk; -        default: -                break; -        } -        return NULL; -} -  int  afr_fav_child_reset_sink_xattrs_cbk (int ret, call_frame_t *heal_frame,                                       void *opaque) diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 1f4ba71d5f8..a9f5d3db19c 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -17,7 +17,6 @@  #include "afr-transaction.h"  #include "afr-self-heal.h"  #include "afr-messages.h" -#include "compound-fop-utils.h"  #include <signal.h> @@ -38,10 +37,6 @@ afr_changelog_call_count (afr_transaction_type type,                            unsigned char *failed_subvols,                            unsigned int child_count);  int -afr_post_op_unlock_do (call_frame_t *frame, xlator_t *this, dict_t *xattr, -                       afr_changelog_resume_t changelog_resume, -                       afr_xattrop_type_t op); -int  afr_changelog_do (call_frame_t *frame, xlator_t *this, dict_t *xattr,  		  afr_changelog_resume_t changelog_resume,                    afr_xattrop_type_t op); @@ -847,12 +842,10 @@ afr_changelog_post_op_now (call_frame_t *frame, xlator_t *this)          afr_private_t           *priv           = this->private;          afr_local_t             *local          = NULL;          dict_t                  *xattr          = NULL; -        afr_fd_ctx_t            *fd_ctx         = NULL;          int                     i               = 0;          int                     ret             = 0;          int                     idx             = 0;          int                     nothing_failed  = 1; -        gf_boolean_t            compounded_unlock = _gf_true;          gf_boolean_t            need_undirty    = _gf_false;          afr_handle_quorum (frame); @@ -918,36 +911,8 @@ afr_changelog_post_op_now (call_frame_t *frame, xlator_t *this)  		goto out;  	} -        if (local->compound && local->fd) { -                LOCK (&local->fd->lock); -                { -                        fd_ctx = __afr_fd_ctx_get (local->fd, this); -                        for (i = 0; i < priv->child_count; i++) { -                                if (local->transaction.pre_op[i] && -                                    local->transaction.eager_lock[i]) { -                                        if (fd_ctx->lock_piggyback[i]) -                                                compounded_unlock = _gf_false; -                                        else if (fd_ctx->lock_acquired[i]) -                                                compounded_unlock = _gf_false; -                                } -                                if (compounded_unlock == _gf_false) -                                        break; -                        } -                } -                UNLOCK (&local->fd->lock); -        } - -        /* Do not compound if any brick got piggybacked lock as -         * unlock should not be done for that. */ -        if (local->compound && compounded_unlock) { -                afr_post_op_unlock_do (frame, this, xattr, -                                       afr_changelog_post_op_done, -                                       AFR_TRANSACTION_POST_OP); -        } else { -                afr_changelog_do (frame, this, xattr, -                                  afr_changelog_post_op_done, -                                  AFR_TRANSACTION_POST_OP); -        } +        afr_changelog_do (frame, this, xattr, afr_changelog_post_op_done, +                          AFR_TRANSACTION_POST_OP);  out:  	if (xattr)                  dict_unref (xattr); @@ -1275,66 +1240,6 @@ out:  }  int -afr_pre_op_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                       int op_ret, int op_errno, -                       void *data, dict_t *xdata) -{ -        afr_local_t *local = NULL; -        call_frame_t    *fop_frame = NULL; -        default_args_cbk_t *write_args_cbk = NULL; -        compound_args_cbk_t *args_cbk = data; -        int call_count = -1; -        int child_index = -1; - -        local = frame->local; -        child_index = (long) cookie; - -	if (local->pre_op_compat) -		afr_changelog_pre_op_update (frame, this); - -        if (op_ret == -1) { -                local->op_errno = op_errno; -		afr_transaction_fop_failed (frame, this, child_index); -        } - -        /* If the compound fop failed due to saved_frame_unwind(), then -         * protocol/client fails it even before args_cbk is allocated. -         * Handle that case by passing the op_ret, op_errno values explicitly. -         */ -        if ((op_ret == -1) && (args_cbk == NULL)) { -                afr_inode_write_fill  (frame, this, child_index, op_ret, -                                       op_errno, NULL, NULL, NULL); -        } else { -                write_args_cbk = &args_cbk->rsp_list[1]; -                afr_inode_write_fill  (frame, this, child_index, -                                       write_args_cbk->op_ret, -                                       write_args_cbk->op_errno, -                                       &write_args_cbk->prestat, -                                       &write_args_cbk->poststat, -                                       write_args_cbk->xdata); -        } - -	call_count = afr_frame_return (frame); - -        if (call_count == 0) { -                compound_args_cleanup (local->c_args); -                local->c_args = NULL; -                afr_process_post_writev (frame, this); -                if (!afr_txn_nothing_failed (frame, this)) { -                        /* Don't unwind until post-op is complete */ -                        local->transaction.resume (frame, this); -                } else { -                /* frame change, place frame in post-op delay and unwind */ -                        fop_frame = afr_transaction_detach_fop_frame (frame); -                        afr_writev_copy_outvars (frame, fop_frame); -                        local->transaction.resume (frame, this); -                        afr_writev_unwind (fop_frame, this); -                } -        } -        return 0; -} - -int  afr_changelog_prepare (xlator_t *this, call_frame_t *frame, int *call_count,                         afr_changelog_resume_t changelog_resume,                         afr_xattrop_type_t op, dict_t **xdata, @@ -1364,223 +1269,6 @@ afr_changelog_prepare (xlator_t *this, call_frame_t *frame, int *call_count,  }  int -afr_pre_op_fop_do (call_frame_t *frame, xlator_t *this, dict_t *xattr, -                   afr_changelog_resume_t changelog_resume, -                   afr_xattrop_type_t op) -{ -        afr_local_t *local = NULL; -        afr_private_t *priv = NULL; -        dict_t *xdata = NULL; -        dict_t *newloc_xdata = NULL; -        compound_args_t *args = NULL; -        int i = 0, call_count = 0; -        afr_compound_cbk_t compound_cbk; -        int ret = 0; -        int op_errno = ENOMEM; - -        local = frame->local; -        priv = this->private; - -        /* If lock failed on all, just unlock and unwind */ -        ret = afr_changelog_prepare (this, frame, &call_count, changelog_resume, -                                     op, &xdata, &newloc_xdata); - -        if (ret) -                return 0; - -        local->call_count = call_count; - -        afr_save_lk_owner (frame); -        frame->root->lk_owner = -                local->transaction.main_frame->root->lk_owner; - -        args = compound_fop_alloc (2, GF_CFOP_XATTROP_WRITEV, NULL); - -        if (!args) -                goto err; - -        /* pack pre-op part */ -        i = 0; -        COMPOUND_PACK_ARGS (fxattrop, GF_FOP_FXATTROP, -                            args, i, -                            local->fd, GF_XATTROP_ADD_ARRAY, -                            xattr, xdata); -        i++; -        /* pack whatever fop needs to be packed -         * @compound_cbk holds the cbk that would need to be called -         */ -        compound_cbk = afr_pack_fop_args (frame, args, local->op, i); - -        local->c_args = args; - -        for (i = 0; i < priv->child_count; i++) { -                /* Means lock did not succeed on this brick */ -                if (!local->transaction.pre_op[i] || -                    local->transaction.failed_subvols[i]) -                        continue; - -                STACK_WIND_COOKIE (frame, compound_cbk, -                                   (void *) (long) i, -                                   priv->children[i], -                                   priv->children[i]->fops->compound, -                                   args, -                                   NULL); -                if (!--call_count) -                        break; -        } - -        if (xdata) -                dict_unref (xdata); -        if (newloc_xdata) -                dict_unref (newloc_xdata); -        return 0; -err: -	local->internal_lock.lock_cbk = local->transaction.done; -	local->op_ret = -1; -	local->op_errno = op_errno; - -        afr_restore_lk_owner (frame); -	afr_unlock (frame, this); - -        if (xdata) -                dict_unref (xdata); -        if (newloc_xdata) -                dict_unref (newloc_xdata); -	return 0; -} - -int -afr_post_op_unlock_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                       int op_ret, int op_errno, -                       void *data, dict_t *xdata) -{ -        afr_local_t *local = NULL; -        int call_count = -1; -        afr_internal_lock_t *int_lock = NULL; -        int32_t             child_index = (long)cookie; - -        local = frame->local; -        child_index = (long) cookie; - -        local = frame->local; -        int_lock = &local->internal_lock; - -        afr_update_uninodelk (local, int_lock, child_index); - -        LOCK (&frame->lock); -        { -                call_count = --int_lock->lk_call_count; -        } -        UNLOCK (&frame->lock); - -        if (call_count == 0) { -                compound_args_cleanup (local->c_args); -                local->c_args = NULL; -                if (local->transaction.resume_stub) { -                        call_resume (local->transaction.resume_stub); -                        local->transaction.resume_stub = NULL; -                } -                gf_msg_trace (this->name, 0, -                              "All internal locks unlocked"); -                int_lock->lock_cbk (frame, this); -        } - -        return 0; -} - -int -afr_post_op_unlock_do (call_frame_t *frame, xlator_t *this, dict_t *xattr, -		       afr_changelog_resume_t changelog_resume, -                       afr_xattrop_type_t op) -{ -	afr_local_t             *local          = NULL; -	afr_private_t           *priv           = NULL; -        dict_t                  *xdata          = NULL; -        dict_t                  *newloc_xdata   = NULL; -        compound_args_t         *args           = NULL; -        afr_internal_lock_t     *int_lock       = NULL; -        afr_inodelk_t           *inodelk        = NULL; -	int                     i               = 0; -	int                     call_count      = 0; -        struct gf_flock         flock           = {0,}; -        int                     ret             = 0; - -	local = frame->local; -	priv = this->private; -        int_lock = &local->internal_lock; - -        if (afr_is_inodelk_transaction(local)) { -                inodelk = afr_get_inodelk (int_lock, int_lock->domain); - -                flock.l_start = inodelk->flock.l_start; -                flock.l_len   = inodelk->flock.l_len; -                flock.l_type  = F_UNLCK; -        } - -        ret = afr_changelog_prepare (this, frame, &call_count, changelog_resume, -                                     op, &xdata, &newloc_xdata); - -        if (ret) -                return 0; - -        int_lock->lk_call_count = call_count; - -        int_lock->lock_cbk = local->transaction.done; - -        args = compound_fop_alloc (2, GF_CFOP_XATTROP_UNLOCK, NULL); - -        if (!args) { -		local->op_ret = -1; -		local->op_errno = ENOMEM; -		afr_changelog_post_op_done (frame, this); -		goto out; -	} - -        i = 0; -        COMPOUND_PACK_ARGS (fxattrop, GF_FOP_FXATTROP, -                            args, i, -                            local->fd, GF_XATTROP_ADD_ARRAY, -                            xattr, xdata); -        i++; - -        if (afr_is_inodelk_transaction(local)) { -                if (local->fd) { -                        COMPOUND_PACK_ARGS (finodelk, GF_FOP_FINODELK, -                                            args, i, -                                            int_lock->domain, local->fd, -                                            F_SETLK, &flock, NULL); -                } else { -                        COMPOUND_PACK_ARGS (inodelk, GF_FOP_INODELK, -                                            args, i, -                                            int_lock->domain, &local->loc, -                                            F_SETLK, &flock, NULL); -                } -        } - -        local->c_args = args; - -        for (i = 0; i < priv->child_count; i++) { -                if (!local->transaction.pre_op[i] || -                    local->transaction.failed_subvols[i]) -                        continue; -                STACK_WIND_COOKIE (frame, afr_post_op_unlock_cbk, -                                   (void *) (long) i, -                                   priv->children[i], -                                   priv->children[i]->fops->compound, -                                   args, -                                   NULL); -                if (!--call_count) -                        break; -        } -out: -        if (xdata) -                dict_unref (xdata); -        if (newloc_xdata) -                dict_unref (newloc_xdata); -        return 0; -} - -int  afr_changelog_do (call_frame_t *frame, xlator_t *this, dict_t *xattr,  		  afr_changelog_resume_t changelog_resume,                    afr_xattrop_type_t op) @@ -1791,21 +1479,8 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)  		goto next;  	} -	/* Till here we have already decided if pre-op needs to be done, -         * based on various criteria. The only thing that needs to be checked -         * now on is whether compound-fops is enabled or not. -         * If it is, then perform pre-op and fop together for writev op. -         */ -        if (afr_can_compound_pre_op_and_op (priv, local->op)) { -                local->compound = _gf_true; -                afr_pre_op_fop_do (frame, this, xdata_req, -                                   afr_transaction_perform_fop, -                                   AFR_TRANSACTION_PRE_OP); -        } else { -                afr_changelog_do (frame, this, xdata_req, -                                  afr_transaction_perform_fop, -                                  AFR_TRANSACTION_PRE_OP); -        } +        afr_changelog_do (frame, this, xdata_req, afr_transaction_perform_fop, +                          AFR_TRANSACTION_PRE_OP);  	if (xdata_req)  		dict_unref (xdata_req); diff --git a/xlators/cluster/afr/src/afr-transaction.h b/xlators/cluster/afr/src/afr-transaction.h index dd19e5b2b18..d01e1449129 100644 --- a/xlators/cluster/afr/src/afr-transaction.h +++ b/xlators/cluster/afr/src/afr-transaction.h @@ -58,7 +58,5 @@ afr_pick_error_xdata (afr_local_t *local, afr_private_t *priv,                        inode_t *inode1, unsigned char *readable1,                        inode_t *inode2, unsigned char *readable2);  int -afr_pre_op_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                       int op_ret, int op_errno, -                       void *data, dict_t *xdata); +afr_transaction_resume (call_frame_t *frame, xlator_t *this);  #endif /* __TRANSACTION_H__ */ diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 3467729c345..4036ae9b338 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -245,9 +245,6 @@ reconfigure (xlator_t *this, dict_t *options)          GF_OPTION_RECONF ("locking-scheme", priv->locking_scheme, options, str,                            out);          GF_OPTION_RECONF ("full-lock", priv->full_lock, options, bool, out); -        GF_OPTION_RECONF ("use-compound-fops", priv->use_compound_fops, -                          options, bool, -                          out);          GF_OPTION_RECONF ("granular-entry-heal", priv->esh_granular, options,                            bool, out); @@ -509,8 +506,6 @@ init (xlator_t *this)          GF_OPTION_INIT ("pre-op-compat", priv->pre_op_compat, bool, out);          GF_OPTION_INIT ("locking-scheme", priv->locking_scheme, str, out);          GF_OPTION_INIT ("full-lock", priv->full_lock, bool, out); -        GF_OPTION_INIT ("use-compound-fops", priv->use_compound_fops, -                        bool, out);          GF_OPTION_INIT ("granular-entry-heal", priv->esh_granular, bool, out);          GF_OPTION_INIT ("eager-lock", priv->eager_lock, bool, out); @@ -1205,9 +1200,8 @@ struct volume_options options[] = {            .op_version = {GD_OP_VERSION_3_8_4},            .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,            .tags = {"replicate"}, -          .description = "Use compound fops framework to modify afr " -                         "transaction such that network roundtrips are " -                         "reduced, thus improving the performance.", +          .description = "This option exists only for backward compatibility " +                         "and configuring it doesn't have any effect"          },          { .key  = {NULL} },  }; diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 88d80f07a3c..83439eea1da 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -44,10 +44,6 @@ typedef int (*afr_inode_refresh_cbk_t) (call_frame_t *frame, xlator_t *this, int  typedef int (*afr_changelog_resume_t) (call_frame_t *frame, xlator_t *this); -typedef int (*afr_compound_cbk_t) (call_frame_t *frame, void *cookie, -                                   xlator_t *this, int op_ret, int op_errno, -                                   void *data, dict_t *xdata); -  #define AFR_COUNT(array,max) ({int __i; int __res = 0; for (__i = 0; __i < max; __i++) if (array[__i]) __res++; __res;})  #define AFR_INTERSECT(dst,src1,src2,max) ({int __i; for (__i = 0; __i < max; __i++) dst[__i] = src1[__i] && src2[__i];})  #define AFR_CMP(a1,a2,len) ({int __cmp = 0; int __i; for (__i = 0; __i < len; __i++) if (a1[__i] != a2[__i]) { __cmp = 1; break;} __cmp;}) @@ -180,7 +176,6 @@ typedef struct _afr_private {          gf_boolean_t           full_lock;          gf_boolean_t           esh_granular;          gf_boolean_t           consistent_io; -        gf_boolean_t           use_compound_fops;  } afr_private_t; @@ -843,9 +838,7 @@ typedef struct _afr_local {          call_frame_t *heal_frame;          gf_boolean_t need_full_crawl; -        gf_boolean_t compound;          afr_fop_lock_state_t fop_lock_state; -        compound_args_t *c_args;          gf_boolean_t is_read_txn;          afr_inode_ctx_t *inode_ctx; @@ -1252,12 +1245,6 @@ afr_writev_copy_outvars (call_frame_t *src_frame, call_frame_t *dst_frame);  void  afr_update_uninodelk (afr_local_t *local, afr_internal_lock_t *int_lock,                      int32_t child_index); -gf_boolean_t -afr_can_compound_pre_op_and_op (afr_private_t *priv, glusterfs_fop_t fop); - -afr_compound_cbk_t -afr_pack_fop_args (call_frame_t *frame, compound_args_t *args, -                   glusterfs_fop_t fop, int index);  int  afr_is_inodelk_transaction(afr_local_t *local);  | 
