Browse Source

Add mnesia database creation in distributed environments.

Roberto Ostinelli 10 years ago
parent
commit
24f86e55a2
3 changed files with 131 additions and 3 deletions
  1. 8 0
      src/syn_backbone.erl
  2. 102 3
      test/syn_create_mnesia_SUITE.erl
  3. 21 0
      test/syn_test_suite_helper.erl

+ 8 - 0
src/syn_backbone.erl

@@ -105,6 +105,7 @@ initdb() ->
     %% ensure all nodes are added - this covers when mnesia is in ram only mode
     %% ensure all nodes are added - this covers when mnesia is in ram only mode
     mnesia:change_config(extra_db_nodes, [node() | nodes()]),
     mnesia:change_config(extra_db_nodes, [node() | nodes()]),
     %% ensure table exists
     %% ensure table exists
+    CurrentNode = node(),
     case mnesia:create_table(syn_processes_table, [
     case mnesia:create_table(syn_processes_table, [
         {type, set},
         {type, set},
         {ram_copies, [node() | nodes()]},
         {ram_copies, [node() | nodes()]},
@@ -118,6 +119,9 @@ initdb() ->
         {aborted, {already_exists, syn_processes_table}} ->
         {aborted, {already_exists, syn_processes_table}} ->
             %% table already exists, try to add current node as copy
             %% table already exists, try to add current node as copy
             add_table_copy_to_local_node();
             add_table_copy_to_local_node();
+        {aborted, {already_exists, syn_processes_table, CurrentNode}} ->
+            %% table already exists, try to add current node as copy
+            add_table_copy_to_local_node();
         Other ->
         Other ->
             error_logger:error_msg("Error while creating syn_processes_table: ~p", [Other]),
             error_logger:error_msg("Error while creating syn_processes_table: ~p", [Other]),
             {error, Other}
             {error, Other}
@@ -125,6 +129,7 @@ initdb() ->
 
 
 -spec add_table_copy_to_local_node() -> ok | {error, any()}.
 -spec add_table_copy_to_local_node() -> ok | {error, any()}.
 add_table_copy_to_local_node() ->
 add_table_copy_to_local_node() ->
+    CurrentNode = node(),
     case mnesia:add_table_copy(syn_processes_table, node(), ram_copies) of
     case mnesia:add_table_copy(syn_processes_table, node(), ram_copies) of
         {atomic, ok} ->
         {atomic, ok} ->
             error_logger:info_msg("Copy of syn_processes_table was successfully added to current node."),
             error_logger:info_msg("Copy of syn_processes_table was successfully added to current node."),
@@ -132,6 +137,9 @@ add_table_copy_to_local_node() ->
         {aborted, {already_exists, syn_processes_table}} ->
         {aborted, {already_exists, syn_processes_table}} ->
             %% a copy of syn_processes_table is already added to current node
             %% a copy of syn_processes_table is already added to current node
             ok;
             ok;
+        {aborted, {already_exists, syn_processes_table, CurrentNode}} ->
+            %% a copy of syn_processes_table is already added to current node
+            ok;
         {aborted, Reason} ->
         {aborted, Reason} ->
             error_logger:error_msg("Error while creating copy of syn_processes_table: ~p", [Reason]),
             error_logger:error_msg("Error while creating copy of syn_processes_table: ~p", [Reason]),
             {error, Reason}
             {error, Reason}

+ 102 - 3
test/syn_create_mnesia_SUITE.erl

@@ -13,7 +13,10 @@
     single_node_when_mnesia_is_disc/1
     single_node_when_mnesia_is_disc/1
 ]).
 ]).
 -export([
 -export([
-    two_nodes_when_mnesia_is_ram/1
+    two_nodes_when_mnesia_is_ram/1,
+    two_nodes_when_mnesia_is_opt_disc_no_schema_exists/1,
+    two_nodes_when_mnesia_is_opt_disc_schema_exists/1,
+    two_nodes_when_mnesia_is_disc/1
 ]).
 ]).
 
 
 %% include
 %% include
