summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/afr/src/afr-common.c100
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-common.c19
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-data.c8
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-entry.c11
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-metadata.c7
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-name.c3
-rw-r--r--xlators/cluster/afr/src/afr-self-heal.h12
7 files changed, 102 insertions, 58 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index 932a26117a6..2be75b0b471 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -1250,7 +1250,6 @@ afr_replies_wipe (struct afr_reply *replies, int count)
replies[i].xattr = NULL;
}
}
- memset (&replies->need_heal, 0, sizeof (replies->need_heal));
}
void
@@ -4385,7 +4384,8 @@ out:
int
afr_selfheal_locked_metadata_inspect (call_frame_t *frame, xlator_t *this,
- inode_t *inode, gf_boolean_t *msh)
+ inode_t *inode, gf_boolean_t *msh,
+ gf_boolean_t *pending)
{
int ret = -1;
unsigned char *locked_on = NULL;
@@ -4416,7 +4416,8 @@ afr_selfheal_locked_metadata_inspect (call_frame_t *frame, xlator_t *this,
ret = __afr_selfheal_metadata_prepare (frame, this, inode,
locked_on, sources,
sinks, healed_sinks,
- locked_replies);
+ locked_replies,
+ pending);
*msh = afr_decide_heal_info (priv, sources, ret);
}
afr_selfheal_uninodelk (frame, this, inode, this->name,
@@ -4429,7 +4430,8 @@ out:
int
afr_selfheal_locked_data_inspect (call_frame_t *frame, xlator_t *this,
- inode_t *inode, gf_boolean_t *dsh)
+ inode_t *inode, gf_boolean_t *dsh,
+ gf_boolean_t *pflag)
{
int ret = -1;
afr_private_t *priv = NULL;
@@ -4471,7 +4473,8 @@ afr_selfheal_locked_data_inspect (call_frame_t *frame, xlator_t *this,
ret = __afr_selfheal_data_prepare (frame, this, inode,
data_lock, sources,
sinks, healed_sinks,
- locked_replies);
+ locked_replies,
+ pflag);
*dsh = afr_decide_heal_info (priv, sources, ret);
}
afr_selfheal_uninodelk (frame, this, inode, this->name, 0, 0,
@@ -4489,7 +4492,7 @@ out:
int
afr_selfheal_locked_entry_inspect (call_frame_t *frame, xlator_t *this,
inode_t *inode,
- gf_boolean_t *esh)
+ gf_boolean_t *esh, gf_boolean_t *pflag)
{
int ret = -1;
int source = -1;
@@ -4534,7 +4537,7 @@ afr_selfheal_locked_entry_inspect (call_frame_t *frame, xlator_t *this,
data_lock, sources,
sinks, healed_sinks,
locked_replies,
- &source);
+ &source, pflag);
if ((ret == 0) && source < 0)
ret = -EIO;
*esh = afr_decide_heal_info (priv, sources, ret);
@@ -4556,7 +4559,8 @@ afr_selfheal_locked_inspect (call_frame_t *frame, xlator_t *this, uuid_t gfid,
inode_t **inode,
gf_boolean_t *entry_selfheal,
gf_boolean_t *data_selfheal,
- gf_boolean_t *metadata_selfheal)
+ gf_boolean_t *metadata_selfheal,
+ gf_boolean_t *pending)
{
int ret = -1;
@@ -4573,21 +4577,22 @@ afr_selfheal_locked_inspect (call_frame_t *frame, xlator_t *this, uuid_t gfid,
if (msh) {
ret = afr_selfheal_locked_metadata_inspect (frame, this,
- *inode, &msh);
+ *inode, &msh,
+ pending);
if (ret == -EIO)
goto out;
}
if (dsh) {
ret = afr_selfheal_locked_data_inspect (frame, this, *inode,
- &dsh);
+ &dsh, pending);
if (ret == -EIO || (ret == -EAGAIN))
goto out;
}
if (esh) {
ret = afr_selfheal_locked_entry_inspect (frame, this, *inode,
- &esh);
+ &esh, pending);
}
out:
@@ -4609,28 +4614,12 @@ afr_set_heal_info (char *status)
goto out;
}
- if (!strcmp (status, "heal")) {
- ret = dict_set_str (dict, "heal-info", "heal");
- if (ret)
- gf_msg ("", GF_LOG_WARNING, -ret,
- AFR_MSG_DICT_SET_FAILED,
- "Failed to set heal-info key to "
- "heal");
- } else if (!strcmp (status, "split-brain")) {
- ret = dict_set_str (dict, "heal-info", "split-brain");
- if (ret)
- gf_msg ("", GF_LOG_WARNING, -ret,
- AFR_MSG_DICT_SET_FAILED,
- "Failed to set heal-info key to "
- "split-brain");
- } else if (!strcmp (status, "possibly-healing")) {
- ret = dict_set_str (dict, "heal-info", "possibly-healing");
- if (ret)
- gf_msg ("", GF_LOG_WARNING, -ret,
- AFR_MSG_DICT_SET_FAILED,
- "Failed to set heal-info key to "
- "possibly-healing");
- }
+ ret = dict_set_str (dict, "heal-info", status);
+ if (ret)
+ gf_msg ("", GF_LOG_WARNING, -ret,
+ AFR_MSG_DICT_SET_FAILED,
+ "Failed to set heal-info key to "
+ "%s", status);
out:
return dict;
}
@@ -4641,14 +4630,19 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc)
gf_boolean_t data_selfheal = _gf_false;
gf_boolean_t metadata_selfheal = _gf_false;
gf_boolean_t entry_selfheal = _gf_false;
+ gf_boolean_t pending = _gf_false;
dict_t *dict = NULL;
int ret = -1;
int op_errno = 0;
+ int size = 0;
inode_t *inode = NULL;
+ char *substr = NULL;
+ char *status = NULL;
ret = afr_selfheal_locked_inspect (frame, this, loc->gfid, &inode,
&entry_selfheal,
- &data_selfheal, &metadata_selfheal);
+ &data_selfheal, &metadata_selfheal,
+ &pending);
if (ret == -ENOMEM) {
op_errno = -ret;
@@ -4656,10 +4650,27 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc)
goto out;
}
+ if (pending) {
+ size = strlen ("-pending") + 1;
+ gf_asprintf (&substr, "-pending");
+ if (!substr)
+ goto out;
+ }
+
if (ret == -EIO) {
- dict = afr_set_heal_info ("split-brain");
+ size += strlen ("split-brain") + 1;
+ ret = gf_asprintf (&status, "split-brain%s",
+ substr? substr : "");
+ if (ret < 0)
+ goto out;
+ dict = afr_set_heal_info (status);
} else if (ret == -EAGAIN) {
- dict = afr_set_heal_info ("possibly-healing");
+ size += strlen ("possibly-healing") + 1;
+ ret = gf_asprintf (&status, "possibly-healing%s",
+ substr? substr : "");
+ if (ret < 0)
+ goto out;
+ dict = afr_set_heal_info (status);
} else if (ret >= 0) {
/* value of ret = source index
* so ret >= 0 and at least one of the 3 booleans set to
@@ -4669,7 +4680,12 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc)
!metadata_selfheal) {
dict = afr_set_heal_info ("no-heal");
} else {
- dict = afr_set_heal_info ("heal");
+ size += strlen ("heal") + 1;
+ ret = gf_asprintf (&status, "heal%s",
+ substr? substr : "");
+ if (ret < 0)
+ goto out;
+ dict = afr_set_heal_info (status);
}
} else if (ret < 0) {
/* Apart from above checked -ve ret values, there are
@@ -4681,7 +4697,12 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc)
*/
if (data_selfheal || entry_selfheal ||
metadata_selfheal) {
- dict = afr_set_heal_info ("heal");
+ size += strlen ("heal") + 1;
+ ret = gf_asprintf (&status, "heal%s",
+ substr? substr : "");
+ if (ret < 0)
+ goto out;
+ dict = afr_set_heal_info (status);
}
}
ret = 0;
@@ -4694,6 +4715,7 @@ out:
inode_forget (inode, 1);
inode_unref (inode);
}
+ GF_FREE (substr);
return ret;
}
@@ -4718,7 +4740,7 @@ _afr_is_split_brain (call_frame_t *frame, xlator_t *this,
ret = afr_selfheal_find_direction (frame, this, replies,
type, priv->child_up, sources,
- sinks, witness);
+ sinks, witness, NULL);
if (ret)
return ret;
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c
index bd234af789e..49c6bd0cc98 100644
--- a/xlators/cluster/afr/src/afr-self-heal-common.c
+++ b/xlators/cluster/afr/src/afr-self-heal-common.c
@@ -528,7 +528,8 @@ afr_selfheal_find_direction (call_frame_t *frame, xlator_t *this,
struct afr_reply *replies,
afr_transaction_type type,
unsigned char *locked_on, unsigned char *sources,
- unsigned char *sinks, uint64_t *witness)
+ unsigned char *sinks, uint64_t *witness,
+ gf_boolean_t *pflag)
{
afr_private_t *priv = NULL;
int i = 0;
@@ -548,15 +549,25 @@ afr_selfheal_find_direction (call_frame_t *frame, xlator_t *this,
matrix = ALLOC_MATRIX(priv->child_count, int);
memset (witness, 0, sizeof (*witness) * priv->child_count);
+ /* First construct the pending matrix for further analysis */
+ afr_selfheal_extract_xattr (this, replies, type, dirty, matrix);
+
+ if (pflag) {
+ for (i = 0; i < priv->child_count; i++) {
+ for (j = 0; j < priv->child_count; j++)
+ if (matrix[i][j])
+ *pflag = _gf_true;
+ if (*pflag)
+ break;
+ }
+ }
+
if (afr_success_count (replies,
priv->child_count) < AFR_SH_MIN_PARTICIPANTS) {
/* Treat this just like locks not being acquired */
return -ENOTCONN;
}
- /* First construct the pending matrix for further analysis */
- afr_selfheal_extract_xattr (this, replies, type, dirty, matrix);
-
/* short list all self-accused */
for (i = 0; i < priv->child_count; i++) {
if (matrix[i][i])
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c
index 2789754c2e8..b40fa7dc6cc 100644
--- a/xlators/cluster/afr/src/afr-self-heal-data.c
+++ b/xlators/cluster/afr/src/afr-self-heal-data.c
@@ -617,7 +617,7 @@ __afr_selfheal_data_prepare (call_frame_t *frame, xlator_t *this,
inode_t *inode, unsigned char *locked_on,
unsigned char *sources, unsigned char *sinks,
unsigned char *healed_sinks,
- struct afr_reply *replies)
+ struct afr_reply *replies, gf_boolean_t *pflag)
{
int ret = -1;
int source = -1;
@@ -635,7 +635,8 @@ __afr_selfheal_data_prepare (call_frame_t *frame, xlator_t *this,
witness = alloca0(priv->child_count * sizeof (*witness));
ret = afr_selfheal_find_direction (frame, this, replies,
AFR_DATA_TRANSACTION,
- locked_on, sources, sinks, witness);
+ locked_on, sources, sinks, witness,
+ pflag);
if (ret)
return ret;
@@ -699,7 +700,8 @@ __afr_selfheal_data (call_frame_t *frame, xlator_t *this, fd_t *fd,
ret = __afr_selfheal_data_prepare (frame, this, fd->inode,
data_lock, sources, sinks,
healed_sinks,
- locked_replies);
+ locked_replies,
+ NULL);
if (ret < 0)
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 434b0481f0d..42a6c0453b1 100644
--- a/xlators/cluster/afr/src/afr-self-heal-entry.c
+++ b/xlators/cluster/afr/src/afr-self-heal-entry.c
@@ -388,7 +388,8 @@ __afr_selfheal_entry_prepare (call_frame_t *frame, xlator_t *this,
inode_t *inode, unsigned char *locked_on,
unsigned char *sources, unsigned char *sinks,
unsigned char *healed_sinks,
- struct afr_reply *replies, int *source_p)
+ struct afr_reply *replies, int *source_p,
+ gf_boolean_t *pflag)
{
int ret = -1;
int source = -1;
@@ -405,7 +406,8 @@ __afr_selfheal_entry_prepare (call_frame_t *frame, xlator_t *this,
witness = alloca0 (sizeof (*witness) * priv->child_count);
ret = afr_selfheal_find_direction (frame, this, replies,
AFR_ENTRY_TRANSACTION,
- locked_on, sources, sinks, witness);
+ locked_on, sources, sinks, witness,
+ pflag);
if (ret)
return ret;
@@ -475,7 +477,7 @@ afr_selfheal_entry_dirent (call_frame_t *frame, xlator_t *this,
locked_on,
sources, sinks,
healed_sinks, par_replies,
- &source);
+ &source, NULL);
if (ret < 0)
goto unlock;
@@ -649,7 +651,8 @@ __afr_selfheal_entry (call_frame_t *frame, xlator_t *this, fd_t *fd,
ret = __afr_selfheal_entry_prepare (frame, this, fd->inode,
data_lock, sources, sinks,
healed_sinks,
- locked_replies, &source);
+ locked_replies, &source,
+ NULL);
if (AFR_COUNT(healed_sinks, priv->child_count) == 0) {
did_sh = _gf_false;
goto unlock;
diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c
index 53133705adc..24b139ad216 100644
--- a/xlators/cluster/afr/src/afr-self-heal-metadata.c
+++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c
@@ -307,7 +307,7 @@ int
__afr_selfheal_metadata_prepare (call_frame_t *frame, xlator_t *this, inode_t *inode,
unsigned char *locked_on, unsigned char *sources,
unsigned char *sinks, unsigned char *healed_sinks,
- struct afr_reply *replies)
+ struct afr_reply *replies, gf_boolean_t *pflag)
{
int ret = -1;
int source = -1;
@@ -325,7 +325,8 @@ __afr_selfheal_metadata_prepare (call_frame_t *frame, xlator_t *this, inode_t *i
witness = alloca0 (sizeof (*witness) * priv->child_count);
ret = afr_selfheal_find_direction (frame, this, replies,
AFR_METADATA_TRANSACTION,
- locked_on, sources, sinks, witness);
+ locked_on, sources, sinks, witness,
+ pflag);
if (ret)
return ret;
@@ -400,7 +401,7 @@ afr_selfheal_metadata (call_frame_t *frame, xlator_t *this, inode_t *inode)
ret = __afr_selfheal_metadata_prepare (frame, this, inode,
data_lock, sources,
sinks, healed_sinks,
- locked_replies);
+ locked_replies, NULL);
if (ret < 0)
goto unlock;
diff --git a/xlators/cluster/afr/src/afr-self-heal-name.c b/xlators/cluster/afr/src/afr-self-heal-name.c
index 0d2fe6701bd..b57acbe99e0 100644
--- a/xlators/cluster/afr/src/afr-self-heal-name.c
+++ b/xlators/cluster/afr/src/afr-self-heal-name.c
@@ -514,7 +514,8 @@ __afr_selfheal_name_prepare (call_frame_t *frame, xlator_t *this, inode_t *paren
witness = alloca0 (sizeof (*witness) * priv->child_count);
ret = afr_selfheal_find_direction (frame, this, replies,
AFR_ENTRY_TRANSACTION,
- locked_on, sources, sinks, witness);
+ locked_on, sources, sinks, witness,
+ NULL);
if (ret)
goto out;
diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h
index a707e20e222..74e852aa038 100644
--- a/xlators/cluster/afr/src/afr-self-heal.h
+++ b/xlators/cluster/afr/src/afr-self-heal.h
@@ -140,7 +140,8 @@ afr_selfheal_find_direction (call_frame_t *frame, xlator_t *this,
struct afr_reply *replies,
afr_transaction_type type,
unsigned char *locked_on, unsigned char *sources,
- unsigned char *sinks, uint64_t *witness);
+ unsigned char *sinks, uint64_t *witness,
+ gf_boolean_t *flag);
int
afr_selfheal_fill_matrix (xlator_t *this, int **matrix, int subvol, int idx,
dict_t *xdata);
@@ -225,7 +226,8 @@ __afr_selfheal_data_prepare (call_frame_t *frame, xlator_t *this,
inode_t *inode, unsigned char *locked_on,
unsigned char *sources,
unsigned char *sinks, unsigned char *healed_sinks,
- struct afr_reply *replies);
+ struct afr_reply *replies,
+ gf_boolean_t *flag);
int
__afr_selfheal_metadata_prepare (call_frame_t *frame, xlator_t *this,
@@ -233,14 +235,16 @@ __afr_selfheal_metadata_prepare (call_frame_t *frame, xlator_t *this,
unsigned char *sources,
unsigned char *sinks,
unsigned char *healed_sinks,
- struct afr_reply *replies);
+ struct afr_reply *replies,
+ gf_boolean_t *flag);
int
__afr_selfheal_entry_prepare (call_frame_t *frame, xlator_t *this,
inode_t *inode, unsigned char *locked_on,
unsigned char *sources,
unsigned char *sinks,
unsigned char *healed_sinks,
- struct afr_reply *replies, int *source_p);
+ struct afr_reply *replies, int *source_p,
+ gf_boolean_t *flag);
int
afr_selfheal_unlocked_inspect (call_frame_t *frame, xlator_t *this,