<div dir="ltr">Yep seems broken for 'bag' types.<div><br></div><div>I will take at look at that, thanks for the bug report.</div><div><br></div><div>/Dan<br><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 15, 2018 at 8:38 PM Karolis Petrauskas <<a href="mailto:k.petrauskas@gmail.com">k.petrauskas@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Forgot to mention the versions.<br>
This case is reproducible with "Erlang/OTP 21 [erts-10.0] [source]<br>
[64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]".<br>
The same behaviour is observed on Erlang/OTP 19.<br>
<br>
Karolis Petrauskas<br>
On Wed, Aug 15, 2018 at 5:49 PM Karolis Petrauskas<br>
<<a href="mailto:k.petrauskas@gmail.com" target="_blank">k.petrauskas@gmail.com</a>> wrote:<br>
><br>
> Hello,<br>
><br>
> I have strange trend in memory consumption on some servers. The ETS<br>
> memory constantly increases. The tables that are increasing are<br>
> mnesia_index tables. It looks like these tables are not cleaned-up<br>
> after the corresponding records are deleted from the indexed table.<br>
> Maybe the index is cleaned up later? I was waiting for a month, the<br>
> mnesia_index table has grown to 1GB approximately.<br>
><br>
> To reproduce the situation I made a simple test case. The code of the<br>
> tst module is shown at the end of this email.<br>
><br>
> First I create a bag table and add some (1000) records to it:<br>
><br>
>     4> tst:create_table().<br>
>     ok<br>
>     10> tst:data_add().<br>
>     ok<br>
>     12> ets:i().<br>
>      id              name              type  size   mem      owner<br>
>      ----------------------------------------------------------------------------<br>
>      ...<br>
>      45084           mnesia_index      ordered_set 1000   10088<br>
> mnesia_monitor<br>
>      ...<br>
>      t               t                 bag   1000   9298     mnesia_monitor<br>
>     ok<br>
><br>
> The table and the index has same number of records (the data for the<br>
> primary and the secondary indexes are unique in this case).<br>
> Then I delete the records:<br>
><br>
>     14> tst:data_del().<br>
>     ok<br>
>     16> ets:i().<br>
>      id              name              type  size   mem      owner<br>
>      ----------------------------------------------------------------------------<br>
>      ...<br>
>      45084           mnesia_index      ordered_set 1000   10088<br>
> mnesia_monitor<br>
>      ...<br>
>      t               t                 bag   0      298      mnesia_monitor<br>
>     ok<br>
><br>
> Here the table has 0 records (as expected), and the index still has<br>
> 1000 records.<br>
><br>
> The code of the tst module:<br>
><br>
>     -module(tst).<br>
>     -export([create_table/0, data_add/0, data_del/0]).<br>
>     -record(t, {a, b, c}).<br>
><br>
>     create_table() -><br>
>         {atomic, ok} = mnesia:create_table(t, [{type, bag},<br>
> {attributes, record_info(fields, t)}]),<br>
>         {atomic, ok} = mnesia:add_table_index(t, b),<br>
>         ok.<br>
><br>
>     data_add() -><br>
>         mnesia:activity(transaction, fun () -><br>
>             lists:foreach(fun (Key) -><br>
>                 mnesia:write(#t{a = Key, b = Key})<br>
>             end, lists:seq(1, 1000))<br>
>         end).<br>
><br>
>     data_del() -><br>
>         mnesia:activity(transaction, fun () -><br>
>             lists:foreach(fun (Key) -><br>
>                 [R] = mnesia:match_object(#t{a = Key, _ = '_'}),<br>
>                 mnesia:delete_object(R)<br>
>             end, lists:seq(1, 1000))<br>
>         end).<br>
><br>
><br>
> Karolis Petrauskas<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div></div></div>