summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2016-03-15 23:42:35 +0100
committerLinus Nordberg <linus@nordu.net>2016-07-12 14:41:01 +0200
commit8c48a13e1f996b5aa49497031737dee6818dc331 (patch)
treea1f92e92161b15ab0028a717f62ea54cb2aa5a14
parent34c827d599c840a5c09999a721d81115d0457d6a (diff)
Added caching of first entry not known to be present
-rw-r--r--src/frontend.erl39
-rw-r--r--src/plop_app.erl1
2 files changed, 38 insertions, 2 deletions
diff --git a/src/frontend.erl b/src/frontend.erl
index 04e307c..3dbf3af 100644
--- a/src/frontend.erl
+++ b/src/frontend.erl
@@ -5,7 +5,7 @@
-module(frontend).
%% API (URL)
--export([request/4]).
+-export([request/4, init_module/0]).
-define(APPURL_PLOP_FRONTEND, "plop/v1/frontend").
-define(APPURL_PLOP_MERGE, "plop/v1/merge").
@@ -324,9 +324,43 @@ prefetchindices(Index, []) ->
prefetchindices(_Index, PrefetchList) ->
PrefetchList.
+-define(FIRST_UNKNOWN_CACHE_TABLE, missingentries_first_unknown_cache).
+
+init_module() ->
+ create_first_unknown_cache_table().
+
+create_first_unknown_cache_table() ->
+ case ets:info(?FIRST_UNKNOWN_CACHE_TABLE) of
+ undefined ->
+ ok;
+ _ ->
+ ets:delete(?FIRST_UNKNOWN_CACHE_TABLE)
+ end,
+ ets:new(?FIRST_UNKNOWN_CACHE_TABLE, [set, public, named_table]).
+
+first_unknown_cache() ->
+ case ets:lookup(?FIRST_UNKNOWN_CACHE_TABLE, first_unknown_cache) of
+ [{_, Size}] ->
+ Size;
+ [] ->
+ 0
+ end.
+
+set_first_unknown_cache(Size) ->
+ CurrentSize = first_unknown_cache(),
+ if
+ Size == CurrentSize + 1 ->
+ true = ets:insert(?FIRST_UNKNOWN_CACHE_TABLE, {first_unknown_cache, Size});
+ true ->
+ ok
+ end,
+ ok.
+
+
-spec fetchmissingentries(non_neg_integer(), non_neg_integer()) -> [binary() | noentry].
fetchmissingentries(Index, MaxEntries) ->
- lists:reverse(fetchmissingentries(Index, [], [], MaxEntries)).
+ Index2 = lists:max([first_unknown_cache(), Index]),
+ lists:reverse(fetchmissingentries(Index2, [], [], MaxEntries)).
-spec fetchmissingentries(non_neg_integer(), [binary() | noentry], [binary()], non_neg_integer()) ->
[binary() | noentry].
@@ -343,6 +377,7 @@ fetchmissingentries(Index, Acc, PrefetchList, MaxEntries) ->
lager:debug("didn't find hash ~p", [Hash]),
fetchmissingentries(Index + 1, [Hash | Acc], PrefetchRest, MaxEntries - 1);
_ ->
+ set_first_unknown_cache(Index + 1),
fetchmissingentries(Index + 1, Acc, PrefetchRest, MaxEntries)
end
end.
diff --git a/src/plop_app.erl b/src/plop_app.erl
index 611012a..721623c 100644
--- a/src/plop_app.erl
+++ b/src/plop_app.erl
@@ -11,6 +11,7 @@ start(normal, Args) ->
plop:initsize(),
perm:init_module(),
index:init_module(),
+ frontend:init_module(),
plop_sup:start_link(Args).
stop(_State) ->