@@ -33,7 +36,8 @@
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
 all() ->
 all() ->
     [
     [
-        {group, mnesia_creation_single_node}
+        {group, mnesia_creation_single_node},
+        {group, mnesia_creation_two_nodes}
     ].
     ].
 
 
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
@@ -55,6 +59,12 @@ groups() ->
             single_node_when_mnesia_is_opt_disc_no_schema_exists,
             single_node_when_mnesia_is_opt_disc_no_schema_exists,
             single_node_when_mnesia_is_opt_disc_schema_exists,
             single_node_when_mnesia_is_opt_disc_schema_exists,
             single_node_when_mnesia_is_disc
             single_node_when_mnesia_is_disc
+        ]},
+        {mnesia_creation_two_nodes, [shuffle], [
+            two_nodes_when_mnesia_is_ram,
+            two_nodes_when_mnesia_is_opt_disc_no_schema_exists,
+            two_nodes_when_mnesia_is_opt_disc_schema_exists,
+            two_nodes_when_mnesia_is_disc
         ]}
         ]}
     ].
     ].
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
@@ -67,7 +77,7 @@ groups() ->
 init_per_suite(Config) ->
 init_per_suite(Config) ->
     %% config
     %% config
     [
     [
-        {slave_node_bare_name, syn_slave}
+        {slave_node_short_name, syn_slave}
         | Config
         | Config
     ].
     ].
 
 
@@ -85,6 +95,15 @@ end_per_suite(_Config) -> ok.
 %% Config0 = Config1 = [tuple()]
 %% Config0 = Config1 = [tuple()]
 %% Reason = term()
 %% Reason = term()
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
+init_per_group(mnesia_creation_two_nodes, Config) ->
+    %% get slave node short name
+    SlaveNodeShortName = proplists:get_value(slave_node_short_name, Config),
+    {ok, SlaveNodeName} = syn_test_suite_helper:start_slave(SlaveNodeShortName),
+    %% config
+    [
+        {slave_node_name, SlaveNodeName}
+        | Config
+    ];
 init_per_group(_GroupName, Config) -> Config.
 init_per_group(_GroupName, Config) -> Config.
 
 
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
@@ -93,6 +112,13 @@ init_per_group(_GroupName, Config) -> Config.
 %% GroupName = atom()
 %% GroupName = atom()
 %% Config0 = Config1 = [tuple()]
 %% Config0 = Config1 = [tuple()]
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
+end_per_group(mnesia_creation_two_nodes, Config) ->
+    %% get slave node name
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    %% clean
+    clean_after_test(SlaveNodeName),
+    %% stop slave
+    syn_test_suite_helper:stop_slave(SlaveNodeName);
 end_per_group(_GroupName, _Config) ->
 end_per_group(_GroupName, _Config) ->
     clean_after_test().
     clean_after_test().
 
 
@@ -135,6 +161,70 @@ single_node_when_mnesia_is_disc(_Config) ->
     %% check table exists
     %% check table exists
     true = lists:member(syn_processes_table, mnesia:system_info(tables)).
     true = lists:member(syn_processes_table, mnesia:system_info(tables)).
 
 
