diff options
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 4 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 24 | ||||
| -rw-r--r-- | xlators/performance/md-cache/src/md-cache.c | 12 | 
3 files changed, 34 insertions, 6 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 8d387bafb3b..5777974676f 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -284,6 +284,10 @@  #define GF_LK_ADVISORY 0  #define GF_LK_MANDATORY 1 +/* md-cache keys */ +#define MDC_INVALIDATE_IATT "mdc.invalidate.iatt" +#define MDC_INVALIDATE_XATT "mdc.invalidate.xatt" +  const char *fop_enum_to_pri_string (glusterfs_fop_t fop);  const char *fop_enum_to_string (glusterfs_fop_t fop); diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 44b4b858ee1..87b77530e2f 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -19,6 +19,7 @@  #include "byte-order.h"  #include "glusterfs-acl.h"  #include "quota-common-utils.h" +#include "upcall-utils.h"  #include <sys/time.h>  #include <libgen.h> @@ -8551,6 +8552,11 @@ dht_ipc (call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)          call_cnt        = conf->subvolume_cnt;          local->call_cnt = call_cnt; +        if (xdata) { +                if (dict_set_int8 (xdata, conf->xattr_name, 0) < 0) +                        goto err; +        } +          for (i = 0; i < call_cnt; i++) {                  STACK_WIND (frame, dht_ipc_cbk, conf->subvolumes[i],                              conf->subvolumes[i]->fops->ipc, op, xdata); @@ -8613,6 +8619,8 @@ dht_notify (xlator_t *this, int event, void *data, ...)          dict_t                  *output = NULL;          va_list                  ap;          dht_methods_t           *methods = NULL; +        struct gf_upcall        *up_data = NULL; +        struct gf_upcall_cache_invalidation *up_ci = NULL;          conf = this->private;          GF_VALIDATE_OR_GOTO (this->name, conf, out); @@ -8781,7 +8789,21 @@ unlock:                  return ret;                  break;          } - +        case GF_EVENT_UPCALL: +                up_data = (struct gf_upcall *)data; +                if (up_data->event_type != GF_UPCALL_CACHE_INVALIDATION) +                        break; +                up_ci = (struct gf_upcall_cache_invalidation *)up_data->data; + +                /* Since md-cache will be aggressively filtering lookups, +                 * the stale layout issue will be more pronounced. Hence +                 * when a layout xattr is changed by the rebalance process +                 * notify all the md-cache clients to invalidate the existing +                 * stat cache and send the lookup next time*/ +                if (up_ci->dict && dict_get (up_ci->dict, conf->xattr_name)) +                        ret = dict_set_int8 (up_ci->dict, MDC_INVALIDATE_IATT , 0); +                propagate = 1; +                break;          default:                  propagate = 1;                  break; diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c index e0e7ee68e3b..586a203398b 100644 --- a/xlators/performance/md-cache/src/md-cache.c +++ b/xlators/performance/md-cache/src/md-cache.c @@ -792,10 +792,9 @@ out:  } -int +void  mdc_inode_iatt_invalidate (xlator_t *this, inode_t *inode)  { -        int              ret = -1;          struct md_cache *mdc = NULL;          if (mdc_inode_ctx_get (this, inode, &mdc) != 0) @@ -808,7 +807,7 @@ mdc_inode_iatt_invalidate (xlator_t *this, inode_t *inode)          UNLOCK (&mdc->lock);  out: -        return ret; +        return;  } @@ -2523,8 +2522,11 @@ mdc_invalidate (xlator_t *this, void *data)          }          if (up_ci->flags & IATT_UPDATE_FLAGS) { -                ret = mdc_inode_iatt_set_validate (this, inode, NULL, -                                                   &up_ci->stat); +                if (up_ci->dict && dict_get (up_ci->dict, MDC_INVALIDATE_IATT)) +                        mdc_inode_iatt_invalidate (this, inode); +                else +                        ret = mdc_inode_iatt_set_validate (this, inode, NULL, +                                                           &up_ci->stat);                  /* one of the scenarios where ret < 0 is when this invalidate                   * is older than the current stat, in that case do not                   * update the xattrs as well  | 
