summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2014-10-22 12:09:01 +0530
committerVenky Shankar <vshankar@redhat.com>2014-10-29 01:54:12 -0700
commit5ae0df29b4e590d9a8a5f3c8f9e98cc944b006cf (patch)
tree3e06f75042ad9f871f8dbf6a6454af65b489ba0e
parentef03f98bf9b5f7f317383b84d251299b8939e5cc (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>
-rw-r--r--xlators/features/changelog/src/changelog-helpers.h13
-rw-r--r--xlators/features/changelog/src/changelog.c12
2 files changed, 25 insertions, 0 deletions
diff --git a/xlators/features/changelog/src/changelog-helpers.h b/xlators/features/changelog/src/changelog-helpers.h
index 9bd4a3f..d8f8046 100644
--- a/xlators/features/changelog/src/changelog-helpers.h
+++ b/xlators/features/changelog/src/changelog-helpers.h
@@ -539,6 +539,19 @@ int __chlog_barrier_enable (xlator_t *this, changelog_priv_t *priv);
goto label; \
} while (0)
+/* If it is a METADATA entry and fop num being GF_FOP_NULL, don't
+ * log in the changelog as it is of no use. And also if it is
+ * logged, since slicing version checking is done for metadata
+ * entries, the subsequent entries with valid fop num which falls
+ * to same changelog will be missed. Hence check for boundary
+ * condition.
+ */
+#define CHANGELOG_OP_BOUNDARY_CHECK(frame, label) do { \
+ if (frame->root->op <= GF_FOP_NULL || \
+ frame->root->op >= GF_FOP_MAXVALUE) \
+ goto label; \
+ } while (0)
+
/**
* ignore internal fops for all clients except AFR self-heal daemon
*/
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
index 12b39f7..d2e30f7 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);