Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
@ 2019-10-30 10:58 imeevma
  2019-10-30 22:13 ` Vladislav Shpilevoy
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: imeevma @ 2019-10-30 10:58 UTC (permalink / raw)
  To: v.shpilevoy; +Cc: tarantool-patches, tarantool-patches

Memleak appeared due to the fact that when creating a dictionary
its reference count is 1 from the beginning. Later, when the
dictionary is used to create tuple_format, its reference counter
increased by 1 and it became equal to 2. After removing
tuple_format, the reference counter for dict decreased by one, so
it became equal to 1. Since ref counter is not equal to 0, dict
not deleted, causing a memory leak.

Closes #4588
---
 src/box/lua/misc.cc | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/box/lua/misc.cc b/src/box/lua/misc.cc
index 7b8b9dc..102194e 100644
--- a/src/box/lua/misc.cc
+++ b/src/box/lua/misc.cc
@@ -233,6 +233,7 @@ lbox_tuple_format_new(struct lua_State *L)
 				 NULL, 0, 0, dict, false, false);
 	if (format == NULL)
 		return luaT_error(L);
+	tuple_dictionary_unref(dict);
 	return lbox_push_tuple_format(L, format);
 }
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-30 10:58 [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new() imeevma
@ 2019-10-30 22:13 ` Vladislav Shpilevoy
  2019-10-31  9:33   ` [Tarantool-patches] [tarantool-patches] " Mergen Imeev
  2019-10-31 15:23 ` [Tarantool-patches] " Konstantin Osipov
  2019-11-05 10:38 ` [Tarantool-patches] [tarantool-patches] " Kirill Yukhin
  2 siblings, 1 reply; 7+ messages in thread
From: Vladislav Shpilevoy @ 2019-10-30 22:13 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches, tarantool-patches

Hi! Thanks for the patch!

On 30/10/2019 11:58, imeevma@tarantool.org wrote:
> Memleak appeared due to the fact that when creating a dictionary
> its reference count is 1 from the beginning. Later, when the
> dictionary is used to create tuple_format, its reference counter
> increased by 1 and it became equal to 2. After removing
> tuple_format, the reference counter for dict decreased by one, so
> it became equal to 1. Since ref counter is not equal to 0, dict
> not deleted, causing a memory leak.
> 
> Closes #4588
> ---
>  src/box/lua/misc.cc | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/src/box/lua/misc.cc b/src/box/lua/misc.cc
> index 7b8b9dc..102194e 100644
> --- a/src/box/lua/misc.cc
> +++ b/src/box/lua/misc.cc
> @@ -233,6 +233,7 @@ lbox_tuple_format_new(struct lua_State *L)
>  				 NULL, 0, 0, dict, false, false);
>  	if (format == NULL)
>  		return luaT_error(L);

The dict should be unreferenced regardless of tuple_format_new()
result. Now there is a leak, when format == NULL.

> +	tuple_dictionary_unref(dict);
>  	return lbox_push_tuple_format(L, format);
>  }
>  

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [tarantool-patches] Re: [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-30 22:13 ` Vladislav Shpilevoy
@ 2019-10-31  9:33   ` Mergen Imeev
  0 siblings, 0 replies; 7+ messages in thread
From: Mergen Imeev @ 2019-10-31  9:33 UTC (permalink / raw)
  To: v.shpilevoy; +Cc: tarantool-patches, tarantool-patches

Thank you for review. I fixed the error and reworked the
patch a bit. New patch below.

On Wed, Oct 30, 2019 at 11:13:54PM +0100, Vladislav Shpilevoy wrote:
> Hi! Thanks for the patch!
> 
> On 30/10/2019 11:58, imeevma@tarantool.org wrote:
> > Memleak appeared due to the fact that when creating a dictionary
> > its reference count is 1 from the beginning. Later, when the
> > dictionary is used to create tuple_format, its reference counter
> > increased by 1 and it became equal to 2. After removing
> > tuple_format, the reference counter for dict decreased by one, so
> > it became equal to 1. Since ref counter is not equal to 0, dict
> > not deleted, causing a memory leak.
> > 
> > Closes #4588
> > ---
> >  src/box/lua/misc.cc | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/src/box/lua/misc.cc b/src/box/lua/misc.cc
> > index 7b8b9dc..102194e 100644
> > --- a/src/box/lua/misc.cc
> > +++ b/src/box/lua/misc.cc
> > @@ -233,6 +233,7 @@ lbox_tuple_format_new(struct lua_State *L)
> >  				 NULL, 0, 0, dict, false, false);
> >  	if (format == NULL)
> >  		return luaT_error(L);
> 
> The dict should be unreferenced regardless of tuple_format_new()
> result. Now there is a leak, when format == NULL.
> 
Fixed.

> > +	tuple_dictionary_unref(dict);
> >  	return lbox_push_tuple_format(L, format);
> >  }
> >  
> 

New patch:

From 0d5bbc6e95394cc772ab05d6af03bd1cee6c6536 Mon Sep 17 00:00:00 2001
From: Mergen Imeev <imeevma@gmail.com>
Date: Wed, 30 Oct 2019 13:39:14 +0300
Subject: [PATCH] netbox: fix memory leak in connect()

This patch fixes memory leak in lbox_tuple_format_new().

Closes #4588

diff --git a/src/box/lua/misc.cc b/src/box/lua/misc.cc
index 7b8b9dc..79b6cfe 100644
--- a/src/box/lua/misc.cc
+++ b/src/box/lua/misc.cc
@@ -231,6 +231,12 @@ lbox_tuple_format_new(struct lua_State *L)
 	struct tuple_format *format =
 		tuple_format_new(&tuple_format_runtime->vtab, NULL, NULL, 0,
 				 NULL, 0, 0, dict, false, false);
+	/*
+	 * Since dictionary reference counter is 1 from the
+	 * beginning and after creation of the tuple_format
+	 * increases by one, we must decrease it once.
+	 */
+	tuple_dictionary_unref(dict);
 	if (format == NULL)
 		return luaT_error(L);
 	return lbox_push_tuple_format(L, format);

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-30 10:58 [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new() imeevma
  2019-10-30 22:13 ` Vladislav Shpilevoy
