diff options
Diffstat (limited to 'xlators/cluster/ec/src')
| -rw-r--r-- | xlators/cluster/ec/src/ec-combine.c | 108 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec.c | 6 | 
3 files changed, 51 insertions, 83 deletions
diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c index e84055c51e4..9d4a18999f1 100644 --- a/xlators/cluster/ec/src/ec-combine.c +++ b/xlators/cluster/ec/src/ec-combine.c @@ -168,96 +168,40 @@ void ec_iatt_rebuild(ec_t * ec, struct iatt * iatt, int32_t count,      }  } -int32_t ec_dict_data_compare(dict_t * dict, char * key, data_t * value, -                             void * arg) +gf_boolean_t +ec_xattr_match (dict_t *dict, char *key, data_t *value, void *arg)  { -    ec_dict_info_t * info = arg; -    data_t * data; - -    data = dict_get(info->dict, key); -    if (data == NULL) -    { -        gf_log("ec", GF_LOG_DEBUG, "key '%s' found only on one dict", key); - -        return -1; -    } - -    info->count--; - -    if ((strcmp(key, GF_CONTENT_KEY) == 0) || -        (strcmp(key, GF_XATTR_PATHINFO_KEY) == 0) || -        (strcmp(key, GF_XATTR_USER_PATHINFO_KEY) == 0) || -        (strcmp(key, GF_XATTR_LOCKINFO_KEY) == 0) || -        (strcmp(key, GLUSTERFS_OPEN_FD_COUNT) == 0) || -        (strncmp(key, GF_XATTR_CLRLK_CMD, strlen(GF_XATTR_CLRLK_CMD)) == 0) || -        (strncmp(key, EC_QUOTA_PREFIX, strlen(EC_QUOTA_PREFIX)) == 0) || -        (fnmatch(GF_XATTR_STIME_PATTERN, key, 0) == 0) || -        (fnmatch(MARKER_XATTR_PREFIX ".*." XTIME, key, 0) == 0) || -        (fnmatch(GF_XATTR_MARKER_KEY ".*", key, 0) == 0) || -        (XATTR_IS_NODE_UUID(key))) -    { -        return 0; -    } +        if (fnmatch(GF_XATTR_STIME_PATTERN, key, 0) == 0) +                return _gf_false; -    if ((data->len != value->len) || -        (memcmp(data->data, value->data, data->len) != 0)) -    { -        gf_log("ec", GF_LOG_DEBUG, "key '%s' is different (size: %u, %u)", -               key, data->len, value->len); - -        return -1; -    } - -    return 0; +        return _gf_true;  } -int32_t ec_dict_data_show(dict_t * dict, char * key, data_t * value, -                          void * arg) +gf_boolean_t +ec_value_ignore (char *key)  { -    if (dict_get(arg, key) == NULL) -    { -        gf_log("ec", GF_LOG_DEBUG, "key '%s' found only on one dict", key); -    } - -    return 0; +        if ((strcmp(key, GF_CONTENT_KEY) == 0) || +            (strcmp(key, GF_XATTR_PATHINFO_KEY) == 0) || +            (strcmp(key, GF_XATTR_USER_PATHINFO_KEY) == 0) || +            (strcmp(key, GF_XATTR_LOCKINFO_KEY) == 0) || +            (strcmp(key, GLUSTERFS_OPEN_FD_COUNT) == 0) || +            (strncmp(key, GF_XATTR_CLRLK_CMD, +                     strlen (GF_XATTR_CLRLK_CMD)) == 0) || +            (strncmp(key, EC_QUOTA_PREFIX, strlen(EC_QUOTA_PREFIX)) == 0) || +            (fnmatch(MARKER_XATTR_PREFIX ".*." XTIME, key, 0) == 0) || +            (fnmatch(GF_XATTR_MARKER_KEY ".*", key, 0) == 0) || +            (XATTR_IS_NODE_UUID(key))) { +                return _gf_true; +        } +        return _gf_false;  } -int32_t ec_dict_compare(dict_t * dict1, dict_t * dict2) +int32_t +ec_dict_compare (dict_t *dict1, dict_t *dict2)  { -    ec_dict_info_t info; -    dict_t * dict; - -    if (dict1 != NULL) -    { -        info.dict = dict1; -        info.count = dict1->count; -        dict = dict2; -    } -    else if (dict2 != NULL) -    { -        info.dict = dict2; -        info.count = dict2->count; -        dict = dict1; -    } -    else -    { -        return 1; -    } - -    if (dict != NULL) -    { -        if (dict_foreach(dict, ec_dict_data_compare, &info) != 0) -        { -            return 0; -        } -    } - -    if (info.count != 0) -    { -        dict_foreach(info.dict, ec_dict_data_show, dict); -    } - -    return (info.count == 0); +        if (are_dicts_equal (dict1, dict2, ec_xattr_match, ec_value_ignore)) +                return 1; +        return 0;  }  int32_t ec_dict_list(data_t ** list, int32_t * count, ec_cbk_data_t * cbk, diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index 365ea3db0ec..f87df4016c0 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -234,6 +234,25 @@ void ec_wind_getxattr(ec_t * ec, ec_fop_data_t * fop, int32_t idx)                        &fop->loc[0], fop->str[0], fop->xdata);  } +void +ec_handle_special_xattrs (ec_fop_data_t *fop) +{ +        ec_cbk_data_t *cbk = NULL; +        /* Stime may not be available on all the bricks, so even if some of the +         * subvols succeed the operation, treat it as answer.*/ +        if (fop->str[0] && +            fnmatch (GF_XATTR_STIME_PATTERN, fop->str[0], 0) == 0) { +                if (!fop->answer || (fop->answer->op_ret < 0)) { +                        list_for_each_entry (cbk, &fop->cbk_list, list) { +                                if (cbk->op_ret >= 0) { +                                        fop->answer = cbk; +                                        break; +                                } +                        } +                } +        } +} +  int32_t ec_manager_getxattr(ec_fop_data_t * fop, int32_t state)  {      ec_cbk_data_t * cbk; @@ -263,6 +282,7 @@ int32_t ec_manager_getxattr(ec_fop_data_t * fop, int32_t state)              return EC_STATE_PREPARE_ANSWER;          case EC_STATE_PREPARE_ANSWER: +            ec_handle_special_xattrs (fop);              cbk = fop->answer;              if (cbk != NULL)              { diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index 5476ac6562e..3dd04299541 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -670,6 +670,7 @@ ec_gf_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,  {          int     error = 0;          ec_t    *ec = this->private; +        int32_t minimum = EC_MINIMUM_MIN;          if (name && strcmp (name, EC_XATTR_HEAL) != 0) {                  EC_INTERNAL_XATTR_OR_GOTO(name, NULL, error, out); @@ -682,7 +683,10 @@ ec_gf_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,                                              NULL, ec_marker_populate_args) == 0)                  return 0; -        ec_getxattr (frame, this, -1, EC_MINIMUM_MIN, default_getxattr_cbk, +        if (name && (fnmatch (GF_XATTR_STIME_PATTERN, name, 0) == 0)) +                minimum = EC_MINIMUM_ALL; + +        ec_getxattr (frame, this, -1, minimum, default_getxattr_cbk,                       NULL, loc, name, xdata);          return 0;  | 
