Remove unused merger
This commit is contained in:
parent
30ad1f0794
commit
1ad7bb2158
1 changed files with 0 additions and 109 deletions
|
@ -1,109 +0,0 @@
|
|||
-module(lsm_btree_merger).
|
||||
|
||||
%%
|
||||
%% Naive Merge of two b-trees. A better implementation should iterate leafs, not KV's
|
||||
%%
|
||||
|
||||
-export([merge/4]).
|
||||
|
||||
-record(state, { out, a_pid, b_pid }).
|
||||
|
||||
merge(A,B,C, Size) ->
|
||||
{ok, Out} = lsm_btree_writer:open(C, Size),
|
||||
Owner = self(),
|
||||
PID1 = spawn_link(fun() -> scan(Owner, A) end),
|
||||
PID2 = spawn_link(fun() -> scan(Owner, B) end),
|
||||
|
||||
%% "blocks" until both scans are done ...
|
||||
{ok, Count} = receive_both(undefined, undefined, #state{ out=Out, a_pid=PID1, b_pid=PID2 }, 0),
|
||||
|
||||
%% finish stream tree
|
||||
ok = lsm_btree_writer:close(Out),
|
||||
|
||||
{ok, Count}.
|
||||
|
||||
|
||||
scan(SendTo,FileName) ->
|
||||
%% yes, we need a separate file to scan it, since pread doesn't do read-ahead
|
||||
{ok, File} = lsm_btree_reader:open(FileName),
|
||||
lsm_btree_reader:fold(fun(K,V,_) ->
|
||||
SendTo ! {ok, self(), K, V}
|
||||
end,
|
||||
ok,
|
||||
File),
|
||||
lsm_btree_reader:close(File),
|
||||
SendTo ! {eod, self()},
|
||||
ok.
|
||||
|
||||
|
||||
receive_both(undefined, BVal, #state{a_pid=PID1}=State, Count) ->
|
||||
receive
|
||||
{ok, PID1, Key1, Value1} ->
|
||||
receive_both({Key1,Value1}, BVal, State, Count);
|
||||
|
||||
{eod, PID1} ->
|
||||
case BVal of
|
||||
{Key2, Value2} ->
|
||||
lsm_btree_writer:add(State#state.out, Key2, Value2),
|
||||
receive_bonly(State, Count+1);
|
||||
|
||||
undefined ->
|
||||
receive_bonly(State, Count)
|
||||
end
|
||||
end;
|
||||
|
||||
receive_both({Key1,Value1}=AValue, undefined, #state{ b_pid=PID2 }=State, Count) ->
|
||||
receive
|
||||
{ok, PID2, Key2, Value2} ->
|
||||
receive_both(AValue, {Key2,Value2}, State, Count);
|
||||
|
||||
{eod, PID2} ->
|
||||
ok = lsm_btree_writer:add(State#state.out, Key1, Value1),
|
||||
receive_aonly(State, Count+1)
|
||||
end;
|
||||
|
||||
receive_both(AValue={Key1,Value1}, BValue={Key2,Value2}, State, Count) ->
|
||||
|
||||
if Key1 < Key2 ->
|
||||
ok = lsm_btree_writer:add(State#state.out, Key1, Value1),
|
||||
receive_both(undefined, BValue, State, Count+1);
|
||||
|
||||
Key2 < Key1 ->
|
||||
ok = lsm_btree_writer:add(State#state.out, Key2, Value2),
|
||||
receive_both(AValue, undefined, State, Count+1);
|
||||
|
||||
Key1 == Key2 ->
|
||||
%% TODO: eliminate tombstones, right now they just bubble down
|
||||
ok = lsm_btree_writer:add(State#state.out, Key2, Value2),
|
||||
receive_both(undefined, undefined, State, Count+1)
|
||||
end.
|
||||
|
||||
%%
|
||||
%% Reached the end of the "B File" ... now just stream everything from A to OUT
|
||||
%%
|
||||
receive_aonly(#state{a_pid=PID1}=State, Count) ->
|
||||
receive
|
||||
{ok, PID1, Key1, Value1} ->
|
||||
ok = lsm_btree_writer:add(State#state.out,
|
||||
Key1,
|
||||
Value1),
|
||||
receive_aonly(State, Count+1);
|
||||
{eod, PID1} ->
|
||||
{ok, Count}
|
||||
end.
|
||||
|
||||
%%
|
||||
%% Reached the end of the "A File" ... now just stream everything from B to OUT
|
||||
%%
|
||||
receive_bonly(#state{b_pid=PID2}=State, Count) ->
|
||||
receive
|
||||
{ok, PID2, Key2, Value2} ->
|
||||
ok = lsm_btree_writer:add(State#state.out,
|
||||
Key2,
|
||||
Value2),
|
||||
receive_bonly(State, Count+1);
|
||||
{eod, PID2} ->
|
||||
{ok, Count}
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in a new issue