看看rabbit.erl 的start/2
主要是使用 lists:foreach()启动各个子服务,使用这个函数
fun ({Msg, Thunk}) ->
io:format("starting ~-20s ...", [Msg]),
Thunk(),
io:format("done~n");
逐个启动 database,core processes, recovery,persister,guid generator,builtin applications,Tcp listeners,SSL listeners
逐个看每个模块的启动函数database,
参考:Mnesia中文文档
database启动参数:
{"database",
fun () -> ok = rabbit_mnesia:init() end},
{"core processes",
rabbit_mnesia:init():
init() ->
ok = ensure_mnesia_running(),
ok = ensure_mnesia_dir(),
ok = init_db(read_cluster_nodes_config()),
ok = wait_for_tables(),
ok.
init_db(read_cluster_nodes_config()),
init_db(ClusterNodes) ->
case mnesia:change_config(extra_db_nodes, ClusterNodes -- [node()]) of %% 列表操作!!
{ok, []} -> %%初始化本地节点,没有cluster;
case mnesia:system_info(use_dir) of
true ->
case check_schema_integrity() of
ok ->
ok;
{error, Reason} ->
%% NB: we cannot use rabbit_log here since
%% it may not have been started yet
error_logger:warning_msg(
"schema integrity check failed: ~p~n"
"moving database to backup location "
"and recreating schema from scratch~n",
[Reason]),
ok = move_db(),
ok = create_schema()
end;
false ->
ok = create_schema()
end;
{ok, [_|_]} ->%%有集群的情况下本地表达初始化(表只是在上一个情况初始一次{ok, []},后面的节点网络复制就可以了)%%
IsDiskNode = ClusterNodes == [] orelse
lists:member(node(), ClusterNodes),%%ClusterNodes == []和lists:member(node(), ClusterNodes) 都为false时 才为false%%
ok = wait_for_replicated_tables(),
ok = create_local_table_copy(schema, disc_copies),
ok = create_local_table_copies(case IsDiskNode of
true -> disc;
false -> ram
end);
{error, Reason} ->
%% one reason we may end up here is if we try to join
%% nodes together that are currently running standalone or
%% are members of a different cluster
throw({error, {unable_to_join_cluster,
ClusterNodes, Reason}})
end.
ClusterNodes -- [node()] 列表操作 减去一个元素
create_local_table_copies(Type) ->
lists:foreach(
fun({Tab, TabDef}) ->
HasDiscCopies = table_has_copy_type(TabDef, disc_copies),
HasDiscOnlyCopies = table_has_copy_type(TabDef, disc_only_copies),
LocalTab = proplists:get_bool(local_content, TabDef),
StorageType = %%获取存储类型%%
if
Type =:= disc orelse LocalTab -> %%等价(Type =:= disc) orelse LocalTab
if
HasDiscCopies -> disc_copies;
HasDiscOnlyCopies -> disc_only_copies;
true -> ram_copies
end;
Type =:= ram ->
ram_copies
end,
ok = create_local_table_copy(Tab, StorageType)
end,
table_definitions()),
ok.
core processes, 见下一节
recovery,
persister,
guid generator,
builtin applications,
Tcp listeners,
SSL listeners
阅读(1094) | 评论(0) | 转发(0) |