Skip to content

Commit

Permalink
dialyze app and cached backend, fixed mcd api
Browse files Browse the repository at this point in the history
  • Loading branch information
uprial committed Oct 21, 2013
1 parent 4f64cd1 commit ce9eea6
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 33 deletions.
2 changes: 1 addition & 1 deletion rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
{mod_gen, "0.1.*",
{git, "[email protected]:EchoTeam/mod_gen.git", {tag, "v0.1.0"}}},
{riakc_cluster, "1.1.*",
{git, "[email protected]:EchoTeam/riakc_cluster.git", {tag, "v1.1.5"}}},
{git, "[email protected]:EchoTeam/riakc_cluster.git", {tag, "v1.1.6"}}},
{test_utils, ".*",
{git, "[email protected]:EchoTeam/test_utils.git", {branch, "master"}}}
]}.
Expand Down
2 changes: 1 addition & 1 deletion src/kvdbc.app.src
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{application, kvdbc,
[
{description, "Key-value database client"},
{vsn, "0.1.0"},
{vsn, "0.1.3"},
{registered, []},
{applications, [
kernel,
Expand Down
35 changes: 16 additions & 19 deletions src/kvdbc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -18,60 +18,55 @@
list_keys/2
]).

-include_lib("riakc_cluster/include/riakc_cluster_types.hrl").

-define(DEFAULT_BACKEND_INSTANCE, default).

-spec put(Table::binary(), Key::term(), Value::term()) ->
ok | {error, term()}.
-spec put(Table :: table(), Key :: key(), Value :: value()) -> error() | 'ok'.
put(Table, Key, Value) ->
put(?DEFAULT_BACKEND_INSTANCE, Table, Key, Value).

-spec put(BackendName::atom(), Table::binary(), Key::term(), Value::term()) ->
ok | {error, term()}.
-spec put(BackendName :: atom(), Table :: table(), Key :: key(), Value :: value()) -> error() | 'ok'.
put(BackendName, Table, Key, Value) ->
ProcessName = process_name(BackendName),
Mod = module_name(BackendName),
Mod:put(BackendName, ProcessName, Table, Key, Value).

-spec get(Table::binary(), Key::term()) ->
{ok, term()} | {error, term()}.
-spec get(Table :: table(), Key :: key()) -> error() | {'ok', value()}.
get(Table, Key) ->
get(?DEFAULT_BACKEND_INSTANCE, Table, Key).

-spec get(BackendName::atom(), Table::binary(), Key::term()) ->
{ok, term()} | {error, term()}.
-spec get(BackendName :: atom(), Table :: table(), Key :: key()) -> error() | {'ok', value()}.
get(BackendName, Table, Key) ->
ProcessName = process_name(BackendName),
Mod = module_name(BackendName),
Mod:get(BackendName, ProcessName, Table, Key).

-spec delete(Table::binary(), Key::term()) ->
ok | {error, term()}.
-spec delete(Table :: table(), Key :: key()) -> error() | 'ok'.
delete(Table, Key) ->
delete(?DEFAULT_BACKEND_INSTANCE, Table, Key).

-spec delete(BackendName::atom(), Table::binary(), Key::term()) ->
ok | {error, term()}.
-spec delete(BackendName :: atom(), Table :: table(), Key :: key()) -> error() | 'ok'.
delete(BackendName, Table, Key) ->
ProcessName = process_name(BackendName),
Mod = module_name(BackendName),
Mod:delete(BackendName, ProcessName, Table, Key).

-spec list_keys(Table::binary()) -> {ok, [binary()]} | {error, term()}.
list_keys(Table) -> list_keys(?DEFAULT_BACKEND_INSTANCE, Table).
-spec list_keys(Table :: table()) -> error() | {'ok', [key()]}.
list_keys(Table) ->
list_keys(?DEFAULT_BACKEND_INSTANCE, Table).

-spec list_keys(BackendName::atom(), Table::binary()) ->
{ok, [binary()]} | {error, term()}.
-spec list_keys(BackendName :: atom(), Table :: table()) -> error() | {'ok', [key()]}.
list_keys(BackendName, Table) ->
ProcessName = process_name(BackendName),
Mod = module_name(BackendName),
Mod:list_keys(BackendName, ProcessName, Table).

-spec list_buckets() -> {ok, [binary()]} | {error, term()}.
-spec list_buckets() -> error() | {'ok', [table()]}.
list_buckets() ->
list_buckets(?DEFAULT_BACKEND_INSTANCE).

-spec list_buckets(BackendName::atom()) ->
{ok, [binary()]} | {error, term()}.
-spec list_buckets(BackendName :: atom()) -> error() | {'ok', [table()]}.
list_buckets(BackendName) ->
ProcessName = process_name(BackendName),
Mod = module_name(BackendName),
Expand All @@ -81,8 +76,10 @@ list_buckets(BackendName) ->
% Internal functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

-spec process_name(BackendName :: atom()) -> cluster_name().
process_name(BackendName) ->
kvdbc_cfg:backend_val(BackendName, process_name).

-spec module_name(BackendName :: atom()) -> atom().
module_name(BackendName) ->
kvdbc_cfg:backend_val(BackendName, callback_module).
22 changes: 19 additions & 3 deletions src/kvdbc_cached_backend.erl
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,18 @@
list_keys/3
]).

