From 66db32f2e7f7032350b031f8b5a710a2d8dcb23a Mon Sep 17 00:00:00 2001 From: wires Date: Mon, 7 Apr 2025 11:20:18 -0400 Subject: [PATCH] reduce messaging to vnode manager --- apps/kv/src/kv_vnode_manager.erl | 43 ++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/apps/kv/src/kv_vnode_manager.erl b/apps/kv/src/kv_vnode_manager.erl index ee8f07c..8bcc42e 100644 --- a/apps/kv/src/kv_vnode_manager.erl +++ b/apps/kv/src/kv_vnode_manager.erl @@ -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_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(?MODULE, {Index, Pid}), + Pid + end, + {reply, VNode, State}. -handle_cast({put, Index, Key, Value}, State) -> - VNode = get_vnode(Index, State), - ok = kv_vnode:put(VNode, Key, Value), - {noreply, State}. +handle_cast(_, _) -> + error(not_implemented). %%% 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 +-spec get_vnode(Index :: kv_ring:index()) -> pid(). +get_vnode(Index) -> + case ets:lookup(?MODULE, Index) of [{_, Pid}] -> Pid; [] -> - {ok, Pid} = kv_vnode_sup:start_vnode(Index), - ets:insert(Table, {Index, Pid}), - Pid + gen_server:call(?MODULE, {get_vnode, Index}) end.