diff options
| author | Poornima G <pgurusid@redhat.com> | 2018-06-27 14:59:40 +0530 | 
|---|---|---|
| committer | Amar Tumballi <amarts@redhat.com> | 2018-07-11 04:11:59 +0000 | 
| commit | 69f77d28c3ecacba77fbae2f789b5110641347f3 (patch) | |
| tree | 746f1470476a981b6becaedb6c7c1e681f457f41 /xlators/cluster | |
| parent | af6c6429f9743f287baaad68f8e3d56ed7390d1b (diff) | |
md-cache: Do not invalidate cache post set/remove xattr
Since setxattr and removexattr fops cbk do not carry poststat,
the stat cache was being invalidated in setxatr/remoxattr cbk.
Hence the further lookup wouldn't be served from cache.
To prevent this invalidation, md-cache is modified to get
the poststat in set/removexattr_cbk in dict.
Co-authored with Xavi Hernandez.
Change-Id: I6b946be2d20b807e2578825743c25ba5927a60b4
fixes: bz#1586018
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
Signed-off-by: Poornima G <pgurusid@redhat.com>
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 4 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-combine.c | 63 | 
2 files changed, 65 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 900789ca8aa..fa73c33c5ab 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -5558,9 +5558,9 @@ dht_file_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  out:          if (local->fop == GF_FOP_SETXATTR) { -                DHT_STACK_UNWIND (setxattr, frame, op_ret, op_errno, NULL); +                DHT_STACK_UNWIND (setxattr, frame, op_ret, op_errno, xdata);          } else { -                DHT_STACK_UNWIND (fsetxattr, frame, op_ret, op_errno, NULL); +                DHT_STACK_UNWIND (fsetxattr, frame, op_ret, op_errno, xdata);          }          return 0; diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c index b51ec87a934..2233caffdba 100644 --- a/xlators/cluster/ec/src/ec-combine.c +++ b/xlators/cluster/ec/src/ec-combine.c @@ -259,6 +259,7 @@ ec_value_ignore (char *key)              (XATTR_IS_NODE_UUID(key))) {                  return _gf_true;          } +          return _gf_false;  } @@ -554,6 +555,64 @@ int32_t ec_dict_data_uuid(ec_cbk_data_t * cbk, int32_t which, char * key)      return 0;  } +int32_t ec_dict_data_iatt(ec_cbk_data_t *cbk, int32_t which, char *key) +{ +    ec_t *ec = cbk->fop->xl->private; +    data_t *data[ec->nodes]; +    dict_t *dict; +    struct iatt *stbuf, *tmp; +    int32_t i, ret; + +    ec_dict_list(data, cbk, which, key, _gf_false); + +    stbuf = NULL; +    for (i = 0; i < ec->nodes; i++) { +        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) { +            continue; +        } +        tmp = data_to_iatt(data[i], key); +        if (tmp == NULL) { +            ret = -EINVAL; +            goto out; +        } +        if (stbuf == NULL) { +            stbuf = GF_MALLOC(sizeof(struct iatt), gf_common_mt_char); +            if (stbuf == NULL) { +                    ret = -ENOMEM; +                    goto out; +            } +            *stbuf = *tmp; +        } else { +            if (!ec_iatt_combine (cbk->fop, stbuf, tmp, 1)) { +                ret = -EINVAL; +                goto out; +            } +        } +    } + +    if (stbuf->ia_type == IA_IFREG) { +        ec_iatt_rebuild(ec, stbuf, 1, cbk->count); +        /* TODO: not sure if an iatt could come in xdata from a fop that takes +         *       no locks. */ +        if (!ec_get_inode_size(cbk->fop, cbk->fop->locks[0].lock->loc.inode, +                               &stbuf->ia_size)) { +            ret = -EINVAL; +            goto out; +        } +    } + +    dict = (which == EC_COMBINE_XDATA) ? cbk->xdata : cbk->dict; +    ret = dict_set_iatt(dict, key, stbuf, false); +    if (ret >= 0) { +        stbuf = NULL; +    } + +out: +    GF_FREE(stbuf); + +    return ret; +} +  int32_t ec_dict_data_max32(ec_cbk_data_t *cbk, int32_t which, char *key)  {      ec_t *ec = cbk->fop->xl->private; @@ -736,6 +795,10 @@ int32_t ec_dict_data_combine(dict_t * dict, char * key, data_t * value,          return ec_dict_data_max64(data->cbk, data->which, key);      } +    if (strcmp (key, GF_PRESTAT) == 0 || strcmp (key, GF_POSTSTAT) == 0) { +        return ec_dict_data_iatt(data->cbk, data->which, key); +    } +      return 0;  }  | 
