diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 3 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 50 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 1 | 
3 files changed, 50 insertions, 4 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index b5f060a8730..01341526097 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -1433,9 +1433,6 @@ afr_cleanup_fd_ctx (xlator_t *this, fd_t *fd)          fd_ctx = (afr_fd_ctx_t *)(long) ctx; -        gf_log (this->name, GF_LOG_TRACE, -                "hits=%d, miss=%d", fd_ctx->hit, fd_ctx->miss); -          if (fd_ctx) {                  if (fd_ctx->pre_op_done)                          GF_FREE (fd_ctx->pre_op_done); diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index e31f0c1df31..3cdd1829d91 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -404,7 +404,51 @@ afr_changelog_post_op_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  } -int +void +afr_update_read_child (call_frame_t *frame, xlator_t *this, inode_t *inode, +                       afr_transaction_type type) +{ +        int           curr_read_child = -1; +        int           new_read_child = -1; +        afr_private_t   *priv = NULL; +        afr_local_t  *local = NULL; +        int         **pending = NULL; +        int           idx = 0; + +        idx = afr_index_for_transaction_type (type); + +        priv = this->private; +        local = frame->local; +        curr_read_child = afr_read_child (this, inode); +        pending = local->pending; + +        if (pending[curr_read_child][idx] != 0) +                return; + +        /* need to set new read_child */ +        for (new_read_child = 0; new_read_child < priv->child_count; +             new_read_child++) { + +                if (!priv->child_up[new_read_child]) +                        /* child is down */ +                        continue; + +                if (pending[new_read_child][idx] == 0) +                        /* op just failed */ +                        continue; + +                break; +        } + +        if (new_read_child == priv->child_count) +                /* all children uneligible. leave as-is */ +                return; + +        afr_set_read_child (this, inode, new_read_child); +} + + +int   afr_changelog_post_op (call_frame_t *frame, xlator_t *this)  {  	afr_private_t * priv = this->private; @@ -426,6 +470,10 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)  	__mark_down_children (local->pending, priv->child_count,                                local->child_up, local->transaction.type); +        if (local->fd) +                afr_update_read_child (frame, this, local->fd->inode, +                                       local->transaction.type); +          xattr = alloca (priv->child_count * sizeof (*xattr));          memset (xattr, 0, (priv->child_count * sizeof (*xattr)));  	for (i = 0; i < priv->child_count; i++) { diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 749264a8d65..e64a6fe1529 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -609,6 +609,7 @@ typedef struct {          unsigned int *pre_op_done;          unsigned int *opened_on;     /* which subvolumes the fd is open on */          unsigned int *pre_op_piggyback; +          int flags;          int32_t wbflags;          uint64_t up_count;   /* number of CHILD_UPs this fd has seen */  | 
