diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 60 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.h | 4 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 7 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-metadata.c | 7 | 
4 files changed, 68 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 9798aa4e0e6..510dcdaf4a8 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -142,6 +142,66 @@ afr_sh_print_pending_matrix (int32_t *pending_matrix[], xlator_t *this)  }  void +afr_sh_print_split_brain_log (int32_t *pending_matrix[], xlator_t *this, +                              const char *loc) +{ +        afr_private_t *  priv = this->private; +        char            *buf  = NULL; +        char            *ptr  = NULL; +        int              i    = 0; +        int              j    = 0; +        int             child_count = priv->child_count; +        char            *matrix_begin = "[ [ "; +        char            *matrix_end = "] ]"; +        char            *seperator = "] [ "; +        int             pending_entry_strlen = 12; //Including space after entry +        int             matrix_begin_strlen = 0; +        int             matrix_end_strlen = 0; +        int             seperator_strlen = 0; +        int             string_length = 0; +        char            *msg = "- Pending matrix:  "; + +        /* +         *  for a list of lists of [ [ a b ] [ c d ] ] +         * */ + +        matrix_begin_strlen = strlen (matrix_begin); +        matrix_end_strlen = strlen (matrix_end); +        seperator_strlen = strlen (seperator); +        string_length = matrix_begin_strlen + matrix_end_strlen +                        + (child_count -1) * seperator_strlen +                        + (child_count * child_count * pending_entry_strlen); + +        buf = GF_CALLOC (1, 1 + strlen (msg) + string_length , gf_afr_mt_char); +        if (!buf) { +                buf = ""; +                goto out; +        } + +        ptr = buf; +        ptr += sprintf (ptr, "%s", msg); +        ptr += sprintf (ptr, "%s", matrix_begin); +        for (i = 0; i < priv->child_count; i++) { +                for (j = 0; j < priv->child_count; j++) { +                        ptr += sprintf (ptr, "%d ", pending_matrix[i][j]); +                } +                if (i < priv->child_count -1) +                        ptr += sprintf (ptr, "%s", seperator); +        } + +        ptr += sprintf (ptr, "%s", matrix_end); + +out: +        gf_log (this->name, GF_LOG_ERROR, "Unable to self-heal contents of '%s'" +                " (possible split-brain). Please delete the file from all but " +                "the preferred subvolume.%s", loc, buf); +        if (buf) +                GF_FREE (buf); +        return; +} + + +void  afr_init_pending_matrix (int32_t **pending_matrix, size_t child_count)  {          int             i   = 0; diff --git a/xlators/cluster/afr/src/afr-self-heal-common.h b/xlators/cluster/afr/src/afr-self-heal-common.h index 1c83289a950..035fce543a5 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.h +++ b/xlators/cluster/afr/src/afr-self-heal-common.h @@ -35,6 +35,10 @@ afr_sh_source_count (int sources[], int child_count);  void  afr_sh_print_pending_matrix (int32_t *pending_matrix[], xlator_t *this); +void +afr_sh_print_split_brain_log (int32_t *pending_matrix[], xlator_t *this, +                              const char *loc); +  int  afr_build_pending_matrix (char **pending_key, int32_t **pending_matrix,                            unsigned char *ignorant_subvols, diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 9694436879b..69e650620e9 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -711,11 +711,8 @@ afr_sh_data_fxattrop_fstat_done (call_frame_t *frame, xlator_t *this)          }          if (nsources == -1) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Unable to self-heal contents of '%s' (possible " -                        "split-brain). Please delete the file from all but " -                        "the preferred subvolume.", local->loc.path); - +                afr_sh_print_split_brain_log (sh->pending_matrix, this, +                                              local->loc.path);                  afr_set_split_brain (this, sh->inode, DONT_KNOW, SPB);                  afr_sh_data_fail (frame, this); diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c index cf8a33add34..9d512c28db1 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -405,11 +405,8 @@ afr_sh_metadata_fix (call_frame_t *frame, xlator_t *this,          }          if (nsources == -1) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Unable to self-heal permissions/ownership of '%s' " -                        "(possible split-brain). Please fix the file on " -                        "all backend volumes", local->loc.path); - +                afr_sh_print_split_brain_log (sh->pending_matrix, this, +                                              local->loc.path);                  afr_set_split_brain (this, sh->inode, SPB, DONT_KNOW);                  afr_sh_metadata_fail (frame, this);                  goto out;  | 
