reduce messaging to vnode manager
This commit is contained in:
parent
5a6e41cab7
commit
66db32f2e7
1 changed files with 24 additions and 19 deletions
|
@ -11,9 +11,7 @@
|
|||
%%% gen_server callbacks
|
||||
-export([init/1, handle_call/3, handle_cast/2]).
|
||||
|
||||
-record(kv_vnode_manager, {table :: ets:table()}).
|
||||
|
||||
-type state() :: #kv_vnode_manager{}.
|
||||
-type state() :: {}.
|
||||
|
||||
%%% public api
|
||||
|
||||
|
@ -23,37 +21,44 @@ start_link() ->
|
|||
-spec get_local(Key :: binary()) -> {ok, Value :: term()} | none.
|
||||
get_local(Key) ->
|
||||
Index = kv_ring:key_to_index(Key),
|
||||
gen_server:call(?MODULE, {get, Index, Key}).
|
||||
VNode = get_vnode(Index),
|
||||
kv_vnode:get(VNode, Key).
|
||||
|
||||
-spec put_local(Key :: binary(), Value :: term()) -> ok.
|
||||
put_local(Key, Value) ->
|
||||
Index = kv_ring:key_to_index(Key),
|
||||
gen_server:cast(?MODULE, {put, Index, Key, Value}).
|
||||
VNode = get_vnode(Index),
|
||||
kv_vnode:put(VNode, Key, Value).
|
||||
|
||||
%%% gen_server callbacks
|
||||
|
||||
-spec init([]) -> {ok, state()}.
|
||||
init([]) ->
|
||||
{ok, #kv_vnode_manager{table = ets:new(?MODULE, [set])}}.
|
||||
?MODULE = ets:new(?MODULE, [set, protected, named_table, {read_concurrency, true}]),
|
||||
{ok, {}}.
|
||||
|
||||
handle_call({get, Index, Key}, _From, State) ->
|
||||
VNode = get_vnode(Index, State),
|
||||
{reply, kv_vnode:get(VNode, Key), State}.
|
||||
|
||||
handle_cast({put, Index, Key, Value}, State) ->
|
||||
VNode = get_vnode(Index, State),
|
||||
ok = kv_vnode:put(VNode, Key, Value),
|
||||
{noreply, State}.
|
||||
|
||||
%%% internal functions
|
||||
|
||||
-spec get_vnode(Index :: kv_ring:index(), state()) -> pid().
|
||||
get_vnode(Index, #kv_vnode_manager{table = Table}) ->
|
||||
case ets:lookup(Table, Index) of
|
||||
handle_call({get_vnode, Index}, _From, State) ->
|
||||
VNode =
|
||||
case ets:lookup(?MODULE, Index) of
|
||||
[{_, Pid}] ->
|
||||
Pid;
|
||||
[] ->
|
||||
{ok, Pid} = kv_vnode_sup:start_vnode(Index),
|
||||
ets:insert(Table, {Index, Pid}),
|
||||
ets:insert(?MODULE, {Index, Pid}),
|
||||
Pid
|
||||
end,
|
||||
{reply, VNode, State}.
|
||||
|
||||
handle_cast(_, _) ->
|
||||
error(not_implemented).
|
||||
|
||||
%%% internal functions
|
||||
|
||||
-spec get_vnode(Index :: kv_ring:index()) -> pid().
|
||||
get_vnode(Index) ->
|
||||
case ets:lookup(?MODULE, Index) of
|
||||
[{_, Pid}] ->
|
||||
Pid;
|
||||
[] ->
|
||||
gen_server:call(?MODULE, {get_vnode, Index})
|
||||
end.
|
||||
|
|
Loading…
Add table
Reference in a new issue