+two_nodes_when_mnesia_is_ram(Config) ->
+    %% get slave
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    %% set schema location
+    application:set_env(mnesia, schema_location, ram),
+    rpc:call(SlaveNodeName, mnesia, schema_location, [ram]),
+    %% start
+    ok = syn:start(),
+    ok = rpc:call(SlaveNodeName, syn, start, []),
+    %% check table exists on local
+    true = lists:member(syn_processes_table, mnesia:system_info(tables)),
+    %% check table exists on remote
+    SlaveNodeMnesiaSystemInfo = rpc:call(SlaveNodeName, mnesia, system_info, [tables]),
+    true = rpc:call(SlaveNodeName, lists, member, [syn_processes_table, SlaveNodeMnesiaSystemInfo]).
+
+two_nodes_when_mnesia_is_opt_disc_no_schema_exists(Config) ->
+    %% get slave
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    %% set schema location
+    application:set_env(mnesia, schema_location, opt_disc),
+    rpc:call(SlaveNodeName, mnesia, schema_location, [opt_disc]),
+    %% start
+    ok = syn:start(),
+    ok = rpc:call(SlaveNodeName, syn, start, []),
+    %% check table exists on local
+    true = lists:member(syn_processes_table, mnesia:system_info(tables)),
+    %% check table exists on remote
+    SlaveNodeMnesiaSystemInfo = rpc:call(SlaveNodeName, mnesia, system_info, [tables]),
+    true = rpc:call(SlaveNodeName, lists, member, [syn_processes_table, SlaveNodeMnesiaSystemInfo]).
+
+two_nodes_when_mnesia_is_opt_disc_schema_exists(Config) ->
+    %% get slave
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    %% set schema location
+    application:set_env(mnesia, schema_location, opt_disc),
+    rpc:call(SlaveNodeName, mnesia, schema_location, [opt_disc]),
+    %% create schema
+    mnesia:create_schema([node(), SlaveNodeName]),
+    %% start
+    ok = syn:start(),
+    ok = rpc:call(SlaveNodeName, syn, start, []),
+    %% check table exists on local
+    true = lists:member(syn_processes_table, mnesia:system_info(tables)),
+    %% check table exists on remote
+    SlaveNodeMnesiaSystemInfo = rpc:call(SlaveNodeName, mnesia, system_info, [tables]),
+    true = rpc:call(SlaveNodeName, lists, member, [syn_processes_table, SlaveNodeMnesiaSystemInfo]).
+
+two_nodes_when_mnesia_is_disc(Config) ->
+    %% get slave
+    SlaveNodeName = proplists:get_value(slave_node_name, Config),
+    %% set schema location
+    application:set_env(mnesia, schema_location, disc),
+    rpc:call(SlaveNodeName, mnesia, schema_location, [disc]),
+    %% create schema
+    mnesia:create_schema([node(), SlaveNodeName]),
+    %% start
+    ok = syn:start(),
+    ok = rpc:call(SlaveNodeName, syn, start, []),
+    %% check table exists on local
+    true = lists:member(syn_processes_table, mnesia:system_info(tables)),
+    %% check table exists on remote
+    SlaveNodeMnesiaSystemInfo = rpc:call(SlaveNodeName, mnesia, system_info, [tables]),
+    true = rpc:call(SlaveNodeName, lists, member, [syn_processes_table, SlaveNodeMnesiaSystemInfo]).
+
 %% ===================================================================
 %% ===================================================================
 %% Internal
 %% Internal
 %% ===================================================================
 %% ===================================================================
@@ -145,3 +235,12 @@ clean_after_test() ->
     mnesia:delete_schema([node()]),
     mnesia:delete_schema([node()]),
     %% stop syn
     %% stop syn
     syn:stop().
     syn:stop().
+
+clean_after_test(SlaveNodeName) ->
+    clean_after_test(),
+    %% stop mnesia
+    rpc:call(SlaveNodeName, mnesia, stop, []),
+    %% delete schema
+    rpc:call(SlaveNodeName, mnesia, delete_schema, [SlaveNodeName]),
+    %% stop syn
+    rpc:call(SlaveNodeName, syn, stop, []).

+ 21 - 0
test/syn_test_suite_helper.erl

@@ -0,0 +1,21 @@
+-module(syn_test_suite_helper).
+
+%% API
+-export([start_slave/1, stop_slave/1]).
+
+
+%% ===================================================================
+%% API
+%% ===================================================================
+start_slave(NodeShortName) ->
+    EbinFilePath = filename:join([filename:dirname(code:lib_dir(syn, ebin)), "ebin"]),
+    %% start slave
+    {ok, NodeName} = ct_slave:start(NodeShortName, [
+        {boot_timeout, 10},
+        {monitor_master, true},
+        {erl_flags, string:concat("-pa ", EbinFilePath)}
+    ]),
+    {ok, NodeName}.
+
+stop_slave(NodeName) ->
+    ct_slave:stop(NodeName).