diff options
author | Kotresh HR <khiremat@redhat.com> | 2014-10-22 12:09:01 +0530 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2014-10-29 01:54:12 -0700 |
commit | 5ae0df29b4e590d9a8a5f3c8f9e98cc944b006cf (patch) | |
tree | 3e06f75042ad9f871f8dbf6a6454af65b489ba0e /xlators/features/changelog/src/changelog.c | |
parent | ef03f98bf9b5f7f317383b84d251299b8939e5cc (diff) |
feature/changelog: Fix changelog missing SETATTR entries.
Problem: Valid SETATTR entries are missing in changelog when more
than one metadata operation happen on same inode within
changelog roll-over time.
Cause: Metadata entries with fop num being GF_FOP_NULL are logged
in changelog which is of no use. Since slice version
checking is done for metadata entries to avoid logging of
subsequent entries of same inode falling into same
changelog, if the entry with GF_FOP_NULL is logged first,
subsequent valid ones will be missed.
Solution: Have a boundary condition to log only those fops whose fop
number falls between GF_FOP_NULL and GF_FOP_MAXVALUE.
Change-Id: Iff585ea573ac5e521a361541c6646225943f0b2d
BUG: 1104954
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/8964
Reviewed-by: Aravinda VK <avishwan@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
Diffstat (limited to 'xlators/features/changelog/src/changelog.c')
-rw-r--r-- | xlators/features/changelog/src/changelog.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c index 12b39f73f3c..d2e30f7f001 100644 --- a/xlators/features/changelog/src/changelog.c +++ b/xlators/features/changelog/src/changelog.c @@ -1091,6 +1091,8 @@ changelog_fsetattr (call_frame_t *frame, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, fd->inode, fd->inode->gfid, 1); if (!frame->local) @@ -1150,6 +1152,8 @@ changelog_setattr (call_frame_t *frame, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, loc->inode, loc->inode->gfid, 1); if (!frame->local) @@ -1206,6 +1210,8 @@ changelog_fremovexattr (call_frame_t *frame, xlator_t *this, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, fd->inode, fd->inode->gfid, 1); @@ -1258,6 +1264,8 @@ changelog_removexattr (call_frame_t *frame, xlator_t *this, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, loc->inode, loc->inode->gfid, 1); @@ -1313,6 +1321,8 @@ changelog_setxattr (call_frame_t *frame, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, loc->inode, loc->inode->gfid, 1); @@ -1366,6 +1376,8 @@ changelog_fsetxattr (call_frame_t *frame, priv = this->private; CHANGELOG_NOT_ACTIVE_THEN_GOTO (frame, priv, wind); + CHANGELOG_OP_BOUNDARY_CHECK (frame, wind); + CHANGELOG_INIT (this, frame->local, fd->inode, fd->inode->gfid, 1); |