1: %%
    2: %% %CopyrightBegin%
    3: %% 
    4: %% Copyright Ericsson AB 1996-2013. All Rights Reserved.
    5: %% 
    6: %% The contents of this file are subject to the Erlang Public License,
    7: %% Version 1.1, (the "License"); you may not use this file except in
    8: %% compliance with the License. You should have received a copy of the
    9: %% Erlang Public License along with this software. If not, it can be
   10: %% retrieved online at http://www.erlang.org/.
   11: %% 
   12: %% Software distributed under the License is distributed on an "AS IS"
   13: %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
   14: %% the License for the specific language governing rights and limitations
   15: %% under the License.
   16: %% 
   17: %% %CopyrightEnd%
   18: %%
   19: 
   20: %%
   21: -module(mnesia_measure_test).
   22: -author('hakan@erix.ericsson.se').
   23: -compile([export_all]).
   24: 
   25: -include("mnesia_test_lib.hrl").
   26: 
   27: init_per_testcase(Func, Conf) ->
   28:     mnesia_test_lib:init_per_testcase(Func, Conf).
   29: 
   30: end_per_testcase(Func, Conf) ->
   31:     mnesia_test_lib:end_per_testcase(Func, Conf).
   32: 
   33: -define(init(N, Config),
   34: 	mnesia_test_lib:prepare_test_case([{init_test_case, [mnesia]},
   35: 					   delete_schema],
   36: 					  N, Config, ?FILE, ?LINE)).
   37: 
   38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   39: 
   40: all() -> 
   41:     [{group, prediction}, {group, consumption},
   42:      {group, scalability}, {group, benchmarks}].
   43: 
   44: groups() -> 
   45:     [{prediction, [],
   46:       [reader_disturbed_by_node_down,
   47:        writer_disturbed_by_node_down,
   48:        reader_disturbed_by_node_up,
   49:        writer_disturbed_by_node_up,
   50:        reader_disturbed_by_schema_ops,
   51:        writer_disturbed_by_schema_ops,
   52:        reader_disturbed_by_checkpoint,
   53:        writer_disturbed_by_checkpoint,
   54:        reader_disturbed_by_dump_log,
   55:        writer_disturbed_by_dump_log,
   56:        reader_disturbed_by_backup, writer_disturbed_by_backup,
   57:        reader_disturbed_by_restore,
   58:        writer_disturbed_by_restore, {group, fairness}]},
   59:      {fairness, [],
   60:       [reader_competing_with_reader,
   61:        reader_competing_with_writer,
   62:        writer_competing_with_reader,
   63:        writer_competing_with_writer]},
   64:      {consumption, [],
   65:       [measure_resource_consumption,
   66:        determine_resource_leakage]},
   67:      {scalability, [],
   68:       [determine_system_limits, performance_at_min_config,
   69:        performance_at_max_config, performance_at_full_load,
   70:        resource_consumption_at_min_config,
   71:        resource_consumption_at_max_config,
   72:        resource_consumption_at_full_load]},
   73:      {benchmarks, [],
   74:       [{group, meter}, cost, dbn_meters,
   75:        measure_all_api_functions, {group, tpcb}]},
   76:      {tpcb, [], [ram_tpcb, disc_tpcb, disc_only_tpcb]},
   77:      {meter, [], [ram_meter, disc_meter, disc_only_meter]}].
   78: 
   79: init_per_group(_GroupName, Config) ->
   80:     Config.
   81: 
   82: end_per_group(_GroupName, Config) ->
   83:     Config.
   84: 
   85:      
   86: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   87: 
   88: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   89: 
   90: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   91: 
   92: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   93: 
   94: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   95: 
   96: dbn_meters(suite) -> [];
   97: dbn_meters(Config) when is_list(Config) ->
   98:     _Nodes = ?init(3, Config),
   99:     ?match(ok, mnesia_dbn_meters:start()),
  100:     ok.
  101: 
  102: 
  103: tpcb(ReplicaType, Config) ->
  104:     HarakiriDelay = {tc_timeout, timer:minutes(20)},
  105:     Nodes = ?acquire_nodes(2, Config ++ [HarakiriDelay]),
  106:     Args = [{n_branches, 2},
  107: 	    {n_drivers_per_node, 1},
  108: 	    {replica_nodes, Nodes},
  109: 	    {driver_nodes, [hd(Nodes)]},
  110: 	    {use_running_mnesia, true},
  111: 	    {use_sticky_locks, true},
  112: 	    {replica_type, ReplicaType}],
  113:     ?match({ok, _}, mnesia_tpcb:start(Args)),
  114:     ?verify_mnesia(Nodes, []).
  115: 
  116: ram_tpcb(suite) -> [];
  117: ram_tpcb(Config) when is_list(Config) ->
  118:     tpcb(ram_copies, Config).
  119: 
  120: disc_tpcb(suite) -> [];
  121: disc_tpcb(Config) when is_list(Config) ->
  122:     tpcb(disc_copies, Config).
  123: 
  124: disc_only_tpcb(suite) -> [];
  125: disc_only_tpcb(Config) when is_list(Config) ->
  126:     tpcb(disc_only_copies, Config).
  127: 
  128: 
  129: ram_meter(suite) -> [];
  130: ram_meter(Config) when is_list(Config) ->
  131:     HarakiriDelay = [{tc_timeout, timer:minutes(20)}],
  132:     Nodes = ?init(3, Config ++ HarakiriDelay),
  133:     ?match(ok, mnesia_meter:go(ram_copies, Nodes)).
  134: 
  135: disc_meter(suite) -> [];
  136: disc_meter(Config) when is_list(Config) ->
  137:     HarakiriDelay = [{tc_timeout, timer:minutes(20)}],
  138:     Nodes = ?init(3, Config ++ HarakiriDelay),
  139:     ?match(ok, mnesia_meter:go(disc_copies, Nodes)).
  140: 
  141: disc_only_meter(suite) -> [];
  142: disc_only_meter(Config) when is_list(Config) ->
  143:     HarakiriDelay = [{tc_timeout, timer:minutes(20)}],
  144:     Nodes = ?init(3, Config ++ HarakiriDelay),
  145:     ?match(ok, mnesia_meter:go(disc_only_copies, Nodes)).
  146: 
  147: cost(suite) -> [];
  148: cost(Config) when is_list(Config) ->
  149:     Nodes = ?init(3, Config),
  150:     ?match(ok, mnesia_cost:go(Nodes)),
  151:     file:delete("MNESIA_COST").