Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149933
  • 博文数量: 92
  • 博客积分: 2035
  • 博客等级: 大尉
  • 技术积分: 874
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-10 09:03
文章分类

全部博文(92)

文章存档

2010年(38)

2009年(54)

我的朋友

分类:

2009-12-07 16:37:24

看看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) |
给主人留下些什么吧!~~