[Bugs] [Bug 1218488] Brick and nfs processes gets killed with OOM

bugzilla at redhat.com bugzilla at redhat.com
Mon May 18 17:02:01 UTC 2015


https://bugzilla.redhat.com/show_bug.cgi?id=1218488

Pranith Kumar K <pkarampu at redhat.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ON_QA
   Fixed In Version|                            |v3.7.0



--- Comment #3 from Pranith Kumar K <pkarampu at redhat.com> ---
These are the leaks found, which are merged as part of:
http://review.gluster.com/#/c/10693/

>From 78c8532a0b3f5a856c7aebaffdff80fa712b6817 Mon Sep 17 00:00:00 2001
From: Pranith Kumar K <pkarampu at redhat.com>
Date: Tue, 5 May 2015 14:57:30 +0530
Subject: [PATCH 1/1] cluster/ec: Fix memory leaks

Change-Id: Ie4e353ec3e1a92627c5f3fa0afee37c9e602c847
Signed-off-by: Pranith Kumar K <pkarampu at redhat.com>
---
 xlators/cluster/ec/src/ec-heal.c       |  7 ++++---
 xlators/cluster/ec/src/ec-heald.c      | 14 +++++++++-----
 xlators/cluster/ec/src/ec-inode-read.c |  2 +-
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/xlators/cluster/ec/src/ec-heal.c
b/xlators/cluster/ec/src/ec-heal.c
index ac796b2..a517fc7 100644
--- a/xlators/cluster/ec/src/ec-heal.c
+++ b/xlators/cluster/ec/src/ec-heal.c
@@ -2315,9 +2315,9 @@ ec_create_name (call_frame_t *frame, ec_t *ec, inode_t
*parent, char *name,

         ret = 0;
 out:
+        cluster_replies_wipe (replies, ec->nodes);
         loc_wipe (&loc);
         loc_wipe (&srcloc);
-        EC_REPLIES_ALLOC (replies, ec->nodes);
         if (xdata)
                 dict_unref (xdata);
         return ret;
@@ -2340,6 +2340,7 @@ __ec_heal_name (call_frame_t *frame, ec_t *ec, inode_t
*parent, char *name,
         unsigned char      *same     = NULL;
         unsigned char      *gfidless = NULL;

+        EC_REPLIES_ALLOC (replies, ec->nodes);
         loc.parent = inode_ref (parent);
         loc.inode = inode_new (parent->table);
         gf_uuid_copy (loc.pargfid, parent->gfid);
@@ -2360,7 +2361,6 @@ __ec_heal_name (call_frame_t *frame, ec_t *ec, inode_t
*parent, char *name,
         output = alloca0 (ec->nodes);
         gfidless = alloca0 (ec->nodes);
         enoent = alloca0 (ec->nodes);
-        EC_REPLIES_ALLOC (replies, ec->nodes);
         ret = cluster_lookup (ec->xl_list, participants, ec->nodes, replies,
                               output, frame, ec->xl, &loc, NULL);
         for (i = 0; i < ec->nodes; i++) {
@@ -2529,6 +2529,7 @@ ec_heal_names (call_frame_t *frame, ec_t *ec, inode_t
*inode,
                 if (EC_COUNT (participants, ec->nodes) <= ec->fragments)
                         return -ENOTCONN;
         }
+        loc_wipe (&loc);
         return 0;
 }

@@ -3348,7 +3349,7 @@ ec_heal_data (call_frame_t *frame, ec_t *ec, gf_boolean_t
block, inode_t *inode,
         locked_on  = alloca0(ec->nodes);
         output     = alloca0(ec->nodes);
         up_subvols = alloca0(ec->nodes);
-        loc. inode = inode_ref (inode);
+        loc.inode = inode_ref (inode);
         gf_uuid_copy (loc.gfid, inode->gfid);

         fd = fd_create (inode, 0);
diff --git a/xlators/cluster/ec/src/ec-heald.c
b/xlators/cluster/ec/src/ec-heald.c
index 53b3996..a7cf8f7 100644
--- a/xlators/cluster/ec/src/ec-heald.c
+++ b/xlators/cluster/ec/src/ec-heald.c
@@ -18,7 +18,7 @@
 #include "syncop-utils.h"
 #include "protocol-common.h"

-#define SHD_INODE_LRU_LIMIT          2048
+#define SHD_INODE_LRU_LIMIT          10
 #define ASSERT_LOCAL(this, healer)                        \
         do {                                                            \
                 if (!ec_shd_is_subvol_local (this, healer->subvol)) {    \
@@ -224,8 +224,8 @@ ec_shd_index_heal (xlator_t *subvol, gf_dirent_t *entry,
loc_t *parent,
                    void *data)
 {
         struct subvol_healer *healer = data;
-        ec_t                 *ec = NULL;
-        loc_t                loc = {0};
+        ec_t                 *ec     = NULL;
+        loc_t                loc     = {0};
         int                  ret     = 0;

         ec = healer->this->private;
@@ -254,6 +254,8 @@ ec_shd_index_heal (xlator_t *subvol, gf_dirent_t *entry,
loc_t *parent,
         ec_shd_selfheal (healer, healer->subvol, &loc);

 out:
+        if (loc.inode)
+                inode_forget (loc.inode, 0);
         loc_wipe (&loc);

         return 0;
@@ -280,7 +282,7 @@ ec_shd_index_sweep (struct subvol_healer *healer)
         ret = syncop_dir_scan (subvol, &loc, GF_CLIENT_PID_AFR_SELF_HEALD,
                                healer, ec_shd_index_heal);

-        inode_forget (loc.inode, 1);
+        inode_forget (loc.inode, 0);
         loc_wipe (&loc);

         return ret;
@@ -318,10 +320,12 @@ ec_shd_full_heal (xlator_t *subvol, gf_dirent_t *entry,
loc_t *parent,

         ec_shd_selfheal (healer, healer->subvol, &loc);

-        loc_wipe (&loc);
         ret = 0;

 out:
+        if (loc.inode)
+                inode_forget (loc.inode, 0);
+        loc_wipe (&loc);
         return ret;
 }

diff --git a/xlators/cluster/ec/src/ec-inode-read.c
b/xlators/cluster/ec/src/ec-inode-read.c
index 3483dfb..273d50f 100644
--- a/xlators/cluster/ec/src/ec-inode-read.c
+++ b/xlators/cluster/ec/src/ec-inode-read.c
@@ -374,7 +374,7 @@ int32_t ec_getxattr_heal_cbk(call_frame_t *frame, void
*cookie, xlator_t *xl,
                 goto out;
             }

-            if (dict_set_str(dict, EC_XATTR_HEAL, str) != 0) {
+            if (dict_set_dynstr(dict, EC_XATTR_HEAL, str) != 0) {
                 GF_FREE(str);
                 dict_unref(dict);
                 dict = NULL;
-- 
1.9.0

-- 
You are receiving this mail because:
You are on the CC list for the bug.
Unsubscribe from this bug https://bugzilla.redhat.com/token.cgi?t=qzcHT4Aj6f&a=cc_unsubscribe


More information about the Bugs mailing list