summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPoornima G <pgurusid@redhat.com>2017-06-02 10:05:33 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2017-06-13 14:23:58 +0000
commita8afcbea56fdf51246c82590899e0853e83424fb (patch)
tree7ff1a4eaddf82cb0051fa4f6fd6826881c8149ff
parent169a64f7066a5d079c60e816a81325094ed8ad74 (diff)
upcall: Update the access time in missing cases
Issue: In fops like rename, link, unlink etc, the parent dirrs' client access time was not being updated. And in fops like create, link, symlink etc. the new file/dirs' client access time was not updated. Solution: Update the client access time for both parent and new entry. > Reviewed-on: https://review.gluster.org/17450 > Smoke: Gluster Build System <jenkins@build.gluster.org> > NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> > CentOS-regression: Gluster Build System <jenkins@build.gluster.org> > Reviewed-by: Niels de Vos <ndevos@redhat.com> > (cherry picked from commit 149db390fd89beee1e8a3d946d4224ba2a9b4711) Change-Id: Id9f63583216ae857f6251dca15797ac66fa85430 BUG: 1460895 Signed-off-by: Poornima G <pgurusid@redhat.com> Reviewed-on: https://review.gluster.org/17526 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
-rwxr-xr-xtests/bugs/upcall/bug-1458127.t36
-rw-r--r--xlators/features/upcall/src/upcall-internal.c6
-rw-r--r--xlators/features/upcall/src/upcall.c68
-rw-r--r--xlators/features/upcall/src/upcall.h1
4 files changed, 89 insertions, 22 deletions
diff --git a/tests/bugs/upcall/bug-1458127.t b/tests/bugs/upcall/bug-1458127.t
new file mode 100755
index 00000000000..e844f37f1d3
--- /dev/null
+++ b/tests/bugs/upcall/bug-1458127.t
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+
+cleanup;
+
+TEST glusterd
+
+TEST $CLI volume create $V0 $H0:$B0/${V0}{0}
+EXPECT 'Created' volinfo_field $V0 'Status'
+
+TEST $CLI volume set $V0 performance.nl-cache on
+TEST $CLI volume set $V0 nl-cache-positive-entry on
+TEST $CLI volume set $V0 nl-cache-timeout 2
+TEST $CLI volume set $V0 features.cache-invalidation on
+TEST $CLI volume set $V0 features.cache-invalidation-timeout 2
+TEST $CLI volume set $V0 md-cache-timeout 20
+
+TEST $CLI volume start $V0;
+EXPECT 'Started' volinfo_field $V0 'Status';
+
+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0
+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1
+
+TEST mkdir $M0/dir
+TEST touch $M0/dir/xyz
+#Wait until upcall clears the fact that M0 had accessed dir
+sleep 4
+TEST mv $M0/dir/xyz $M0/dir/xyz1
+TEST ! ls $M0/dir/file1
+TEST touch $M1/dir/file1
+TEST ls $M0/dir/file1
+TEST ls $M0/dir/file1
+
+cleanup;
diff --git a/xlators/features/upcall/src/upcall-internal.c b/xlators/features/upcall/src/upcall-internal.c
index f290ca11de8..285141d251b 100644
--- a/xlators/features/upcall/src/upcall-internal.c
+++ b/xlators/features/upcall/src/upcall-internal.c
@@ -541,9 +541,7 @@ upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client,
return;
}
- up_inode_ctx = ((upcall_local_t *)frame->local)->upcall_inode_ctx;
-
- if (!up_inode_ctx)
+ if (inode)
up_inode_ctx = upcall_inode_ctx_get (inode, this);
if (!up_inode_ctx) {
@@ -558,7 +556,7 @@ upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client,
* invalid till it gets linked to inode table. Read gfid from
* the stat returned in such cases.
*/
- if (gf_uuid_is_null (up_inode_ctx->gfid)) {
+ if (gf_uuid_is_null (up_inode_ctx->gfid) && stbuf) {
/* That means inode must have been invalid when this inode_ctx
* is created. Copy the gfid value from stbuf instead.
*/
diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c
index 0e9919d41c4..e20a2e87093 100644
--- a/xlators/features/upcall/src/upcall.c
+++ b/xlators/features/upcall/src/upcall.c
@@ -404,6 +404,18 @@ up_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
stbuf, postnewparent, postoldparent, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client,
+ local->rename_oldloc.parent, flags,
+ postoldparent, NULL, NULL, NULL);
+
+ if (local->rename_oldloc.parent == local->loc.parent)
+ goto out;
+
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.parent,
+ flags, postnewparent, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (rename, frame, op_ret, op_errno,
stbuf, preoldparent, postoldparent,
@@ -421,7 +433,7 @@ up_rename (call_frame_t *frame, xlator_t *this,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, oldloc->inode, NULL);
+ local = upcall_local_init (frame, this, newloc, NULL, oldloc->inode, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -464,6 +476,10 @@ up_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
NULL, postparent, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.parent,
+ flags, postparent, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (unlink, frame, op_ret, op_errno,
preparent, postparent, xdata);
@@ -480,7 +496,7 @@ up_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->inode, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->inode, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -520,6 +536,10 @@ up_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
stbuf, postparent, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.parent,
+ flags, postparent, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (link, frame, op_ret, op_errno,
inode, stbuf, preparent, postparent, xdata);
@@ -536,7 +556,7 @@ up_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, oldloc->inode, NULL);
+ local = upcall_local_init (frame, this, newloc, NULL, oldloc->inode, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -578,6 +598,10 @@ up_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
NULL, postparent, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.parent,
+ flags, postparent, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (rmdir, frame, op_ret, op_errno,
preparent, postparent, xdata);
@@ -594,7 +618,7 @@ up_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->inode, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->inode, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -637,6 +661,10 @@ up_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
postparent, NULL, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.inode, flags,
+ stbuf, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (mkdir, frame, op_ret, op_errno,
inode, stbuf, preparent, postparent, xdata);
@@ -653,7 +681,7 @@ up_mkdir (call_frame_t *frame, xlator_t *this,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->parent, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->parent, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -692,12 +720,17 @@ up_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
goto out;
}
- /* As its a new file create, no need of sending notification */
- /* However invalidate parent's entry */
+ /* As its a new file create, no need of sending notification
+ * However invalidate parent's entry and update that fact that the
+ * client has accessed the newly created entry */
flags = UP_TIMES;
upcall_cache_invalidate (frame, this, client, local->inode, flags,
postparent, NULL, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.inode, flags,
+ stbuf, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (create, frame, op_ret, op_errno, fd,
inode, stbuf, preparent, postparent, xdata);
@@ -715,7 +748,7 @@ up_create (call_frame_t *frame, xlator_t *this,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->parent, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->parent, NULL);
if (!local) {
op_errno = ENOMEM;
@@ -1041,6 +1074,10 @@ up_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
postparent, NULL, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.inode, flags,
+ buf, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (mknod, frame, op_ret, op_errno, inode, buf,
preparent, postparent, xdata);
@@ -1057,7 +1094,7 @@ up_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->parent, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->parent, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -1101,6 +1138,10 @@ up_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
postparent, NULL, NULL, NULL);
+ flags = UP_UPDATE_CLIENT;
+ upcall_cache_invalidate (frame, this, client, local->loc.inode, flags,
+ buf, NULL, NULL, NULL);
+
out:
UPCALL_STACK_UNWIND (symlink, frame, op_ret, op_errno, inode, buf,
preparent, postparent, xdata);
@@ -1118,7 +1159,7 @@ up_symlink (call_frame_t *frame, xlator_t *this,
EXIT_IF_UPCALL_OFF (this, out);
- local = upcall_local_init (frame, this, NULL, NULL, loc->parent, NULL);
+ local = upcall_local_init (frame, this, loc, NULL, loc->parent, NULL);
if (!local) {
op_errno = ENOMEM;
goto err;
@@ -1325,10 +1366,6 @@ up_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
upcall_cache_invalidate (frame, this, client, local->inode, flags,
NULL, NULL, NULL, NULL);
- /* upcall_cache_invalidate optimises, by not calling inode_ctx_get
- * if local->upcall_inode_ctx is set. Hence before processing
- * the readdir entries unset this */
- local->upcall_inode_ctx = NULL;
list_for_each_entry (entry, &entries->list, list) {
if (entry->inode == NULL) {
continue;
@@ -2258,9 +2295,6 @@ upcall_local_init (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,
if (xattr)
local->xattr = dict_copy_with_ref (xattr, NULL);
- /* Shall we get inode_ctx and store it here itself? */
- local->upcall_inode_ctx = upcall_inode_ctx_get (inode, this);
-
if (loc)
loc_copy (&local->loc, loc);
if (fd)
diff --git a/xlators/features/upcall/src/upcall.h b/xlators/features/upcall/src/upcall.h
index 4554248a708..159193f54e7 100644
--- a/xlators/features/upcall/src/upcall.h
+++ b/xlators/features/upcall/src/upcall.h
@@ -83,7 +83,6 @@ struct upcall_local {
* pointers in 'local' which may get freed
* in future by other thread
*/
- upcall_inode_ctx_t *upcall_inode_ctx;
inode_t *inode;
loc_t rename_oldloc;
loc_t loc; /* required for stat in *xattr_cbk */