Move EUnit test code to test subdir
This commit is contained in:
parent
3963ce44f0
commit
feed231d5e
3 changed files with 230 additions and 207 deletions
|
@ -18,6 +18,21 @@
|
||||||
%%
|
%%
|
||||||
%% -------------------------------------------------------------------
|
%% -------------------------------------------------------------------
|
||||||
|
|
||||||
|
-type flu_name() :: atom().
|
||||||
|
-type flu() :: pid() | flu_name().
|
||||||
|
-type flu_chain() :: [flu()].
|
||||||
|
|
||||||
|
-record(range, {
|
||||||
|
pn_start :: non_neg_integer(), % start page number
|
||||||
|
pn_end :: non_neg_integer(), % end page number
|
||||||
|
chains :: [flu_chain()]
|
||||||
|
}).
|
||||||
|
|
||||||
|
-record(proj, { % Projection
|
||||||
|
epoch :: non_neg_integer(),
|
||||||
|
r :: [#range{}]
|
||||||
|
}).
|
||||||
|
|
||||||
%% 1 byte @ offset 0: 0=unwritten, 1=written, 2=trimmed, 255=corrupt? TODO
|
%% 1 byte @ offset 0: 0=unwritten, 1=written, 2=trimmed, 255=corrupt? TODO
|
||||||
%% 8 bytes @ offset 1: logical page number
|
%% 8 bytes @ offset 1: logical page number
|
||||||
%% P bytes @ offset 9: page data
|
%% P bytes @ offset 9: page data
|
||||||
|
|
|
@ -29,25 +29,9 @@
|
||||||
-include("corfurl.hrl").
|
-include("corfurl.hrl").
|
||||||
|
|
||||||
-ifdef(TEST).
|
-ifdef(TEST).
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
-type flu_name() :: atom().
|
|
||||||
-type flu() :: pid() | flu_name().
|
|
||||||
-type flu_chain() :: [flu()].
|
|
||||||
|
|
||||||
-record(range, {
|
|
||||||
pn_start :: non_neg_integer(), % start page number
|
|
||||||
pn_end :: non_neg_integer(), % end page number
|
|
||||||
chains :: [flu_chain()]
|
|
||||||
}).
|
|
||||||
|
|
||||||
-record(proj, { % Projection
|
|
||||||
epoch :: non_neg_integer(),
|
|
||||||
r :: [#range{}]
|
|
||||||
}).
|
|
||||||
|
|
||||||
append_page(Sequencer, P, Page) ->
|
append_page(Sequencer, P, Page) ->
|
||||||
append_page(Sequencer, P, Page, 1).
|
append_page(Sequencer, P, Page, 1).
|
||||||
|
|
||||||
|
@ -184,14 +168,6 @@ read_repair_chain2([RepairFLU|Rest], Epoch, LPN, Page, OriginalChain) ->
|
||||||
%% Let it crash: error_unwritten
|
%% Let it crash: error_unwritten
|
||||||
end.
|
end.
|
||||||
|
|
||||||
read_repair_trim(RepairFLU, LPN) ->
|
|
||||||
case corfurl_flu:trim(flu_pid(RepairFLU), LPN) of
|
|
||||||
ok ->
|
|
||||||
error_trimmed;
|
|
||||||
Else ->
|
|
||||||
Else
|
|
||||||
end.
|
|
||||||
|
|
||||||
scan_forward(P, LPN, MaxPages) ->
|
scan_forward(P, LPN, MaxPages) ->
|
||||||
scan_forward(P, LPN, MaxPages, ok, true, []).
|
scan_forward(P, LPN, MaxPages, ok, true, []).
|
||||||
|
|
||||||
|
@ -274,186 +250,3 @@ project_to_chain(LPN, P) ->
|
||||||
element(I, Chains)
|
element(I, Chains)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
%%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%%
|
|
||||||
|
|
||||||
-ifdef(TEST).
|
|
||||||
|
|
||||||
save_read_test() ->
|
|
||||||
Dir = "/tmp/" ++ atom_to_list(?MODULE) ++".save-read",
|
|
||||||
Chain = [a,b],
|
|
||||||
P1 = new_simple_projection(1, 1, 1*100, [Chain]),
|
|
||||||
|
|
||||||
try
|
|
||||||
filelib:ensure_dir(Dir ++ "/ignored"),
|
|
||||||
ok = save_projection(Dir, P1),
|
|
||||||
error_overwritten = save_projection(Dir, P1),
|
|
||||||
|
|
||||||
{ok, P1} = read_projection(Dir, 1),
|
|
||||||
error_unwritten = read_projection(Dir, 2),
|
|
||||||
|
|
||||||
ok
|
|
||||||
after
|
|
||||||
ok = corfurl_util:delete_dir(Dir)
|
|
||||||
end.
|
|
||||||
|
|
||||||
setup_flu_basedir() ->
|
|
||||||
"/tmp/" ++ atom_to_list(?MODULE) ++ ".".
|
|
||||||
|
|
||||||
setup_flu_dir(N) ->
|
|
||||||
setup_flu_basedir() ++ integer_to_list(N).
|
|
||||||
|
|
||||||
setup_del_all(NumFLUs) ->
|
|
||||||
[ok = corfurl_util:delete_dir(setup_flu_dir(N)) ||
|
|
||||||
N <- lists:seq(1, NumFLUs)].
|
|
||||||
|
|
||||||
setup_basic_flus(NumFLUs, PageSize, NumPages) ->
|
|
||||||
setup_del_all(NumFLUs),
|
|
||||||
[begin
|
|
||||||
element(2, corfurl_flu:start_link(setup_flu_dir(X),
|
|
||||||
PageSize, NumPages * (PageSize * ?PAGE_OVERHEAD)))
|
|
||||||
end || X <- lists:seq(1, NumFLUs)].
|
|
||||||
|
|
||||||
smoke1_test() ->
|
|
||||||
NumFLUs = 6,
|
|
||||||
PageSize = 8,
|
|
||||||
NumPages = 10,
|
|
||||||
FLUs = [F1, F2, F3, F4, F5, F6] =
|
|
||||||
setup_basic_flus(NumFLUs, PageSize, NumPages),
|
|
||||||
{ok, Seq} = corfurl_sequencer:start_link(FLUs),
|
|
||||||
|
|
||||||
%% We know that the first LPN will be 1.
|
|
||||||
LPN_Pgs = [{X, list_to_binary(
|
|
||||||
lists:flatten(io_lib:format("~8..0w", [X])))} ||
|
|
||||||
X <- lists:seq(1, 5)],
|
|
||||||
try
|
|
||||||
P1 = new_simple_projection(1, 1, 1*100, [[F1, F2, F3], [F4, F5, F6]]),
|
|
||||||
[begin {ok, LPN} = append_page(Seq, P1, Pg) end || {LPN, Pg} <- LPN_Pgs],
|
|
||||||
|
|
||||||
[begin {ok, Pg} = read_page(P1, LPN) end || {LPN, Pg} <- LPN_Pgs],
|
|
||||||
|
|
||||||
[begin
|
|
||||||
LPNplus = LPN + 1,
|
|
||||||
{ok, LPNplus, true, [{LPN, Pg}]} = scan_forward(P1, LPN, 1)
|
|
||||||
end || {LPN, Pg} <- LPN_Pgs],
|
|
||||||
{ok, 6, false, []} = scan_forward(P1, 6, 1),
|
|
||||||
{ok, 6, false, []} = scan_forward(P1, 6, 10),
|
|
||||||
[{LPN1,Pg1}, {LPN2,Pg2}, {LPN3,Pg3}, {LPN4,Pg4}, {LPN5,Pg5}] = LPN_Pgs,
|
|
||||||
{ok, 4, true, [{LPN2,Pg2}, {LPN3,Pg3}]} = scan_forward(P1, 2, 2),
|
|
||||||
{ok, 6, false, [{LPN3,Pg3}, {LPN4,Pg4}, {LPN5,Pg5}]} = scan_forward(P1, 3, 10),
|
|
||||||
|
|
||||||
%% Let's smoke read-repair: regular write failure
|
|
||||||
Epoch = P1#proj.epoch,
|
|
||||||
Pg6 = <<424242:(PageSize*8)>>,
|
|
||||||
|
|
||||||
%% Simulate a failed write to the chain.
|
|
||||||
[F6a, F6b, F6c] = Chain6 = project_to_chain(6, P1),
|
|
||||||
NotHead6 = [F6b, F6c],
|
|
||||||
ok = write_single_page_to_chain([F6a], Epoch, 6, Pg6, 1),
|
|
||||||
|
|
||||||
%% Does the chain look as expected?
|
|
||||||
{ok, Pg6} = corfurl_flu:read(flu_pid(F6a), Epoch, 6),
|
|
||||||
[error_unwritten = corfurl_flu:read(flu_pid(X), Epoch, 6) ||
|
|
||||||
X <- NotHead6],
|
|
||||||
|
|
||||||
%% Read repair should fix it.
|
|
||||||
{ok, Pg6} = read_page(P1, 6),
|
|
||||||
[{ok, Pg6} = corfurl_flu:read(flu_pid(X), Epoch, 6) || X <- Chain6],
|
|
||||||
|
|
||||||
%% Let's smoke read-repair: failed fill
|
|
||||||
[F7a, F7b, F7c] = Chain7 = project_to_chain(7, P1),
|
|
||||||
NotHead7 = [F7b, F7c],
|
|
||||||
ok = corfurl_flu:fill(flu_pid(F7a), Epoch, 7),
|
|
||||||
|
|
||||||
%% Does the chain look as expected?
|
|
||||||
error_trimmed = corfurl_flu:read(flu_pid(F7a), Epoch, 7),
|
|
||||||
[error_unwritten = corfurl_flu:read(flu_pid(X), Epoch, 7) ||
|
|
||||||
X <- NotHead7],
|
|
||||||
|
|
||||||
%% Read repair should fix it.
|
|
||||||
error_trimmed = read_page(P1, 7),
|
|
||||||
[error_trimmed = corfurl_flu:read(flu_pid(X), Epoch, 7) || X <- Chain7],
|
|
||||||
%% scan_forward shouldn't see it either
|
|
||||||
{ok, 8, false, [{6,Pg6}]} = scan_forward(P1, 6, 10),
|
|
||||||
|
|
||||||
[F8a|_] = Chain8 = project_to_chain(8, P1),
|
|
||||||
ok = corfurl_flu:fill(flu_pid(F8a), Epoch, 8),
|
|
||||||
%% No read before scan, scan_forward shouldn't see 8 either,
|
|
||||||
%% but the next seq should be 9
|
|
||||||
{ok, 9, false, [{6,Pg6}]} = scan_forward(P1, 6, 10),
|
|
||||||
|
|
||||||
ok
|
|
||||||
after
|
|
||||||
corfurl_sequencer:stop(Seq),
|
|
||||||
[corfurl_flu:stop(F) || F <- FLUs],
|
|
||||||
setup_del_all(NumFLUs)
|
|
||||||
end.
|
|
||||||
|
|
||||||
forfun_append(0, _Seq, _P, _Page) ->
|
|
||||||
ok;
|
|
||||||
forfun_append(N, Seq, P, Page) ->
|
|
||||||
ok = append_page(Seq, P, Page),
|
|
||||||
forfun_append(N - 1, Seq, P, Page).
|
|
||||||
|
|
||||||
-ifdef(TIMING_TEST).
|
|
||||||
|
|
||||||
forfun_test_() ->
|
|
||||||
{timeout, 99999, fun() ->
|
|
||||||
[forfun(Procs) || Procs <- [10,100,1000,5000]]
|
|
||||||
end}.
|
|
||||||
|
|
||||||
%%% My MBP, SSD
|
|
||||||
%%% The 1K and 5K procs shows full-mailbox-scan ickiness
|
|
||||||
%%% when getting replies from prim_file. :-(
|
|
||||||
|
|
||||||
%%% forfun: 10 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 10.016815 sec
|
|
||||||
%%% forfun: 100 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 10.547976 sec
|
|
||||||
%%% forfun: 1000 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 13.706686 sec
|
|
||||||
%%% forfun: 5000 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 33.516312 sec
|
|
||||||
|
|
||||||
%%% forfun: 10 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.350147 sec
|
|
||||||
%%% forfun: 100 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.429485 sec
|
|
||||||
%%% forfun: 1000 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.643233 sec
|
|
||||||
%%% forfun: 5000 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 15.686058 sec
|
|
||||||
|
|
||||||
%%%% forfun: 10 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 13.479458 sec
|
|
||||||
%%%% forfun: 100 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 14.752565 sec
|
|
||||||
%%%% forfun: 1000 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 25.012306 sec
|
|
||||||
%%%% forfun: 5000 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 38.972076 sec
|
|
||||||
|
|
||||||
forfun(NumProcs) ->
|
|
||||||
io:format(user, "\n", []),
|
|
||||||
NumFLUs = 4,
|
|
||||||
PageSize = 8,
|
|
||||||
%%PageSize = 4096,
|
|
||||||
NumPages = 200*1000,
|
|
||||||
PagesPerProc = NumPages div NumProcs,
|
|
||||||
FLUs = [F1, F2, F3, F4] = setup_basic_flus(NumFLUs, PageSize, NumPages),
|
|
||||||
{ok, Seq} = corfurl_sequencer:start_link(FLUs),
|
|
||||||
|
|
||||||
try
|
|
||||||
Chains = [[F1, F2], [F3, F4]],
|
|
||||||
%%Chains = [[F1], [F2], [F3], [F4]],
|
|
||||||
P = new_simple_projection(1, 1, NumPages*2, Chains),
|
|
||||||
Me = self(),
|
|
||||||
Start = now(),
|
|
||||||
Ws = [begin
|
|
||||||
Page = <<X:(PageSize*8)>>,
|
|
||||||
spawn_link(fun() ->
|
|
||||||
forfun_append(PagesPerProc, Seq, P, Page),
|
|
||||||
Me ! {done, self()}
|
|
||||||
end)
|
|
||||||
end || X <- lists:seq(1, NumProcs)],
|
|
||||||
[receive {done, W} -> ok end || W <- Ws],
|
|
||||||
End = now(),
|
|
||||||
io:format(user, "forfun: ~p procs writing ~p pages of ~p bytes/page to ~p chains of ~p total FLUs in ~p sec\n",
|
|
||||||
[NumProcs, NumPages, PageSize, length(Chains), length(lists:flatten(Chains)), timer:now_diff(End, Start) / 1000000]),
|
|
||||||
ok
|
|
||||||
after
|
|
||||||
corfurl_sequencer:stop(Seq),
|
|
||||||
[corfurl_flu:stop(F) || F <- FLUs],
|
|
||||||
setup_del_all(NumFLUs)
|
|
||||||
end.
|
|
||||||
|
|
||||||
-endif. % TIMING_TEST
|
|
||||||
|
|
||||||
-endif. % TEST
|
|
||||||
|
|
215
prototype/corfurl/test/corfurl_test.erl
Normal file
215
prototype/corfurl/test/corfurl_test.erl
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
%% -------------------------------------------------------------------
|
||||||
|
%%
|
||||||
|
%% Copyright (c) 2014 Basho Technologies, Inc. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% This file is provided to you under the Apache License,
|
||||||
|
%% Version 2.0 (the "License"); you may not use this file
|
||||||
|
%% except in compliance with the License. You may obtain
|
||||||
|
%% a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing,
|
||||||
|
%% software distributed under the License is distributed on an
|
||||||
|
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
%% KIND, either express or implied. See the License for the
|
||||||
|
%% specific language governing permissions and limitations
|
||||||
|
%% under the License.
|
||||||
|
%%
|
||||||
|
%% -------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(corfurl_test).
|
||||||
|
|
||||||
|
-include("corfurl.hrl").
|
||||||
|
|
||||||
|
-ifdef(TEST).
|
||||||
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
-compile(export_all).
|
||||||
|
-endif.
|
||||||
|
|
||||||
|
-define(M, corfurl).
|
||||||
|
|
||||||
|
%%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%% %%%%
|
||||||
|
|
||||||
|
-ifdef(TEST).
|
||||||
|
|
||||||
|
save_read_test() ->
|
||||||
|
Dir = "/tmp/" ++ atom_to_list(?MODULE) ++".save-read",
|
||||||
|
Chain = [a,b],
|
||||||
|
P1 = ?M:new_simple_projection(1, 1, 1*100, [Chain]),
|
||||||
|
|
||||||
|
try
|
||||||
|
filelib:ensure_dir(Dir ++ "/ignored"),
|
||||||
|
ok = ?M:save_projection(Dir, P1),
|
||||||
|
error_overwritten = ?M:save_projection(Dir, P1),
|
||||||
|
|
||||||
|
{ok, P1} = ?M:read_projection(Dir, 1),
|
||||||
|
error_unwritten = ?M:read_projection(Dir, 2),
|
||||||
|
|
||||||
|
ok
|
||||||
|
after
|
||||||
|
ok = corfurl_util:delete_dir(Dir)
|
||||||
|
end.
|
||||||
|
|
||||||
|
setup_flu_basedir() ->
|
||||||
|
"/tmp/" ++ atom_to_list(?MODULE) ++ ".".
|
||||||
|
|
||||||
|
setup_flu_dir(N) ->
|
||||||
|
setup_flu_basedir() ++ integer_to_list(N).
|
||||||
|
|
||||||
|
setup_del_all(NumFLUs) ->
|
||||||
|
[ok = corfurl_util:delete_dir(setup_flu_dir(N)) ||
|
||||||
|
N <- lists:seq(1, NumFLUs)].
|
||||||
|
|
||||||
|
setup_basic_flus(NumFLUs, PageSize, NumPages) ->
|
||||||
|
setup_del_all(NumFLUs),
|
||||||
|
[begin
|
||||||
|
element(2, corfurl_flu:start_link(setup_flu_dir(X),
|
||||||
|
PageSize, NumPages * (PageSize * ?PAGE_OVERHEAD)))
|
||||||
|
end || X <- lists:seq(1, NumFLUs)].
|
||||||
|
|
||||||
|
smoke1_test() ->
|
||||||
|
NumFLUs = 6,
|
||||||
|
PageSize = 8,
|
||||||
|
NumPages = 10,
|
||||||
|
FLUs = [F1, F2, F3, F4, F5, F6] =
|
||||||
|
setup_basic_flus(NumFLUs, PageSize, NumPages),
|
||||||
|
{ok, Seq} = corfurl_sequencer:start_link(FLUs),
|
||||||
|
|
||||||
|
%% We know that the first LPN will be 1.
|
||||||
|
LPN_Pgs = [{X, list_to_binary(
|
||||||
|
lists:flatten(io_lib:format("~8..0w", [X])))} ||
|
||||||
|
X <- lists:seq(1, 5)],
|
||||||
|
try
|
||||||
|
P1 = ?M:new_simple_projection(1, 1, 1*100, [[F1, F2, F3], [F4, F5, F6]]),
|
||||||
|
[begin {ok, LPN} = ?M:append_page(Seq, P1, Pg) end || {LPN, Pg} <- LPN_Pgs],
|
||||||
|
|
||||||
|
[begin {ok, Pg} = ?M:read_page(P1, LPN) end || {LPN, Pg} <- LPN_Pgs],
|
||||||
|
|
||||||
|
[begin
|
||||||
|
LPNplus = LPN + 1,
|
||||||
|
{ok, LPNplus, true, [{LPN, Pg}]} = ?M:scan_forward(P1, LPN, 1)
|
||||||
|
end || {LPN, Pg} <- LPN_Pgs],
|
||||||
|
{ok, 6, false, []} = ?M:scan_forward(P1, 6, 1),
|
||||||
|
{ok, 6, false, []} = ?M:scan_forward(P1, 6, 10),
|
||||||
|
[{LPN1,Pg1}, {LPN2,Pg2}, {LPN3,Pg3}, {LPN4,Pg4}, {LPN5,Pg5}] = LPN_Pgs,
|
||||||
|
{ok, 4, true, [{LPN2,Pg2}, {LPN3,Pg3}]} = ?M:scan_forward(P1, 2, 2),
|
||||||
|
{ok, 6, false, [{LPN3,Pg3}, {LPN4,Pg4}, {LPN5,Pg5}]} =
|
||||||
|
?M:scan_forward(P1, 3, 10),
|
||||||
|
|
||||||
|
%% Let's smoke read-repair: regular write failure
|
||||||
|
Epoch = P1#proj.epoch,
|
||||||
|
Pg6 = <<424242:(PageSize*8)>>,
|
||||||
|
|
||||||
|
%% Simulate a failed write to the chain.
|
||||||
|
[F6a, F6b, F6c] = Chain6 = ?M:project_to_chain(6, P1),
|
||||||
|
NotHead6 = [F6b, F6c],
|
||||||
|
ok = ?M:write_single_page_to_chain([F6a], Epoch, 6, Pg6, 1),
|
||||||
|
|
||||||
|
%% Does the chain look as expected?
|
||||||
|
{ok, Pg6} = corfurl_flu:read(?M:flu_pid(F6a), Epoch, 6),
|
||||||
|
[error_unwritten = corfurl_flu:read(?M:flu_pid(X), Epoch, 6) ||
|
||||||
|
X <- NotHead6],
|
||||||
|
|
||||||
|
%% Read repair should fix it.
|
||||||
|
{ok, Pg6} = ?M:read_page(P1, 6),
|
||||||
|
[{ok, Pg6} = corfurl_flu:read(?M:flu_pid(X), Epoch, 6) || X <- Chain6],
|
||||||
|
|
||||||
|
%% Let's smoke read-repair: failed fill
|
||||||
|
[F7a, F7b, F7c] = Chain7 = ?M:project_to_chain(7, P1),
|
||||||
|
NotHead7 = [F7b, F7c],
|
||||||
|
ok = corfurl_flu:fill(?M:flu_pid(F7a), Epoch, 7),
|
||||||
|
|
||||||
|
%% Does the chain look as expected?
|
||||||
|
error_trimmed = corfurl_flu:read(?M:flu_pid(F7a), Epoch, 7),
|
||||||
|
[error_unwritten = corfurl_flu:read(?M:flu_pid(X), Epoch, 7) ||
|
||||||
|
X <- NotHead7],
|
||||||
|
|
||||||
|
%% Read repair should fix it.
|
||||||
|
error_trimmed = ?M:read_page(P1, 7),
|
||||||
|
[error_trimmed = corfurl_flu:read(?M:flu_pid(X), Epoch, 7) || X <- Chain7],
|
||||||
|
%% scan_forward shouldn't see it either
|
||||||
|
{ok, 8, false, [{6,Pg6}]} = ?M:scan_forward(P1, 6, 10),
|
||||||
|
|
||||||
|
[F8a|_] = Chain8 = ?M:project_to_chain(8, P1),
|
||||||
|
ok = corfurl_flu:fill(?M:flu_pid(F8a), Epoch, 8),
|
||||||
|
%% No read before scan, scan_forward shouldn't see 8 either,
|
||||||
|
%% but the next seq should be 9
|
||||||
|
{ok, 9, false, [{6,Pg6}]} = ?M:scan_forward(P1, 6, 10),
|
||||||
|
|
||||||
|
ok
|
||||||
|
after
|
||||||
|
corfurl_sequencer:stop(Seq),
|
||||||
|
[corfurl_flu:stop(F) || F <- FLUs],
|
||||||
|
setup_del_all(NumFLUs)
|
||||||
|
end.
|
||||||
|
|
||||||
|
-ifdef(TIMING_TEST).
|
||||||
|
|
||||||
|
forfun_test_() ->
|
||||||
|
{timeout, 99999, fun() ->
|
||||||
|
[forfun(Procs) || Procs <- [10,100,1000,5000]]
|
||||||
|
end}.
|
||||||
|
|
||||||
|
forfun_append(0, _Seq, _P, _Page) ->
|
||||||
|
ok;
|
||||||
|
forfun_append(N, Seq, P, Page) ->
|
||||||
|
{ok, _} = ?M:append_page(Seq, P, Page),
|
||||||
|
forfun_append(N - 1, Seq, P, Page).
|
||||||
|
|
||||||
|
%%% My MBP, SSD
|
||||||
|
%%% The 1K and 5K procs shows full-mailbox-scan ickiness
|
||||||
|
%%% when getting replies from prim_file. :-(
|
||||||
|
|
||||||
|
%%% forfun: 10 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 10.016815 sec
|
||||||
|
%%% forfun: 100 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 10.547976 sec
|
||||||
|
%%% forfun: 1000 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 13.706686 sec
|
||||||
|
%%% forfun: 5000 procs writing 200000 pages of 8 bytes/page to 2 chains of 4 total FLUs in 33.516312 sec
|
||||||
|
|
||||||
|
%%% forfun: 10 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.350147 sec
|
||||||
|
%%% forfun: 100 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.429485 sec
|
||||||
|
%%% forfun: 1000 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 5.643233 sec
|
||||||
|
%%% forfun: 5000 procs writing 200000 pages of 8 bytes/page to 4 chains of 4 total FLUs in 15.686058 sec
|
||||||
|
|
||||||
|
%%%% forfun: 10 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 13.479458 sec
|
||||||
|
%%%% forfun: 100 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 14.752565 sec
|
||||||
|
%%%% forfun: 1000 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 25.012306 sec
|
||||||
|
%%%% forfun: 5000 procs writing 200000 pages of 4096 bytes/page to 2 chains of 4 total FLUs in 38.972076 sec
|
||||||
|
|
||||||
|
forfun(NumProcs) ->
|
||||||
|
io:format(user, "\n", []),
|
||||||
|
NumFLUs = 4,
|
||||||
|
PageSize = 8,
|
||||||
|
%%PageSize = 4096,
|
||||||
|
NumPages = 200*1000,
|
||||||
|
PagesPerProc = NumPages div NumProcs,
|
||||||
|
FLUs = [F1, F2, F3, F4] = setup_basic_flus(NumFLUs, PageSize, NumPages),
|
||||||
|
{ok, Seq} = corfurl_sequencer:start_link(FLUs),
|
||||||
|
|
||||||
|
try
|
||||||
|
Chains = [[F1, F2], [F3, F4]],
|
||||||
|
%%Chains = [[F1], [F2], [F3], [F4]],
|
||||||
|
P = ?M:new_simple_projection(1, 1, NumPages*2, Chains),
|
||||||
|
Me = self(),
|
||||||
|
Start = now(),
|
||||||
|
Ws = [begin
|
||||||
|
Page = <<X:(PageSize*8)>>,
|
||||||
|
spawn_link(fun() ->
|
||||||
|
forfun_append(PagesPerProc, Seq, P, Page),
|
||||||
|
Me ! {done, self()}
|
||||||
|
end)
|
||||||
|
end || X <- lists:seq(1, NumProcs)],
|
||||||
|
[receive {done, W} -> ok end || W <- Ws],
|
||||||
|
End = now(),
|
||||||
|
io:format(user, "forfun: ~p procs writing ~p pages of ~p bytes/page to ~p chains of ~p total FLUs in ~p sec\n",
|
||||||
|
[NumProcs, NumPages, PageSize, length(Chains), length(lists:flatten(Chains)), timer:now_diff(End, Start) / 1000000]),
|
||||||
|
ok
|
||||||
|
after
|
||||||
|
corfurl_sequencer:stop(Seq),
|
||||||
|
[corfurl_flu:stop(F) || F <- FLUs],
|
||||||
|
setup_del_all(NumFLUs)
|
||||||
|
end.
|
||||||
|
|
||||||
|
-endif. % TIMING_TEST
|
||||||
|
|
||||||
|
-endif. % TEST
|
Loading…
Reference in a new issue