diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2014-08-21 10:44:14 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-09-07 22:45:48 -0700 |
commit | 2efe31d4def8bd9170d000d0c4a05a4d00633805 (patch) | |
tree | d152c5d8264e2f9d9723a208d85129e1adabbb4d | |
parent | 12a560c22d655b5bb307ddb0fe051249f8a9aeb2 (diff) |
cluster/afr: Set pending changelog based on filetype for new entries
Backport of http://review.gluster.org/8506
BUG: 1136822
Change-Id: Ia864040306405acf9ebddabf63e87dc2016372dd
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/8588
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rw-r--r-- | tests/bugs/bug-1132102.t | 28 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-dir-write.c | 16 |
2 files changed, 40 insertions, 4 deletions
diff --git a/tests/bugs/bug-1132102.t b/tests/bugs/bug-1132102.t new file mode 100644 index 00000000000..4e54b1d24dd --- /dev/null +++ b/tests/bugs/bug-1132102.t @@ -0,0 +1,28 @@ +#!/bin/bash + +#This tests that mknod and create fops mark necessary pending changelog +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +TEST kill_brick $V0 $H0 $B0/${V0}0 +cd $M0 +TEST mkfifo fifo +TEST mknod block b 0 0 +TEST touch a +EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 data +EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 entry +EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 metadata +EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 data +EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 entry +EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 metadata +EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 data +EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 entry +EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 metadata +cleanup diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index d59536fcb48..a9f272126ae 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -278,7 +278,8 @@ afr_mark_new_entry_changelog (call_frame_t *frame, xlator_t *this) dict_t *xattr = NULL; int32_t **changelog = NULL; int i = 0; - int idx = 0; + int idx = -1; + int m_idx = 0; int op_errno = ENOMEM; unsigned char *pending = NULL; int call_count = 0; @@ -298,11 +299,17 @@ afr_mark_new_entry_changelog (call_frame_t *frame, xlator_t *this) if (!changelog) goto out; + new_local->pending = changelog; xattr = dict_new (); if (!xattr) goto out; - idx = afr_index_for_transaction_type (AFR_DATA_TRANSACTION); + if (IA_ISREG (local->cont.dir_fop.buf.ia_type)) { + idx = afr_index_for_transaction_type (AFR_DATA_TRANSACTION); + } else if (IA_ISDIR (local->cont.dir_fop.buf.ia_type)) { + idx = afr_index_for_transaction_type (AFR_ENTRY_TRANSACTION); + } + m_idx = afr_index_for_transaction_type (AFR_METADATA_TRANSACTION); pending = alloca0 (priv->child_count); @@ -313,11 +320,12 @@ afr_mark_new_entry_changelog (call_frame_t *frame, xlator_t *this) continue; } - changelog[i][idx] = hton32(1); + changelog[i][m_idx] = hton32(1); + if (idx != -1) + changelog[i][idx] = hton32(1); pending[i] = 1; } - new_local->pending = changelog; uuid_copy (new_local->loc.gfid, local->cont.dir_fop.buf.ia_gfid); new_local->loc.inode = inode_ref (local->inode); |