question about mnesia distribution

2019-04-15 12:58发布

问题:

I have two nodes running mnesia. I created schema and some tables on node 1, and used mnesia:add_table_copy on node 2 to copy the tables from node 1 to node 2.

Everything works well until I call q() on node 1 and then q() on node 2. I found that when I start node 1 again, mnesia:wait_for_tables([sometable], infinity) won't return. It will only return when I start node 2 again.

Is there a way to fix this? This is a problem because I won't be able to start node 1 again if node 2 is down.

回答1:

In this discussion a situation similar to the one you're facing is presented.

Reading from that source:

At startup Mnesia tries to connect with the other nodes and if that suceeds it loads its tables from them. If the other nodes are down, it looks for mnesia_down marks in its local transaction log in order to determine if it has a consistent replica or not of its tables. The node that was shutdown last has mnesia_down's from all the other nodes. This means that it safely can load its tables. If some of the other nodes where started first (as in your case) Mnesia will wait indefinitely for another node to connect in order to load its tables

You're shutting down node 1 first, so it doesn't have the mnesia_down from the other node. What happens if you reverse the shutting down order?

Also, it should be possible to force the table loading via the force_load_table/1 function:

force_load_table(Tab) -> yes | ErrorDescription

The Mnesia algorithm for table load might lead to a situation where a table cannot be loaded. This situation occurs when a node is started and Mnesia concludes, or suspects, that another copy of the table was active after this local copy became inactive due to a system crash.

If this situation is not acceptable, this function can be used to override the strategy of the Mnesia table load algorithm. This could lead to a situation where some transaction effects are lost with a inconsistent database as result, but for some applications high availability is more important than consistent data.