@ 2019-10-31 15:23 ` Konstantin Osipov
  2019-10-31 16:43   ` Imeev Mergen
  2019-11-05 10:38 ` [Tarantool-patches] [tarantool-patches] " Kirill Yukhin
  2 siblings, 1 reply; 7+ messages in thread
From: Konstantin Osipov @ 2019-10-31 15:23 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches, tarantool-patches, v.shpilevoy

* imeevma@tarantool.org <imeevma@tarantool.org> [19/10/30 14:03]:
> Memleak appeared due to the fact that when creating a dictionary
> its reference count is 1 from the beginning. Later, when the
> dictionary is used to create tuple_format, its reference counter
> increased by 1 and it became equal to 2. After removing
> tuple_format, the reference counter for dict decreased by one, so
> it became equal to 1. Since ref counter is not equal to 0, dict
> not deleted, causing a memory leak.
> 
> Closes #4588

I wonder if you could come up with a test case? Is memory used by
dict accounted in any stats?


-- 
Konstantin Osipov, Moscow, Russia

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-31 15:23 ` [Tarantool-patches] " Konstantin Osipov
@ 2019-10-31 16:43   ` Imeev Mergen
  2019-11-02 16:26     ` Vladislav Shpilevoy
  0 siblings, 1 reply; 7+ messages in thread
From: Imeev Mergen @ 2019-10-31 16:43 UTC (permalink / raw)
  To: Konstantin Osipov, v.shpilevoy; +Cc: tarantool-patches, tarantool-patches


