[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