summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2015-12-01 10:59:41 +0530
committerXavier Hernandez <xhernandez@datalab.es>2015-12-01 09:21:17 -0800
commitb8b050c37004c942b8c565cc66a05e8fa999c1ba (patch)
tree43b0a8d9569b0cddc50b4ca769958390bbfd2edb
parent3c18b186921c51b1a976eea8cd1c19f7113ef74c (diff)
cluster/ec: Create copy of dict for setting internal xattrs
Problem: Ec takes a ref of the request xdata and sets trusted.ec.version/algo etc xattrs as part of it. But this request xdata could be using same dictionary to do the operation on multiple subvolumes, due to which other subvolumes will have internal xattrs of ec in it and will be created on subvols where they are not supposed to appear. Fix: Take a copy of the request xdata/dict to prevent this from happening. Most of the debugging work and test script is contributed by Nitya. BUG: 1286910 Change-Id: If146435dfb89656158dbed3862a3e9a0cda60581 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/12831 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
-rw-r--r--tests/basic/tier/tier-file-create.t59
-rw-r--r--xlators/cluster/ec/src/ec-dir-write.c16
-rw-r--r--xlators/cluster/ec/src/ec-inode-write.c22
3 files changed, 78 insertions, 19 deletions
diff --git a/tests/basic/tier/tier-file-create.t b/tests/basic/tier/tier-file-create.t
new file mode 100644
index 00000000000..28caacd2a5a
--- /dev/null
+++ b/tests/basic/tier/tier-file-create.t
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../tier.rc
+
+
+NUM_BRICKS=3
+DEMOTE_FREQ=5
+PROMOTE_FREQ=5
+
+
+
+# Creates a tiered volume with pure distribute hot and cold tiers
+# Both hot and cold tiers will have an equal number of bricks.
+
+function create_dist_tier_vol () {
+ mkdir $B0/cold
+ mkdir $B0/hot
+ TEST $CLI volume create $V0 disperse 6 disperse-data 4 $H0:$B0/cold/${V0}{1..12}
+ TEST $CLI volume set $V0 performance.quick-read off
+ TEST $CLI volume set $V0 performance.io-cache off
+ TEST $CLI volume set $V0 features.ctr-enabled on
+ TEST $CLI volume start $V0
+ TEST $CLI volume attach-tier $V0 replica 2 $H0:$B0/hot/${V0}{0..$1}
+ TEST $CLI volume set $V0 cluster.tier-demote-frequency $DEMOTE_FREQ
+ TEST $CLI volume set $V0 cluster.tier-promote-frequency $PROMOTE_FREQ
+ TEST $CLI volume set $V0 cluster.read-freq-threshold 0
+ TEST $CLI volume set $V0 cluster.write-freq-threshold 0
+ TEST $CLI volume set $V0 cluster.tier-mode test
+}
+
+
+cleanup;
+
+#Basic checks
+TEST glusterd
+TEST pidof glusterd
+TEST $CLI volume info
+
+
+#Create and start a tiered volume
+create_dist_tier_vol $NUM_BRICKS
+
+# Mount FUSE
+TEST glusterfs -s $H0 --volfile-id $V0 $M0
+
+cd $M0
+
+touch FILE1
+
+HPATH=`find $B0/hot/ -name FILE1 | cut -d " " -f1`
+echo $HPATH
+
+TEST ! getfattr -n "trusted.ec.size" $HPATH
+cd
+
+cleanup;
+
diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c
index 3ae17e565ed..68741137619 100644
--- a/xlators/cluster/ec/src/ec-dir-write.c
+++ b/xlators/cluster/ec/src/ec-dir-write.c
@@ -307,7 +307,7 @@ void ec_create(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -472,7 +472,7 @@ void ec_link(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -648,7 +648,7 @@ void ec_mkdir(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -853,7 +853,7 @@ void ec_mknod(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1018,7 +1018,7 @@ void ec_rename(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1163,7 +1163,7 @@ void ec_rmdir(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1329,7 +1329,7 @@ void ec_symlink(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1475,7 +1475,7 @@ void ec_unlink(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c
index 4bd692dff57..6aeda5a2481 100644
--- a/xlators/cluster/ec/src/ec-inode-write.c
+++ b/xlators/cluster/ec/src/ec-inode-write.c
@@ -231,7 +231,7 @@ ec_removexattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -317,7 +317,7 @@ ec_fremovexattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -512,7 +512,7 @@ void ec_setattr(call_frame_t * frame, xlator_t * this, uintptr_t target,
fop->iatt = *stbuf;
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -593,7 +593,7 @@ void ec_fsetattr(call_frame_t * frame, xlator_t * this, uintptr_t target,
fop->iatt = *stbuf;
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -666,7 +666,7 @@ ec_setxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (dict != NULL) {
- fop->dict = dict_ref(dict);
+ fop->dict = dict_copy_with_ref(dict, NULL);
if (fop->dict == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -677,7 +677,7 @@ ec_setxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -795,7 +795,7 @@ ec_fsetxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (dict != NULL) {
- fop->dict = dict_ref(dict);
+ fop->dict = dict_copy_with_ref(dict, NULL);
if (fop->dict == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -806,7 +806,7 @@ ec_fsetxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1092,7 +1092,7 @@ void ec_truncate(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1170,7 +1170,7 @@ void ec_ftruncate(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1656,7 +1656,7 @@ void ec_writev(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,