On 10/31/19 6:23 PM, Konstantin Osipov wrote:
> * imeevma@tarantool.org <imeevma@tarantool.org> [19/10/30 14:03]:
>> Memleak appeared due to the fact that when creating a dictionary
>> its reference count is 1 from the beginning. Later, when the
>> dictionary is used to create tuple_format, its reference counter
>> increased by 1 and it became equal to 2. After removing
>> tuple_format, the reference counter for dict decreased by one, so
>> it became equal to 1. Since ref counter is not equal to 0, dict
>> not deleted, causing a memory leak.
>>
>> Closes #4588
> I wonder if you could come up with a test case? Is memory used by
> dict accounted in any stats?
>
I did not find anything in box, and I did not see anything about
the statistics in the tuple_dictionary_new() function. Doesn't
look like we accounting this. At the moment, I can’t come up with
a test.

You think we should add this in stats?

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-31 16:43   ` Imeev Mergen
@ 2019-11-02 16:26     ` Vladislav Shpilevoy
  0 siblings, 0 replies; 7+ messages in thread
From: Vladislav Shpilevoy @ 2019-11-02 16:26 UTC (permalink / raw)
  To: Imeev Mergen, Kirill Yukhin; +Cc: tarantool-patches, tarantool-patches

Hi! Thanks for the fix!

LGTM.

On 31/10/2019 17:43, Imeev Mergen wrote:
> 
> On 10/31/19 6:23 PM, Konstantin Osipov wrote:
>> * imeevma@tarantool.org <imeevma@tarantool.org> [19/10/30 14:03]:
>>> Memleak appeared due to the fact that when creating a dictionary
>>> its reference count is 1 from the beginning. Later, when the
>>> dictionary is used to create tuple_format, its reference counter
>>> increased by 1 and it became equal to 2. After removing
>>> tuple_format, the reference counter for dict decreased by one, so
>>> it became equal to 1. Since ref counter is not equal to 0, dict
>>> not deleted, causing a memory leak.
>>>
>>> Closes #4588
>> I wonder if you could come up with a test case? Is memory used by
>> dict accounted in any stats?
>>
> I did not find anything in box, and I did not see anything about
> the statistics in the tuple_dictionary_new() function. Doesn't
> look like we accounting this. At the moment, I can’t come up with
> a test.
> 
> You think we should add this in stats?
> 

There is no accounting for the heap memory. We tried to add it via
symbol replacement, but it didn't work properly. I think we can
omit a test here.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Tarantool-patches] [tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new()
  2019-10-30 10:58 [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new() imeevma
  2019-10-30 22:13 ` Vladislav Shpilevoy
  2019-10-31 15:23 ` [Tarantool-patches] " Konstantin Osipov
@ 2019-11-05 10:38 ` Kirill Yukhin
  2 siblings, 0 replies; 7+ messages in thread
From: Kirill Yukhin @ 2019-11-05 10:38 UTC (permalink / raw)
  To: tarantool-patches; +Cc: tarantool-patches, v.shpilevoy

Hello,

On 30 окт 13:58, imeevma@tarantool.org wrote:
> Memleak appeared due to the fact that when creating a dictionary
> its reference count is 1 from the beginning. Later, when the
> dictionary is used to create tuple_format, its reference counter
> increased by 1 and it became equal to 2. After removing
> tuple_format, the reference counter for dict decreased by one, so
> it became equal to 1. Since ref counter is not equal to 0, dict
> not deleted, causing a memory leak.
> 
> Closes #4588

I've checked your patch into 2.2 and master.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-11-05 10:38 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-30 10:58 [Tarantool-patches] [PATCH v1 1/1] netbox: fix memleak in lbox_tuple_format_new() imeevma
2019-10-30 22:13 ` Vladislav Shpilevoy
2019-10-31  9:33   ` [Tarantool-patches] [tarantool-patches] " Mergen Imeev
2019-10-31 15:23 ` [Tarantool-patches] " Konstantin Osipov
2019-10-31 16:43   ` Imeev Mergen
2019-11-02 16:26     ` Vladislav Shpilevoy
2019-11-05 10:38 ` [Tarantool-patches] [tarantool-patches] " Kirill Yukhin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox