[erlang-bugs] Can't run mnesia:first on empty fragmented table

Dan Gudmundsson dangud@REDACTED
Mon Mar 7 16:07:49 CET 2011


Looks correct to me.

I will include it directly.

/Dan

On Fri, Mar 4, 2011 at 3:39 PM, Magnus Henoch
<magnus.henoch@REDACTED> wrote:
> Hi all,
>
> When I run mnesia:first on an empty fragmented table, it tries to
> access the fragment with the number one beyond the maximum.  In the
> sample code below, I create a table with two fragments, 'foo' and
> 'foo_frag2', but mnesia tries to access 'foo_frag3':
>
> -module(foo).
>
> -compile(export_all).
>
> foo() ->
>    net_kernel:start([foo, shortnames]),
>    application:start(mnesia),
>    {atomic, ok} = mnesia:create_table(foo, []),
>    %% activate fragmentation
>    {atomic, ok} = mnesia:change_table_frag(foo, {activate, []}),
>    %% add a second fragment on this node
>    {atomic, ok} = mnesia:change_table_frag(foo, {add_frag, [node()]}),
>
>    io:format("Our table is fragmented:~n~p~n", [mnesia:table_info(foo, all)]),
>
>    io:format("Now let's run mnesia:first.  We expect to get ~p.~n~p~n",
>              ['$end_of_table',
>               %% but we get {'EXIT',{aborted,{no_exists,[foo_frag3]}}}
>               catch mnesia:activity(sync_dirty,
>                                 fun() -> mnesia:first(foo) end,
>                                 [],
>                                 mnesia_frag)]).
>
> It looks like a simple off-by-one error in mnesia_frag:search_first.
> Changing the guard from '=<' to '<' as in the patch below fixes my
> test case (and the real system I distilled it from), but I'd
> appreciate a second opinion.
>
> Regards,
> Magnus
>
>
> diff --git a/lib/mnesia/src/mnesia_frag.erl b/lib/mnesia/src/mnesia_frag.erl
> index a2958ab..d33dafe 100644
> --- a/lib/mnesia/src/mnesia_frag.erl
> +++ b/lib/mnesia/src/mnesia_frag.erl
> @@ -209,7 +209,7 @@ first(ActivityId, Opaque, Tab) ->
>            end
>     end.
>
> -search_first(ActivityId, Opaque, Tab, N, FH) when N =< FH#frag_state.n_fragments ->
> +search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
>     NextN = N + 1,
>     NextFrag = n_to_frag_name(Tab, NextN),
>     case mnesia:first(ActivityId, Opaque, NextFrag) of
>
> ________________________________________________________________
> erlang-bugs (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-bugs-unsubscribe@REDACTED
>
>


More information about the erlang-bugs mailing list