summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/glusterfs.h4
-rw-r--r--xlators/cluster/dht/src/dht-common.c24
-rw-r--r--xlators/performance/md-cache/src/md-cache.c12
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