diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 26 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 27 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 8 | 
3 files changed, 51 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 9a9ef2e90a5..ed1014ce154 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -303,6 +303,7 @@ afr_inode_write_fill (call_frame_t *frame, xlator_t *this, int child_index,          afr_local_t *local = frame->local;          uint32_t open_fd_count = 0;          uint32_t write_is_append = 0; +        int32_t num_inodelks = 0;          LOCK (&frame->lock);          { @@ -321,10 +322,19 @@ afr_inode_write_fill (call_frame_t *frame, xlator_t *this, int child_index,                                         &open_fd_count);                  if (ret < 0)                          goto unlock; -		if (open_fd_count > local->open_fd_count) { +                if (open_fd_count > local->open_fd_count) {                          local->open_fd_count = open_fd_count;                          local->update_open_fd_count = _gf_true; -		} +                } + +                ret = dict_get_int32(xdata, GLUSTERFS_INODELK_COUNT, +                                     &num_inodelks); +                if (ret < 0) +                        goto unlock; +                if (num_inodelks > local->num_inodelks) { +                        local->num_inodelks = num_inodelks; +                        local->update_num_inodelks = _gf_true; +                }          }  unlock:          UNLOCK (&frame->lock); @@ -334,6 +344,7 @@ void  afr_process_post_writev (call_frame_t *frame, xlator_t *this)  {          afr_local_t     *local = NULL; +        afr_lock_t *lock = NULL;          local = frame->local; @@ -352,6 +363,11 @@ afr_process_post_writev (call_frame_t *frame, xlator_t *this)          if (local->update_open_fd_count)                  local->inode_ctx->open_fd_count = local->open_fd_count; +        if (local->update_num_inodelks && +                local->transaction.type == AFR_DATA_TRANSACTION) { +                lock = &local->inode_ctx->lock[local->transaction.type]; +                lock->num_inodelks = local->num_inodelks; +        }  } @@ -537,6 +553,12 @@ afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,                  goto out;          } +        if (dict_set_str(local->xdata_req, GLUSTERFS_INODELK_DOM_COUNT, +                         this->name)) { +                op_errno = ENOMEM; +                goto out; +        } +  	if (dict_set_uint32 (local->xdata_req, GLUSTERFS_WRITE_IS_APPEND, 4)) {  		op_errno = ENOMEM;  		goto out; diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 0cd3373ff3d..9b128e5c1dc 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -1923,17 +1923,28 @@ afr_internal_lock_finish (call_frame_t *frame, xlator_t *this)  }  gf_boolean_t -afr_are_multiple_fds_opened (afr_local_t *local, xlator_t *this) +afr_are_conflicting_ops_waiting(afr_local_t *local, xlator_t *this)  { +        afr_lock_t *lock = NULL; +        lock = &local->inode_ctx->lock[local->transaction.type]; +          /* Lets say mount1 has eager-lock(full-lock) and after the eager-lock -         * is taken mount2 opened the same file, it won't be able to -         * perform any data operations until mount1 releases eager-lock. -         * To avoid such scenario do not enable eager-lock for this transaction -         * if open-fd-count is > 1 +         * is taken mount2 opened the same file, it won't be able to perform +         * any {meta,}data operations until mount1 releases eager-lock.  To +         * avoid such scenario do not enable eager-lock for this transaction if +         * open-fd-count is > 1 for metadata transactions and if +         * num-inodelks > 1 for data transactions           */ -        if (local->inode_ctx->open_fd_count > 1) -                return _gf_true; +        if (local->transaction.type == AFR_METADATA_TRANSACTION) { +                if (local->inode_ctx->open_fd_count > 1) { +                    return _gf_true; +                } +        } else if (local->transaction.type == AFR_DATA_TRANSACTION) { +                if (lock->num_inodelks > 1) { +                    return _gf_true; +                } +        }          return _gf_false;  } @@ -1955,7 +1966,7 @@ afr_is_delayed_changelog_post_op_needed (call_frame_t *frame, xlator_t *this,                  goto out;          } -        if (afr_are_multiple_fds_opened (local, this)) { +        if (afr_are_conflicting_ops_waiting(local, this)) {                  lock->release = _gf_true;                  goto out;          } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 6fc555148c4..a0eb4533aa8 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -307,6 +307,12 @@ typedef enum {  } afr_fop_lock_state_t;  typedef struct _afr_inode_lock_t { +        /* @num_inodelks: +           Number of inodelks queried from the server, as queried through +           xdata in FOPs. Currently, used to decide if eager-locking must be +           temporarily disabled. +        */ +        int32_t num_inodelks;          unsigned int event_generation;          gf_boolean_t    release;          gf_boolean_t    acquired; @@ -359,6 +365,8 @@ typedef struct _afr_local {          uint32_t     open_fd_count;          gf_boolean_t update_open_fd_count; +        int32_t num_inodelks; +        gf_boolean_t update_num_inodelks;  	gf_lkowner_t  saved_lk_owner;  | 
