diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 1 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 29 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 12 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 10 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-metadata.c | 22 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heald.c | 3 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.c | 7 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 1 | 
9 files changed, 57 insertions, 31 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 7f6bf74abd9..e0f530f999a 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -1886,6 +1886,7 @@ afr_local_discovery_cbk (call_frame_t *frame, void *cookie, xlator_t *this,           * the slowest local subvolume is far preferable to a remote one.           */          if (is_local) { +                priv->local[child_index] = 1;                  /* Don't set arbiter as read child. */                  if (AFR_IS_ARBITER_BRICK(priv, child_index))                          goto out; diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 74e1a444069..f12ce81b0ee 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1532,3 +1532,32 @@ afr_throttled_selfheal (call_frame_t *frame, xlator_t *this)                                        "pending, background self-heal rejected.");          }  } + +int +afr_choose_source_by_policy (afr_private_t *priv, unsigned char *sources, +                             afr_transaction_type type) +{ +        int source = -1; +        int i      = 0; + +        /* Give preference to local child to save on bandwidth */ +        for (i = 0; i < priv->child_count; i++) { +                if (priv->local[i] && sources[i]) { +                        if ((type == AFR_DATA_TRANSACTION) && +                            AFR_IS_ARBITER_BRICK (priv, i)) +                                continue; + +                        source = i; +                        goto out; +                } +        } + +        for (i = 0; i < priv->child_count; i++) { +                if (sources[i]) { +                        source = i; +                        goto out; +                } +        } +out: +        return source; +} diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 27d2849c158..a2dddafe5c0 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -572,7 +572,6 @@ __afr_selfheal_data_finalize_source (call_frame_t *frame, xlator_t *this,  				     struct afr_reply *replies,                                       uint64_t *witness)  { -	int i = 0;  	afr_private_t *priv = NULL;  	int source = -1;  	int sources_count = 0; @@ -609,13 +608,9 @@ __afr_selfheal_data_finalize_source (call_frame_t *frame, xlator_t *this,  out:          afr_mark_active_sinks (this, sources, locked_on, healed_sinks); +        source = afr_choose_source_by_policy (priv, sources, +                                              AFR_DATA_TRANSACTION); -        for (i = 0; i < priv->child_count; i++) { -                if (sources[i]) { -                        source = i; -                        break; -                } -        }  	return source;  } @@ -729,8 +724,7 @@ __afr_selfheal_data (call_frame_t *frame, xlator_t *this, fd_t *fd,  		source = ret; -                if (AFR_IS_ARBITER_BRICK(priv, source) && -                    AFR_COUNT (sources, priv->child_count) == 1) { +                if (AFR_IS_ARBITER_BRICK(priv, source)) {                          did_sh = _gf_false;                          goto unlock;                  } diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index 42a6c0453b1..e4d616ea20a 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -356,7 +356,6 @@ __afr_selfheal_entry_finalize_source (xlator_t *this, unsigned char *sources,                                        struct afr_reply *replies,                                        uint64_t *witness)  { -	int i = 0;  	afr_private_t *priv = NULL;  	int source = -1;  	int sources_count = 0; @@ -373,13 +372,8 @@ __afr_selfheal_entry_finalize_source (xlator_t *this, unsigned char *sources,  		return -1;  	} -	for (i = 0; i < priv->child_count; i++) { -		if (sources[i]) { -			source = i; -			break; -		} -	} - +        source = afr_choose_source_by_policy (priv, sources, +                                              AFR_ENTRY_TRANSACTION);  	return source;  } diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c index 24b139ad216..65c25abcb4a 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -204,7 +204,7 @@ __afr_selfheal_metadata_finalize_source (call_frame_t *frame, xlator_t *this,  {  	int i = 0;  	afr_private_t *priv = NULL; -	struct iatt first = {0, }; +	struct iatt srcstat = {0, };  	int source = -1;  	int sources_count = 0; @@ -257,23 +257,17 @@ __afr_selfheal_metadata_finalize_source (call_frame_t *frame, xlator_t *this,          if (afr_dict_contains_heal_op(frame))                  return -EIO; -	for (i = 0; i < priv->child_count; i++) { -		if (!sources[i]) -			continue; -		if (source == -1) { -			source = i; -			first = replies[i].poststat; -                        break; -		} -	} +        source = afr_choose_source_by_policy (priv, sources, +                                              AFR_METADATA_TRANSACTION); +        srcstat = replies[source].poststat;  	for (i = 0; i < priv->child_count; i++) {  		if (!sources[i] || i == source)  			continue; -		if (!IA_EQUAL (first, replies[i].poststat, type) || -		    !IA_EQUAL (first, replies[i].poststat, uid) || -		    !IA_EQUAL (first, replies[i].poststat, gid) || -		    !IA_EQUAL (first, replies[i].poststat, prot)) { +		if (!IA_EQUAL (srcstat, replies[i].poststat, type) || +		    !IA_EQUAL (srcstat, replies[i].poststat, uid) || +		    !IA_EQUAL (srcstat, replies[i].poststat, gid) || +		    !IA_EQUAL (srcstat, replies[i].poststat, prot)) {                          gf_msg_debug (this->name, 0, "%s: iatt mismatch "                                        "for source(%d) vs (%d)",                                        uuid_utoa diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h index b298fa130c3..b0f545f2816 100644 --- a/xlators/cluster/afr/src/afr-self-heal.h +++ b/xlators/cluster/afr/src/afr-self-heal.h @@ -266,4 +266,7 @@ afr_selfheal_lock_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int  afr_locked_fill (call_frame_t *frame, xlator_t *this,                   unsigned char *locked_on); +int +afr_choose_source_by_policy (afr_private_t *priv, unsigned char *sources, +                             afr_transaction_type type);  #endif /* !_AFR_SELFHEAL_H */ diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c index c539e117607..228ea388662 100644 --- a/xlators/cluster/afr/src/afr-self-heald.c +++ b/xlators/cluster/afr/src/afr-self-heald.c @@ -516,14 +516,17 @@ afr_shd_index_healer (void *data)  	struct subvol_healer *healer = NULL;  	xlator_t *this = NULL;  	int ret = 0; +	afr_private_t *priv = NULL;  	healer = data;  	THIS = this = healer->this; +	priv = this->private;  	for (;;) {  		afr_shd_healer_wait (healer);  		ASSERT_LOCAL(this, healer); +		priv->local[healer->subvol] = healer->local;  		do {  		        gf_msg_debug (this->name, 0, diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 535f3e5b946..2c7e69aae3b 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -387,6 +387,13 @@ init (xlator_t *this)          priv->wait_count = 1; +        priv->local = GF_CALLOC (sizeof (unsigned char), child_count, +                                 gf_afr_mt_char); +        if (!priv->local) { +                ret = -ENOMEM; +                goto out; +        } +          priv->child_up = GF_CALLOC (sizeof (unsigned char), child_count,                                      gf_afr_mt_char);          if (!priv->child_up) { diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 7bb5aa8ded2..41ffa4ecdb2 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -61,6 +61,7 @@ typedef struct _afr_private {          inode_t *root_inode;          unsigned char *child_up; +        unsigned char *local;          char **pending_key;  | 
