[erlang-questions] Shouldn't Mnesia be fully initialized after mnesia:start()?

Andreas Hillqvist <>
Thu Jan 24 08:17:29 CET 2008


I belive you are looking for: mnesia:wait_for_tables/2

Try:
 test_no_wait() ->
  mnesia:start(),
  ok = mnesia:wait_for_tables([registered_symbol], 1000),
  Fun = fun() ->
          Q = qlc:q([E || E <- mnesia:table(registered_symbol)]),
          qlc:e(Q)
       end,
  mnesia:transaction(Fun).


Regards
Andreas Hillqvist

2008/1/24, Artur Matos <>:
> Hi to all,
>
> I have started studying Mnesia recently, and as a test I've wrote the
> following simple program:
>
> -module(mnesiatest).
> -compile([export_all]).
>
>  -include_lib("stdlib/include/qlc.hrl").
>
> -record(registered_symbol, {symbol, date}).
>
> test_no_wait() ->
>  mnesia:start(),
>  Fun = fun() ->
>          Q = qlc:q([E || E <-
> mnesia:table(registered_symbol)]),
>          qlc:e(Q)
>       end,
>  mnesia:transaction(Fun).
>
> So test_no_wait() basically starts Mnesia and does a query of
> all the records registered in the registered_symbol table. Now if I run this
> program,
> I get the following error (using Erlang R12B on Mac OS X 10.4, PPC):
>
>
> 10> mnesiatest:test_no_wait().
> {aborted,{no_exists,registered_symbol}}
>
> Although the record registered_symbol is defined in the source code. But if
> I
> change test_no_wait() to include a slight delay between mnesia:start() and
> the
> querying:
>
> test_wait() ->
>  mnesia:start(),        %% Blocks for 10 seconds
>  receive
>         after 10000 ->
>     true
>         end,
>  Fun = fun() ->
>          Q = qlc:q([E || E <-
> mnesia:table(registered_symbol)]),
>          qlc:e(Q)
>       end,
>  mnesia:transaction(Fun).
>
> and run this version:
>
> 11> mnesia:stop().
>
> =INFO REPORT==== 20-Jan-2008::17:27:16 ===
>     application: mnesia
>     exited: stopped
>     type: temporary
> stopped
> 12> mnesiatest:test_wait().
> {atomic,[{registered_symbol,"IBM",{2008,1,20}}]}
> 13>
>
> then my query works, but I find this behavior a bit strange. It looks like
> some Mnesia initialization is still going on after my call to
> mnesia:start(), but shouldn't mnesia:start() block until Mnesia is fully
> initialized? or shouldn't at least mnesia:transaction(Fun) do this? Or is
> there any command that I should be calling that blocks until everything
> is initialized?
>
> In case it helps, this is the call I am using to define my database:
>
> init() ->
>        mnesia:create_table(registered_symbol,
> [{disc_copies, [node()]}, {attributes, record_info(fields,
> registered_symbol)}]).
> Thanks for the help,
>
> Artur.
>
>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list