summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-rebalance.c
diff options
context:
space:
mode:
authorDan Lambright <dlambrig@redhat.com>2015-06-26 16:33:49 -0400
committerDan Lambright <dlambrig@redhat.com>2015-07-13 09:38:57 -0700
commit67a53554ed75081612b56a5658fd569dc5aaa785 (patch)
tree7b5a7a2730452a642cc3dd0b1ce3755c8fb0c77f /xlators/cluster/dht/src/dht-rebalance.c
parent890e58f5d4d3db9477e36cac3d16798ffe3b0480 (diff)
cluster/tier: fixes for migration over ec as cold tier
An opendir is done in rebalance. The graph constructed when EC is used in tiering may have no local volumes (if all the hot volumes are on one node and all the others on another node). Previously the opendir only sent fops down the local subvolumes for migration. They must be sent down both the hot and cold subvolumes for tiering. When setxattr2() received a NULL subvolume; this dereferenced an uninitialized variable. When a lookup is done during creation of the destination file, the xattr dict is "polluted" with virtual xattrs. These cause subsequent xattrs in the new file to not be written by posix. They are required by EC. The inode gfid for "entry_loc" in gf_defrag_migrate_single_file() was not initialized. This made underlying translators think the gfid was 0, and failed migration. Change-Id: I6ccda8ca8e43485b9b354341bbfcb302496f632c BUG: 1236212 Signed-off-by: Dan Lambright <dlambrig@redhat.com> Reviewed-on: http://review.gluster.org/11433 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-rebalance.c')
-rw-r--r--xlators/cluster/dht/src/dht-rebalance.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
index 6978d788303..ec2061cbc4c 100644
--- a/xlators/cluster/dht/src/dht-rebalance.c
+++ b/xlators/cluster/dht/src/dht-rebalance.c
@@ -1546,6 +1546,7 @@ gf_defrag_migrate_single_file (void *opaque)
struct timeval end = {0,};
double elapsed = {0,};
struct dht_container *rebal_entry = NULL;
+ inode_t *inode = NULL;
rebal_entry = (struct dht_container *)opaque;
if (!rebal_entry) {
@@ -1603,8 +1604,6 @@ gf_defrag_migrate_single_file (void *opaque)
gf_uuid_copy (entry_loc.pargfid, loc->gfid);
- entry_loc.inode->ia_type = entry->d_stat.ia_type;
-
ret = syncop_lookup (this, &entry_loc, &iatt, NULL, NULL, NULL);
if (ret) {
gf_msg (this->name, GF_LOG_ERROR, 0,
@@ -1615,6 +1614,11 @@ gf_defrag_migrate_single_file (void *opaque)
goto out;
}
+ inode = inode_link (entry_loc.inode, entry_loc.parent, entry->d_name, &iatt);
+ inode_unref (entry_loc.inode);
+ /* use the inode returned by inode_link */
+ entry_loc.inode = inode;
+
ret = syncop_setxattr (this, &entry_loc, migrate_data, 0, NULL, NULL);
if (ret < 0) {
op_errno = -ret;