From cd8d8bf659af5c7a159d3c65361fd140909f2232 Mon Sep 17 00:00:00 2001 From: Poornima G Date: Fri, 2 Jun 2017 10:05:33 +0530 Subject: [PATCH 502/509] 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 > NetBSD-regression: NetBSD Build System > CentOS-regression: Gluster Build System > Reviewed-by: Niels de Vos > Signed-off-by: Poornima G Change-Id: Id9f63583216ae857f6251dca15797ac66fa85430 BUG: 1450080 Signed-off-by: Poornima G Reviewed-on: https://code.engineering.redhat.com/gerrit/108886 Reviewed-by: Atin Mukherjee --- tests/bugs/upcall/bug-1458127.t | 36 ++++++++++++++ xlators/features/upcall/src/upcall-internal.c | 6 +-- xlators/features/upcall/src/upcall.c | 68 ++++++++++++++++++++------- xlators/features/upcall/src/upcall.h | 1 - 4 files changed, 89 insertions(+), 22 deletions(-) create mode 100755 tests/bugs/upcall/bug-1458127.t diff --git a/tests/bugs/upcall/bug-1458127.t b/tests/bugs/upcall/bug-1458127.t new file mode 100755 index 0000000..e844f37 --- /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 43a6b20..e577db4 100644 --- a/xlators/features/upcall/src/upcall-internal.c +++ b/xlators/features/upcall/src/upcall-internal.c @@ -542,9 +542,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) { @@ -559,7 +557,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 abbe3ee..a9d3c8a 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; @@ -2263,9 +2300,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 4554248..159193f 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 */ -- 1.8.3.1