[erlang-questions] Residual indexes with mnesia

Salazard Rémy <>
Thu Mar 15 11:48:40 CET 2007


Hi,

I have a problem with a mnesia table of type 'bag' with indexed fields.

When I'm using mnesia:dirty_delete_object/2, sometimes the indexes are
removed and sometimes not :(

Here is a testcase module:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-module(test).

-export([start/0]).
-export([set/0, unset/0]).

-record(mytbl, {one, two}).

start() ->
    mnesia:create_schema([node()]),
    mnesia:start(),
    mnesia:create_table(mytbl,
                        [{ram_copies, [node()]},
                         {attributes, record_info(fields, mytbl)},
                         {type, bag}]),
    mnesia:add_table_index(mytbl, two).

set() ->
    add({1,1}), add({2,1}), add({2,2}), add({3,1}),
    add({4,1}), add({2,4}), add({3,2}), add({2,0}),
    ok.

unset() ->
    del({1,1}), del({2,1}), del({2,2}), del({3,1}),
    del({4,1}), del({2,4}), del({3,2}), del({2,0}),
    ok.

add({One, Two}) ->
    mnesia:dirty_write(#mytbl{one = One,
                              two = Two}).
del({One, Two}) ->
    mnesia:dirty_delete_object(mytbl, {mytbl, One, Two}).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

As you can see, there are only two fields and the second is indexed.

1> test:start().
%% two tables are created, 'mytbl' and the mnesia protected table
'mnesia_index' (its ets id is 43).

2> test:set().
%% 'mytbl' contains 8 records:
3> ets:i(mytbl).
<1   > {mytbl,4,1}
<2   > {mytbl,3,1}
<3   > {mytbl,3,2}
<4   > {mytbl,2,1}
<5   > {mytbl,2,2}
<6   > {mytbl,2,4}
<7   > {mytbl,2,0}
<8   > {mytbl,1,1}
EOT  (q)uit (p)Digits (k)ill /Regexp -->
%% and 'mnesia_index' contains 8 records too:
4> ets:i(43).
<1   > {0,2}
<2   > {4,2}
<3   > {2,2}
<4   > {2,3}
<5   > {1,1}
<6   > {1,2}
<7   > {1,3}
<8   > {1,4}
EOT  (q)uit (p)Digits (k)ill /Regexp -->

5> test:unset().
6> ets:i(mytbl).
EOT  (q)uit (p)Digits (k)ill /Regexp -->
%% now 'mytbl' is empty, but...
7> ets:i(43).
<1   > {4,2}
<2   > {2,2}
<3   > {1,2}
<4   > {1,3}
EOT  (q)uit (p)Digits (k)ill /Regexp -->

(notice that the residual indexes correspond to mytbl's records which
had no unique first indexe.)


Do I make a mistake or is it a bug?

Thanks

Rémy



More information about the erlang-questions mailing list