diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 68 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.c | 38 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 8 | 
3 files changed, 101 insertions, 13 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index ff9c88badd3..d48d6eb72f4 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -513,6 +513,14 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)                  }          } +        index = afr_index_for_transaction_type (local->transaction.type); +        if (local->optimistic_change_log && +            local->transaction.type != AFR_DATA_TRANSACTION) { +                /* if nothing_failed, then local->pending[..] == {0 .. 0} */ +                for (i = 0; i < priv->child_count; i++) +                        local->pending[i][index]++; +        } +  	for (i = 0; i < priv->child_count; i++) {  		if (!local->child_up[i])                          continue; @@ -568,6 +576,12 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)                  break;                  case AFR_METADATA_TRANSACTION:                  { +                        if (nothing_failed) { +                                afr_changelog_post_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                                break; +                        } +                          if (local->fd)                                  STACK_WIND (frame, afr_changelog_post_op_cbk,                                              priv->children[i], @@ -585,12 +599,17 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)                  case AFR_ENTRY_RENAME_TRANSACTION:                  { -                        STACK_WIND_COOKIE (frame, afr_changelog_post_op_cbk, -                                           (void *) (long) i, -                                           priv->children[i], -                                           priv->children[i]->fops->xattrop, -                                           &local->transaction.new_parent_loc, -                                           GF_XATTROP_ADD_ARRAY, xattr[i]); +                        if (nothing_failed) { +                                afr_changelog_post_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                        } else { +                                STACK_WIND_COOKIE (frame, afr_changelog_post_op_cbk, +                                                   (void *) (long) i, +                                                   priv->children[i], +                                                   priv->children[i]->fops->xattrop, +                                                   &local->transaction.new_parent_loc, +                                                   GF_XATTROP_ADD_ARRAY, xattr[i]); +                        }                          call_count--;                  } @@ -613,6 +632,12 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)                  case AFR_ENTRY_TRANSACTION:                  { +                        if (nothing_failed) { +                                afr_changelog_post_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                                break; +                        } +                          if (local->fd)                                  STACK_WIND (frame, afr_changelog_post_op_cbk,                                              priv->children[i], @@ -808,6 +833,12 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)                  break;                  case AFR_METADATA_TRANSACTION:                  { +                        if (local->optimistic_change_log) { +                                afr_changelog_pre_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                                break; +                        } +                          if (local->fd)                                  STACK_WIND_COOKIE (frame,                                                     afr_changelog_pre_op_cbk, @@ -829,13 +860,18 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)                  case AFR_ENTRY_RENAME_TRANSACTION:                  { -                        STACK_WIND_COOKIE (frame, -                                           afr_changelog_pre_op_cbk, -                                           (void *) (long) i, -                                           priv->children[i], -                                           priv->children[i]->fops->xattrop, -                                           &local->transaction.new_parent_loc, -                                           GF_XATTROP_ADD_ARRAY, xattr[i]); +                        if (local->optimistic_change_log) { +                                afr_changelog_pre_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                        } else { +                                STACK_WIND_COOKIE (frame, +                                                   afr_changelog_pre_op_cbk, +                                                   (void *) (long) i, +                                                   priv->children[i], +                                                   priv->children[i]->fops->xattrop, +                                                   &local->transaction.new_parent_loc, +                                                   GF_XATTROP_ADD_ARRAY, xattr[i]); +                        }                          call_count--;                  } @@ -860,6 +896,12 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)                  case AFR_ENTRY_TRANSACTION:                  { +                        if (local->optimistic_change_log) { +                                afr_changelog_pre_op_cbk (frame, (void *)(long)i, +                                                          this, 1, 0, xattr[i]); +                                break; +                        } +                          if (local->fd)                                  STACK_WIND_COOKIE (frame,                                                     afr_changelog_pre_op_cbk, diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 775a53a8fba..cb458250597 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -71,6 +71,7 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)          gf_boolean_t metadata_change_log;           gf_boolean_t entry_change_log;                gf_boolean_t strict_readdir; +        gf_boolean_t optimistic_change_log;          xlator_list_t * trav        = NULL; @@ -257,6 +258,26 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)                                          "change-log %s'.", change_log);          } + +        dict_ret = dict_get_str (options, "optimistic-change-log", +                                 &change_log); +        if (dict_ret == 0) { +                temp_ret = gf_string2boolean (change_log, &optimistic_change_log); +                if (temp_ret < 0) { +                        gf_log (this->name, GF_LOG_WARNING, +                                "Validation faled for optimistic-change-log"); +                        *op_errstr = gf_strdup ("Error, option should be boolean"); +                        ret = -1; +                        goto out; +                } +  + +                gf_log (this->name, GF_LOG_DEBUG, +                        "Validated 'option optimistic-" +                                        "change-log %s'.", change_log); +        } + +          read_ret = dict_get_str (options, "read-subvolume", &read_subvol);          if (read_ret)  @@ -674,6 +695,7 @@ init (xlator_t *this)  	priv->data_change_log     = 1;  	priv->metadata_change_log = 1;  	priv->entry_change_log    = 1; +        priv->optimistic_change_log = 1;  	dict_ret = dict_get_str (this->options, "data-change-log",  				 &change_log); @@ -715,6 +737,19 @@ init (xlator_t *this)  		}   	} +	dict_ret = dict_get_str (this->options, "optimistic-change-log", +				 &change_log); +	if (dict_ret == 0) { +		ret = gf_string2boolean (change_log, &priv->optimistic_change_log); +		if (ret < 0) { +			gf_log (this->name, GF_LOG_WARNING, +				"Invalid 'option optimistic-change-log %s'. " +				"Defaulting to optimistic-change-log as 'on'.",  +				change_log); +			priv->optimistic_change_log = 1; +		}  +	} +  	/* Locking options */          priv->inodelk_trace = 0; @@ -994,6 +1029,9 @@ struct volume_options options[] = {  	{ .key  = {"entry-change-log"},    	  .type = GF_OPTION_TYPE_BOOL  	}, +	{ .key  = {"optimistic-change-log"},   +	  .type = GF_OPTION_TYPE_BOOL +	},  	{ .key  = {"data-lock-server-count"},    	  .type = GF_OPTION_TYPE_INT,   	  .min  = 0 diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 758ac789aff..a7359f26963 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -88,6 +88,7 @@ typedef struct _afr_private {          pthread_mutex_t  mutex;          struct list_head saved_fds;   /* list of fds on which locks have succeeded */ +        gf_boolean_t     optimistic_change_log;  } afr_private_t;  typedef struct { @@ -312,6 +313,7 @@ typedef struct _afr_local {          int32_t          lock_recovery_child;          dict_t  *dict; +        int      optimistic_change_log;          int (*openfd_flush_cbk) (call_frame_t *frame, xlator_t *this); @@ -805,6 +807,8 @@ AFR_BASENAME (const char *str)  static inline int  AFR_LOCAL_INIT (afr_local_t *local, afr_private_t *priv)  { +        int  child_up_count = 0; +  	local->child_up = GF_CALLOC (sizeof (*local->child_up),                                       priv->child_count,                                       gf_afr_mt_char); @@ -815,6 +819,10 @@ AFR_LOCAL_INIT (afr_local_t *local, afr_private_t *priv)  	memcpy (local->child_up, priv->child_up,  		sizeof (*local->child_up) * priv->child_count); +        child_up_count = afr_up_children_count (priv->child_count, local->child_up); + +        if (priv->optimistic_change_log && child_up_count == priv->child_count) +                local->optimistic_change_log = 1;  	local->call_count = afr_up_children_count (priv->child_count, local->child_up);  	if (local->call_count == 0)  | 
