[erlang-questions] Ridiculuous newbie mnesia question.

Mazen Harake <>
Mon Oct 25 09:56:37 CEST 2010


Although all these points are valid I would like to add a third point 
which should solve this particular situation;

3. The line '[] = [backgammon_games,game_record]' means that no node, 
which is a copy-holder of these tables, is connected. This means that 
you should first start one of those nodes (or a "fake" of one with the 
same nodename) and then start mnesia and do 
mnesia:change_config(extra_db_nodes, N) (as Ulf mentioned) where N is a 
copy-holder of those tables. When this is done the node name will show 
up like this: '[{, ram_copies}] = 
[backgammon_games,game_record]'  and then it is safe to remove the table.

The important part here is the "copy-holder" concept. An empty list 
means "no one is available", but the local node still knows about it so 
it "exists" but it doesn't exist in a place where you can change it (it 
is in a different dimension >:P). That is the reason why you can't 
create it nor delete it.

/Mazen

On 25/10/2010 08:41, Ulf Wiger wrote:
> Hi Jeffrey,
>
> Looking at the mnesia:info() output, there are a couple of things
> to note.
>
> 1. 'running db nodes = []' means that while 
>     and  might be running at the erlang level, perhaps even
>     with mnesia runnin, they are not connected to 
>
> 2. The line '"c:/.../" is NOT used' means that
>      you have not created a persistent schema. Normally, the persistent
>      schema indicates which nodes are part of the mnesia cluster. Any
>      other nodes that want to join should specify -mnesia extra_db_nodes Ns,
>      where Ns includes at least some of the nodes listed in the persistent schema.
>
> To create a persistent schema, you run this before starting mnesia:
>
> mnesia:create_schema(Nodes).
>
> ...with the nodes in Nodes all up and running. You only need to call it
> from one node; it will create a schema on each node automatically.
>
> BR,
> Ulf W
>
> On 25 Oct 2010, at 07:30, Jeffrey Rennie wrote:
>
>> I launched a new erl node with a proper -sname, and I'm still experiencing
>> the same problem.  Yes, nodes  and  are up and running.
>>
>> ()17>  backgammon:init().
>> {atomic,ok}
>> ()18>  backgammon:insert_game(1, "Jeff").
>> {aborted,{no_exists,game_record}}
>> ()19>  backgammon:init().
>> {aborted,{already_exists,game_record}}
>> ()20>  mnesia:info().
>> --->  Processes holding locks<---
>> --->  Processes waiting for locks<---
>> --->  Participant transactions<---
>> --->  Coordinator transactions<---
>> --->  Uncertain transactions<---
>> --->  Active tables<---
>> schema         : with 3        records occupying 656      words of mem
>> ===>  System info in version "4.4.13", debug level = none<===
>> opt_disc. Directory
>> "c:/Users/jeff/code/code/scratch/erlang/" is NOT used.
>> use fallback at restart = false
>> running db nodes   = []
>> stopped db nodes   = []
>> master node tables = []
>> remote             = [backgammon_games,game_record]
>> ram_copies         = [schema]
>> disc_copies        = []
>> disc_only_copies   = []
>> [] = [backgammon_games,game_record]
>> [{,ram_copies}] = [schema]
>> 4 transactions committed, 3 aborted, 0 restarted, 0 logged to disc
>> 0 held locks, 0 in queue; 0 local transactions, 0 remote
>> 0 transactions waits for other nodes: []
>> ok
>> ()21>  mnesia:delete_table(backgammon_games).
>> {aborted,{no_exists,backgammon_games}}
>> ()22>  mnesia:delete_table(game_record).
>> {aborted,{no_exists,game_record}}
>> ()23>  backgammon:init().
>> {aborted,{already_exists,game_record}}
>> ()24>
>>
>>
>>> -----Original Message-----
>>> From: Ulf Wiger [mailto:]
>>> Sent: Sunday, October 24, 2010 3:02 PM
>>> To: Jeffrey Rennie
>>> Cc: 
>>> Subject: Re: [erlang-questions] Ridiculuous newbie mnesia question.
>>>
>>>
>>> Hi Jeffrey,
>>>
>>> The problem is that you have specified that the backgammon_games
>>> table should have copies on  and , but your
>>> Erlang shell has the node name  (i.e. Erlang was
>>> started without distribution).
>>>
>>> One might argue whether it wouldn't have been better if mnesia had
>>> refused to create the table in the first place. As it is now, it
>>> believes
>>> it exists, because there is an entry in the schema, but it refuses to
>>> delete it because it has no active replicas. But since that's not what
>>> it
>>> complains about, I can understand your confusion. :)
>>>
>>> BR,
>>> Ulf W
>>>
>>>
>>> On 24 Oct 2010, at 23:37, Jeffrey Rennie wrote:
>>>
>>>> I seem to be stuck in a state where I can't create a table because it
>>>> exists, but I can't delete the table because it doesn't exist!
>>>>
>>>> I searched the mnesia documentation, and I couldn't find a definition
>>>> of the "Tab" arg passed to many mnesia functions.
>>>>
>>>> Here's what I tried:
>>>>
>>>> Eshell V5.7.5  (abort with ^G)
>>>> 2>  c(backgammon).
>>>> {ok,backgammon}
>>>> 5>  c(backgammon).
>>>> {ok,backgammon}
>>>> 7>  mnesia:start().
>>>> ok
>>>> 8>  backgammon:init().
>>>> {atomic,ok}
>>>> 11>  c(backgammon).
>>>> {ok,backgammon}
>>>> 12>  backgammon:dumpfields().
>>>> [player_turn,dice,board]
>>>> 13>  c(backgammon).
>>>> {ok,backgammon}
>>>> 14>  backgammon:init().
>>>> {aborted,{already_exists,backgammon_games}}
>>>> 15>  mnesia:info().
>>>> --->  Processes holding locks<---
>>>> --->  Processes waiting for locks<---
>>>> --->  Participant transactions<---
>>>> --->  Coordinator transactions<---
>>>> --->  Uncertain transactions<---
>>>> --->  Active tables<---
>>>> schema         : with 2        records occupying 546      words of
>>> mem
>>>> ===>  System info in version "4.4.13", debug level = none<===
>>>> opt_disc. Directory
>>>> "c:/Users/jeff/code/code/scratch/erlang/" is NOT
>>>> used.
>>>> use fallback at restart = false
>>>> running db nodes   = []
>>>> stopped db nodes   = []
>>>> master node tables = []
>>>> remote             = [backgammon_games]
>>>> ram_copies         = [schema]
>>>> disc_copies        = []
>>>> disc_only_copies   = []
>>>> [] = [backgammon_games]
>>>> [{,ram_copies}] = [schema]
>>>> 3 transactions committed, 1 aborted, 0 restarted, 0 logged to disc
>>>> 0 held locks, 0 in queue; 0 local transactions, 0 remote
>>>> 0 transactions waits for other nodes: []
>>>> ok
>>>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>>> %% BEGIN CONFUSING BIT
>>>> 17>  mnesia:delete_table(backgammon_games).
>>>> {aborted,{no_exists,backgammon_games}}
>>>> 18>  backgammon:init().
>>>> {aborted,{already_exists,backgammon_games}}
>>>> 19>
>>>> %% END CONFUSING BIT
>>>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>>>
>>>>
>>>> Here's my backgammon.erl:
>>>> -module(backgammon).
>>>>
>>>> -compile(export_all).
>>>>
>>>> -include("backgammon.hrl").
>>>>
>>>> create_tables(MnesiaNodes) ->
>>>>    mnesia:create_table(backgammon_games,
>>>> 			[{attributes, record_info(fields, game_record)},
>>>> 			 {ram_copies, MnesiaNodes}]).
>>>>
>>>> init() ->
>>>>    create_tables([, ]).
>>>>
>>>> dumpfields() ->
>>>>    record_info(fields, game_state).
>>>>
>>>> ________________________________________________________________
>>>> erlang-questions (at) erlang.org mailing list.
>>>> See http://www.erlang.org/faq.html
>>>> To unsubscribe; mailto:
>>>>
>>> Ulf Wiger, CTO, Erlang Solutions, Ltd.
>>> http://erlang-solutions.com
>>>
>>
>>
> Ulf Wiger, CTO, Erlang Solutions, Ltd.
> http://erlang-solutions.com
>
>
>
>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:
>



More information about the erlang-questions mailing list