summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-rebalance.c
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2014-09-18 14:36:38 +0530
committerVijay Bellur <vbellur@redhat.com>2014-09-19 07:10:24 -0700
commit258e61adb5505124925c71d2a0d0375d086e32d4 (patch)
treed77f4922b3b872bdd262c3666215743b3e184bdd /xlators/cluster/dht/src/dht-rebalance.c
parentfb6702b7f8ba19333b7ba4af543d908e3f5e1923 (diff)
cluster/dht: Fix dict_t leaks in rebalance process' execution path
Two dict_t objects are leaked for every file migrated in success codepath. It is the caller's responsibility to unref dict that it gets from calls to syncop_getxattr(); and rebalance performs two syncop_getxattr()s per file without freeing them. Also, syncop_getxattr() on GF_XATTR_LINKINFO_KEY doesn't seem to be using the response dict. Hence, NULL is now passed as opposed to @dict to syncop_getxattr(). Change-Id: I5a4b5ab834df3633dea994f239bbdbc34cbe9259 BUG: 1142052 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/8763 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-rebalance.c')
-rw-r--r--xlators/cluster/dht/src/dht-rebalance.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
index 358d221c81c..3c976b113fa 100644
--- a/xlators/cluster/dht/src/dht-rebalance.c
+++ b/xlators/cluster/dht/src/dht-rebalance.c
@@ -1444,6 +1444,12 @@ gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
free_entries = _gf_true;
list_for_each_entry_safe (entry, tmp, &entries.list, list) {
+
+ if (dict) {
+ dict_unref (dict);
+ dict = NULL;
+ }
+
if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {
ret = 1;
goto out;
@@ -1550,9 +1556,6 @@ gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
uuid_str = NULL;
- dict_del (dict, GF_XATTR_NODE_UUID_KEY);
-
-
/* if distribute is present, it will honor this key.
* -1, ENODATA is returned if distribute is not present
* or file doesn't have a link-file. If file has
@@ -1560,7 +1563,7 @@ gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,
* and also that guarantees that file has to be mostly
* migrated */
- ret = syncop_getxattr (this, &entry_loc, &dict,
+ ret = syncop_getxattr (this, &entry_loc, NULL,
GF_XATTR_LINKINFO_KEY);
if (ret < 0) {
if (-ret != ENODATA) {