From 3042613687d976c4e8938fb411cedc6e6ef559bf Mon Sep 17 00:00:00 2001 From: Susant Palai Date: Wed, 9 Jul 2014 09:31:45 -0400 Subject: DHT/Create : Failing to identify a linkto file in lookup_everywhere_cbk path In case a file is not found in its cached subvol we proceed with dht_lookup_everywhere. But as we dont add the linkto xattr to the dictionary, we fail to identify any linkto file encountered.The implication being we end up thinking the linkto file as a regular file and proceed with the fop. Change-Id: Iab02dc60e84bb1aeab49182f680c0631c33947e2 BUG: 1139992 Signed-off-by: Susant Palai Reviewed-on: http://review.gluster.org/8277 Reviewed-by: Vijay Bellur Tested-by: Gluster Build System Reviewed-on: http://review.gluster.org/8673 Reviewed-by: N Balachandran Reviewed-by: Kaleb KEITHLEY --- xlators/cluster/dht/src/dht-common.c | 48 ++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'xlators') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 29a63437f7b..5f7996a9ad6 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1470,11 +1470,27 @@ dht_lookup (call_frame_t *frame, xlator_t *this, local->inode = inode_ref (loc->inode); - /* NOTE: we don't require 'trusted.glusterfs.dht.linkto' attribute, - * revalidates directly go to the cached-subvolume. - */ ret = dict_set_uint32 (local->xattr_req, "trusted.glusterfs.dht", 4 * 4); + if (ret) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:" + "key = trusted.glusterfs.dht for " + "path %s", loc->path); + goto err; + } + + /* need it in case file is not found on cached file + * on revalidate path and we may encounter linkto files on + * with dht_lookup_everywhere*/ + ret = dict_set_uint32 (local->xattr_req, DHT_LINKFILE_KEY, 256); + if (ret < 0) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:" + "key = %s for " + "path %s", DHT_LINKFILE_KEY, loc->path); + goto err; + } if (IA_ISDIR (local->inode->ia_type)) { local->call_cnt = call_cnt = conf->subvolume_cnt; @@ -1493,7 +1509,12 @@ dht_lookup (call_frame_t *frame, xlator_t *this, 'in-migration' state */ ret = dict_set_uint32 (local->xattr_req, GLUSTERFS_OPEN_FD_COUNT, 4); - + if (ret) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:key = %s for " + "path %s", GLUSTERFS_OPEN_FD_COUNT, loc->path); + goto err; + } /* need it for dir self-heal */ dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); @@ -1510,15 +1531,32 @@ dht_lookup (call_frame_t *frame, xlator_t *this, /* TODO: remove the hard-coding */ ret = dict_set_uint32 (local->xattr_req, "trusted.glusterfs.dht", 4 * 4); + if (ret) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:key = %s for " + "path %s", "trusted.glusterfs.dht", loc->path); + goto err; + } ret = dict_set_uint32 (local->xattr_req, DHT_LINKFILE_KEY, 256); + if (ret) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:key = %s for " + "path %s", DHT_LINKFILE_KEY, loc->path); + goto err; + } /* need it for self-healing linkfiles which is 'in-migration' state */ ret = dict_set_uint32 (local->xattr_req, GLUSTERFS_OPEN_FD_COUNT, 4); - + if (ret) { + gf_log (this->name, GF_LOG_WARNING, + "Failed to set dictionary value:key = %s for " + "path %s", GLUSTERFS_OPEN_FD_COUNT, loc->path); + goto err; + } /* need it for dir self-heal */ dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); -- cgit