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 6b393c77a96..1c786d59d5b 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -1891,6 +1891,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 73d7e94b5cf..fff2a06f927 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1533,3 +1533,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 ebf262e4f36..332471c87e6 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -577,7 +577,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; @@ -614,13 +613,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;  } @@ -734,8 +729,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 fe0596cc99f..0837e5a30fa 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -361,7 +361,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; @@ -378,13 +377,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 b58767c0277..778f2a1e0da 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -209,7 +209,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; @@ -262,23 +262,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 d77a9ec549e..1da3cb92b43 100644 --- a/xlators/cluster/afr/src/afr-self-heald.c +++ b/xlators/cluster/afr/src/afr-self-heald.c @@ -521,14 +521,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 d65895ae722..49ce495ff5f 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -389,6 +389,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 dec4eaa8a4a..e507fd72f88 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -66,6 +66,7 @@ typedef struct _afr_private {          inode_t *root_inode;          unsigned char *child_up; +        unsigned char *local;          char **pending_key;  | 
