%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2001-2009. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% File : bench_populate.hrl %%% Author : Hakan Mattsson %%% Purpose : Populate the database %%% Created : 21 Jun 2001 by Hakan Mattsson %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -module(bench_populate). -author('hakan@cslab.ericsson.se'). -include("bench.hrl"). %% Public -export([start/1]). %% Populate the database start(C) when is_record(C, config) -> ?d("~n",[]), ?d("Populate database...~n",[]), ?d("~n",[]), create_tables(C), Populate = fun() -> populate_subscriber(write, C), populate_group(write, C), populate_server(write, C) end, mnesia:activity(sync_dirty, Populate, [], mnesia_frag). %% ------------------------------------------------------------------- %% Create the tables %% ------------------------------------------------------------------- create_tables(C) -> ?d(" Delete old tables...~n",[]), mnesia:delete_table(group), mnesia:delete_table(subscriber), mnesia:delete_table(session), mnesia:delete_table(server), mnesia:delete_table(suffix), ?d(" Creating ~p tables, with ~p replicas distributed over ~p nodes...~n", [C#config.storage_type, C#config.n_replicas, length(C#config.table_nodes)]), %% Create group table GroupDef = [{C#config.storage_type, C#config.table_nodes}, {attributes, record_info(fields, group)}], ?APPLY(mnesia, create_table, [group, GroupDef]), %% Create suffix table FragStorage = case C#config.storage_type of ram_copies -> n_ram_copies; disc_copies -> n_disc_copies; disc_only_copies -> n_disc_only_copies end, FragProps = [{FragStorage, C#config.n_replicas}, {node_pool, C#config.table_nodes}, {n_fragments, C#config.n_fragments}], SuffixDef = [{frag_properties, FragProps}], ?APPLY(mnesia, create_table, [suffix, SuffixDef]), %% Create subscriber table SubscriberDef = [{frag_properties, [{foreign_key, {suffix, #subscriber.suffix}} | FragProps]}, {attributes, record_info(fields, subscriber)}], ?APPLY(mnesia, create_table, [subscriber, SubscriberDef]), %% Create session table SessionDef = [{frag_properties, [{foreign_key, {suffix, #session.suffix}} | FragProps]}, {attributes, record_info(fields, session)}], ?APPLY(mnesia, create_table, [session, SessionDef]), %% Create server table ServerDef = [{frag_properties, [{foreign_key, {suffix, #server.suffix}} | FragProps]}, {attributes, record_info(fields, server)}], ?APPLY(mnesia, create_table, [server, ServerDef]). %% ------------------------------------------------------------------- %% Populate the subscriber table %% ------------------------------------------------------------------- populate_subscriber(Wlock, C) -> random:seed(), N = C#config.n_subscribers, ?d(" Populate ~p subscribers...", [N]), do_populate_subscriber(Wlock, N - 1, C). do_populate_subscriber(Wlock, Id, C) when Id >= 0 -> Suffix = bench_trans:number_to_suffix(Id), SubscrId = bench_trans:number_to_key(Id, C), Name = list_to_binary([random:uniform(26) + $A - 1]), GroupId = random:uniform(C#config.n_groups) - 1, Subscr = #subscriber{subscriber_number = SubscrId, subscriber_name = Name, group_id = GroupId, location = 0, active_sessions = 0, changed_by = <<"">>, changed_time = <<"">>, suffix = Suffix}, ?APPLY(mnesia, write, [subscriber, Subscr, Wlock]), do_populate_subscriber(Wlock, Id - 1, C); do_populate_subscriber(_Wlock, _, _) -> io:format(" totally ~p bytes~n", [mnesia:table_info(subscriber, memory) * 4]), ok. %% ------------------------------------------------------------------- %% Populate the group table %% ------------------------------------------------------------------- populate_group(Wlock, C) -> random:seed(), N = C#config.n_groups, ?d(" Populate ~p groups...", [N]), do_populate_group(Wlock, N - 1, C). do_populate_group(Wlock, Id, C) when Id >= 0 -> Name = list_to_binary(["-group ", integer_to_list(Id), "-"]), Allow = init_allow(C), Group = #group{group_id = Id, group_name = Name, allow_read = Allow, allow_insert = Allow, allow_delete = Allow}, ?APPLY(mnesia, write, [group, Group, Wlock]), do_populate_group(Wlock, Id - 1, C); do_populate_group(_Wlock, _, _) -> io:format(" totally ~p bytes~n", [mnesia:table_info(group, memory) * 4]), ok. init_allow(C) -> do_init_allow(0, C#config.n_servers - 1). do_init_allow(Allow, NS) when NS >= 0 -> case random:uniform(100) < (90 + 1) of true -> ServerBit = 1 bsl NS, do_init_allow(Allow bor ServerBit, NS - 1); false -> do_init_allow(Allow, NS - 1) end; do_init_allow(Allow, _) -> Allow. %% ------------------------------------------------------------------- %% Populate the server table %% ------------------------------------------------------------------- populate_server(Wlock, C) -> random:seed(), N = C#config.n_servers, ?d(" Populate ~p servers with 100 records each...", [N]), do_populate_server(Wlock, N - 1). do_populate_server(Wlock, Id) when Id >= 0 -> populate_server_suffixes(Wlock, Id, 99), do_populate_server(Wlock, Id - 1); do_populate_server(_Wlock, _) -> io:format(" totally ~p bytes~n", [mnesia:table_info(server, memory) * 4]), ok. populate_server_suffixes(Wlock, Id, Suffix) when Suffix >= 0 -> Name = list_to_binary(["-server ", integer_to_list(Id), "-"]), Server = #server{server_key = {Id, Suffix}, server_name = Name, no_of_read = 0, no_of_insert = 0, no_of_delete = 0, suffix = Suffix}, ?APPLY(mnesia, write, [server, Server, Wlock]), populate_server_suffixes(Wlock, Id, Suffix - 1); populate_server_suffixes(_Wlock, _, _) -> ok.