basic key get/put

This commit is contained in:
wires 2025-04-04 11:03:13 -04:00
parent 281938a05d
commit 155c24a535
Signed by: wires
SSH key fingerprint: SHA256:9GtP+M3O2IivPDlw1UY872UPUuJH2gI0yG6ExBxaaiM

View file

@ -4,7 +4,8 @@
-export([ -export([
start_link/0, start_link/0,
get_vnode/1 get_local/2,
put_local/3
]). ]).
%%% gen_server callbacks %%% gen_server callbacks
@ -19,8 +20,13 @@
start_link() -> start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
get_vnode(Index) -> -spec get_local(Index :: non_neg_integer(), Key :: term()) -> {ok, Value :: term()} | none.
gen_server:call(?MODULE, {get_vnode, Index}). 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 %%% gen_server callbacks
@ -28,17 +34,23 @@ get_vnode(Index) ->
init([]) -> init([]) ->
{ok, #kv_vnode_manager{table = ets:new(?MODULE, [set])}}. {ok, #kv_vnode_manager{table = ets:new(?MODULE, [set])}}.
handle_call({get_vnode, Index}, _From, State) -> handle_call({get, Index, Key}, _From, State) ->
Table = State#kv_vnode_manager.table, VNode = get_vnode(Index, State),
Reply = {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
get_vnode(Index, #kv_vnode_manager{table = Table}) ->
case ets:lookup(Table, Index) of case ets:lookup(Table, Index) of
[{_, Pid}] -> [{_, Pid}] ->
{ok, Pid}; Pid;
[] -> [] ->
{ok, Pid} = kv_vnode_sup:start_vnode(Index), {ok, Pid} = kv_vnode_sup:start_vnode(Index),
ets:insert(Table, {Index, Pid}), ets:insert(Table, {Index, Pid}),
{ok, Pid} Pid
end, end.
{reply, Reply, State}.
handle_cast(_, _) -> error(not_implemented).