-include_lib("riakc_cluster/include/riakc_cluster_types.hrl").

-type mcdkey() :: {atom(), cluster_name(), table(), key()}.
-type mcd_answer() :: {'error', term()} | {'ok', term()}.

-define(CACHE_KEY_EXPIRATION, 2*60). % 2 min

start_link(BackendName, ProcessName) ->
Mod = module_name(BackendName),
Mod:start_link(BackendName, ProcessName).

-spec put(BackendName :: atom(), ProcessName :: cluster_name(), Table :: table(), Key :: key(), Value :: value()) -> error() | 'ok'.
put(BackendName, ProcessName, Table, Key, Value) ->
count(ProcessName, put),
Mod = module_name(BackendName),
Expand All @@ -34,6 +40,7 @@ put(BackendName, ProcessName, Table, Key, Value) ->
end,
PutResponse.

-spec get(BackendName :: atom(), ProcessName :: cluster_name(), Table :: table(), Key :: key()) -> error() | {'ok', value()}.
get(BackendName, ProcessName, Table, Key) ->
MCDKey = mcd_key(ProcessName, Table, Key),
case get_cached_value(BackendName, MCDKey) of
Expand All @@ -51,6 +58,7 @@ get(BackendName, ProcessName, Table, Key) ->
GetResponse
end.

-spec delete(BackendName :: atom(), ProcessName :: cluster_name(), Table :: table(), Key :: key()) -> error() | 'ok'.
delete(BackendName, ProcessName, Table, Key) ->
count(ProcessName, delete),
Mod = module_name(BackendName),
Expand All @@ -61,10 +69,12 @@ delete(BackendName, ProcessName, Table, Key) ->
end,
DelResponse. %% We return result of riak del opration in any case

-spec list_keys(BackendName :: atom(), ProcessName :: cluster_name(), Table :: table()) -> error() | {'ok', [key()]}.
list_keys(BackendName, ProcessName, Table) ->
Mod = module_name(BackendName),
Mod:list_keys(BackendName, ProcessName, Table).

-spec list_buckets(BackendName :: atom(), ProcessName :: cluster_name()) -> error() | {'ok', [table()]}.
list_buckets(BackendName, ProcessName) ->
Mod = module_name(BackendName),
Mod:list_buckets(BackendName, ProcessName).
Expand All @@ -73,28 +83,34 @@ list_buckets(BackendName, ProcessName) ->
% Internal functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

-spec module_name(BackendName :: atom()) -> atom().
module_name(BackendName) ->
Config = kvdbc_cfg:backend_val(BackendName, config),
proplists:get_value(wrapped_backend_module, Config).

-spec cache_module(BackendName :: atom()) -> atom().
cache_module(BackendName) ->
Config = kvdbc_cfg:backend_val(BackendName, config),
proplists:get_value(cache_module, Config).

-spec mcd_key(ProcName :: cluster_name(), Table :: table(), Key :: key()) -> mcdkey().
mcd_key(ProcName, Table, Key) ->
{?MODULE, ProcName, Table, Key}.

-spec get_cached_value(BackendName :: atom(), MCDKey :: mcdkey()) -> mcd_answer().
get_cached_value(BackendName, MCDKey) ->
{Mod, ServerRef} = cache_module(BackendName),
Mod:do(ServerRef, get, MCDKey).
Mod:get(ServerRef, MCDKey).

-spec set_cached_value(BackendName :: atom(), MCDKey :: mcdkey(), Value :: value()) -> mcd_answer().
set_cached_value(BackendName, MCDKey, Value) ->
{Mod, ServerRef} = cache_module(BackendName),
Mod:do(ServerRef, {set, 0, ?CACHE_KEY_EXPIRATION}, MCDKey, Value).
Mod:set(ServerRef, MCDKey, Value, ?CACHE_KEY_EXPIRATION).

-spec delete_cached_value(BackendName :: atom(), MCDKey :: mcdkey()) -> mcd_answer().
delete_cached_value(BackendName, MCDKey) ->
{Mod, ServerRef} = cache_module(BackendName),
Mod:do(ServerRef, delete, MCDKey).
Mod:delete(ServerRef, MCDKey).

count(ProcessName, Op) ->
case kvdbc_cfg:metrics_module() of
Expand Down
20 changes: 11 additions & 9 deletions test/memcached_mock.erl
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
%%% vim: set ts=4 sts=4 sw=4 et:
-module(memcached_mock).
-export([
do/3,
do/4
get/2,
delete/2,
set/4
]).

do(_, get, Key) ->
case get(Key) of
undefined -> {error, notfound};
V -> {ok, V}
end;
do(_, delete, Key) -> erase(Key).
do(_, {set, _, _}, Key, Val) -> put(Key, Val).
get(_, Key) ->
case get(Key) of
undefined -> {error, notfound};
V -> {ok, V}
end.
delete(_, Key) -> erase(Key).
set(_, Key, Val, _) -> put(Key, Val).

0 comments on commit ce9eea6

Please sign in to comment.