From 155c24a53528432b4fe8510df24b604d06b0f578 Mon Sep 17 00:00:00 2001 From: wires Date: Fri, 4 Apr 2025 11:03:13 -0400 Subject: [PATCH] basic key get/put --- apps/kv/src/kv_vnode_manager.erl | 44 ++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/apps/kv/src/kv_vnode_manager.erl b/apps/kv/src/kv_vnode_manager.erl index 1c6c847..58cbfcd 100644 --- a/apps/kv/src/kv_vnode_manager.erl +++ b/apps/kv/src/kv_vnode_manager.erl @@ -4,7 +4,8 @@ -export([ start_link/0, - get_vnode/1 + get_local/2, + put_local/3 ]). %%% gen_server callbacks @@ -19,8 +20,13 @@ start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). -get_vnode(Index) -> - gen_server:call(?MODULE, {get_vnode, Index}). +-spec get_local(Index :: non_neg_integer(), Key :: term()) -> {ok, Value :: term()} | none. +get_local(Index, Key) -> + gen_server:call(?MODULE, {get, Index, Key}). + +-spec put_local(Index :: non_neg_integer(), Key :: term(), Value :: term()) -> ok. +put_local(Index, Key, Value) -> + gen_server:cast(?MODULE, {put, Index, Key, Value}). %%% gen_server callbacks @@ -28,17 +34,23 @@ get_vnode(Index) -> init([]) -> {ok, #kv_vnode_manager{table = ets:new(?MODULE, [set])}}. -handle_call({get_vnode, Index}, _From, State) -> - Table = State#kv_vnode_manager.table, - Reply = - case ets:lookup(Table, Index) of - [{_, Pid}] -> - {ok, Pid}; - [] -> - {ok, Pid} = kv_vnode_sup:start_vnode(Index), - ets:insert(Table, {Index, Pid}), - {ok, Pid} - end, - {reply, Reply, State}. +handle_call({get, Index, Key}, _From, State) -> + VNode = get_vnode(Index, State), + {reply, kv_vnode:get(VNode, Key), State}. -handle_cast(_, _) -> error(not_implemented). +handle_cast({put, Index, Key, Value}, State) -> + VNode = get_vnode(Index, State), + ok = kv_vnode:put(VNode, Key, Value), + {noreply, State}. + +%%% internal functions + +get_vnode(Index, #kv_vnode_manager{table = Table}) -> + case ets:lookup(Table, Index) of + [{_, Pid}] -> + Pid; + [] -> + {ok, Pid} = kv_vnode_sup:start_vnode(Index), + ets:insert(Table, {Index, Pid}), + Pid + end.