Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(mnesia_transform_benchmark).
- %% API
- -export([start/0]).
- -export([benchmark/0]).
- %%HOW TO TEST TRANSFORM
- %%
- %% 1. Compile
- %% erlc mnesia_transform_benchmark.erl
- %%
- %% 2. Start 3 nodes
- %% 2.1. $> erl -name 'alice@127.0.0.1' -setcookie z
- %% 2.2. $> erl -name 'bob@127.0.0.1' -setcookie z
- %% 2.3. $> erl -name 'wow@127.0.0.1' -setcookie z
- %%
- %% 3. Start mnesia and import 10000 items on each node.
- %% 3.1 (alice@127.0.0.1)1> mnesia_transform_benchmark:start().
- %% 3.2 (bob@127.0.0.1)1> mnesia_transform_benchmark:start().
- %% 3.3 (wow@127.0.0.1)1> mnesia_transform_benchmark:start().
- %%
- %% 4. Run transform in one of nodes
- %% (any_node@127.0.0.1)2> mnesia_transform_benchmark:benchmark().
- %%
- %% 5. No step 5
- -record(mqtt_client, {client_id,
- node,
- pid,
- ip,
- user_id,
- user_type,
- monitor,
- online_time,
- clean_sess
- }).
- -define(CLIENT, mqtt_client).
- start() ->
- ensure_connect_node(),
- ensure_mnesia_tables(),
- create_clients(10000).
- benchmark() ->
- print_mnesia_info(before_transform),
- {Time, Result} = timer:tc(fun() -> do_transform() end),
- io:format("Cost Time:~p ms ~p ~n ", [Time/1000, Result]),
- print_mnesia_info(after_transform),
- ok.
- %% local function
- do_transform() ->
- Fun = fun({mqtt_client, ClientId, Node, Pid, Ip, UserId, UserType, Monitor, OnlineTime, CleanSess}) ->
- {mqtt_client, ClientId, Node, Pid, Ip, UserId, UserType, Monitor, OnlineTime, CleanSess, <<>>} end,
- AttrList = [client_id, node, pid, ip, user_id, user_type, monitor, online_time, clean_sess, scope_id],
- mnesia:transform_table(?CLIENT, Fun, AttrList).
- print_mnesia_info(Type) ->
- io:format("------------------------------------------------------~n~n"),
- io:format("~p mnesia:info~n", [Type]),
- mnesia:info(),
- io:format("~p table: info~n ~p~n", [Type, mnesia:table_info(mqtt_client, all)]),
- io:format("------------------------------------------------------~n~n").
- ensure_connect_node() ->
- Nodes = ['alice@127.0.0.1', 'bob@127.0.0.1', 'wow@127.0.0.1'],
- [net_kernel:connect_node(Node) || Node <- Nodes],
- ok.
- ensure_mnesia_tables() ->
- mnesia:start(),
- {ok, _} = mnesia:change_config(extra_db_nodes, nodes()),
- Attrs = record_info(fields, ?CLIENT),
- init_tables(?CLIENT, [user_id, pid, node], Attrs).
- init_tables(Table, IndexList, Attrs) ->
- ExistingTables = mnesia:system_info(tables),
- MyNode = erlang:node(),
- CopyType = ram_copies,
- case lists:member(Table, ExistingTables) of
- false ->
- {atomic,ok} = mnesia:create_table(Table, [{attributes, Attrs}, {CopyType, [MyNode]}, {index, IndexList}, {majority, true}]);
- true ->
- TableNodes = mnesia:table_info(Table, all_nodes),
- case lists:member(MyNode, TableNodes) of
- false -> mnesia:add_table_copy(Table, MyNode, CopyType);
- true -> do_nothing
- end
- end.
- create_clients(Num)when is_integer(Num) ->
- Fun =
- fun() ->
- Pid = self(),
- [begin
- Client =
- #mqtt_client{client_id = erlang:make_ref(),
- node = node(),
- pid = Pid,
- user_id = Index,
- monitor = Pid,
- online_time = erlang:localtime(),
- clean_sess = true},
- mnesia:write(Client)
- end|| Index <-lists:seq(1, Num)],
- ok
- end,
- {atomic, ok} = mnesia:transaction(Fun).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement